জাভা জন্য জেনেরিক ধরনের পরামিতি নামকরণ কনভেনশন (একাধিক অক্ষর সহ)?


124

কিছু ইন্টারফেসে আমি লিখেছিলাম কোডটি আরও পঠনযোগ্য করার জন্য আমি জেনেরিক টাইপের পরামিতিগুলির একাধিক অক্ষর দিয়ে নাম লিখতে চাই।

কিছুটা এইরকম....

Map<Key,Value>

এর পরিবর্তে...

Map<K,V>

তবে যখন এটি পদ্ধতিতে আসে, টাইপ-পরামিতিগুলি জাভা-শ্রেণীর মতো দেখায় যা বিভ্রান্তিকর।

public void put(Key key, Value value)

দেখে মনে হচ্ছে কী এবং মান ক্লাস। আমি কিছু স্বীকৃতি খুঁজে পেয়েছি বা ভেবেছি, তবে সূর্যের একটি সম্মেলন বা সাধারণ সেরা অনুশীলনের মতো কিছুই নয়।

বিকল্পগুলি আমি অনুমান করেছি বা খুঁজে পেয়েছি ...

Map<KEY,VALUE>
Map<TKey,TValue>

9
কেন আপনি একটি নতুন সম্মেলন তৈরি করতে চান?
আমির আফগানি

13
@ আমিরআফফানি প্রশ্ন থেকে: কোডটি আরও পাঠযোগ্য।
সান্টিবাইলার্স

প্রযুক্তিগতভাবে,
আইডিইতে

উত্তর:


181

ওরাকল জাভা টিউটোরিয়ালস> জেনেরিক্স> জেনেরিক প্রকারভেদে নিম্নলিখিতটি সুপারিশ করেছেন :

পরামিতি নামকরণ কনভেনশন টাইপ করুন

কনভেনশন অনুসারে, প্যারামিটারের নামগুলি একক, বড় হাতের অক্ষর। এটি ভেরিয়েবল নামকরণের বিপরীতে দাঁড়িয়েছে ইতিমধ্যে আপনি যে কনভেনশন সম্পর্কে জেনে কারণ: এই কনভেনশনটি ছাড়া কোনও ধরণের ভেরিয়েবল এবং একটি সাধারণ শ্রেণি বা ইন্টারফেসের নামের মধ্যে পার্থক্যটি বলা মুশকিল।

সর্বাধিক ব্যবহৃত ধরণের পরামিতিগুলির নাম:

  • ই - উপাদান (জাভা সংগ্রহ ফ্রেমওয়ার্ক দ্বারা ব্যাপকভাবে ব্যবহৃত)
  • কে - কী
  • এন - সংখ্যা
  • টি - টাইপ
  • ভি - মান
  • এস, ইউ, ভি ইত্যাদি - ২ য়, তৃতীয়, চতুর্থ প্রকারের

আপনি জাভা এসই এপিআই এবং এই পাঠের বাকী অংশগুলিতে ব্যবহৃত এই নামগুলি দেখতে পাবেন।

বিকাশকারী এবং সম্ভাব্য রক্ষণাবেক্ষণকারীদের মধ্যে বিভ্রান্তি এড়াতে আমি এটির সাথে লেগে থাকব।


14
নতুন স্ট্রিম ফ্রেমওয়ার্কটি Rফলাফলের Aজন্য এবং সঞ্চয়ের জন্যও ব্যবহার করে ।
ভন্ডলে

32
ব্লিচ, একক-বর্ণের নামকরণ। আমি এই সম্মেলনটি অনুসরণ করি কারণ বর্ণনামূলক নামগুলির চেয়ে কনভেনশনটি বেশি গুরুত্বপূর্ণ, তবে দুঃখজনক যে তারা যে উত্থাপন করতে পেরেছেন এটিই এটি সেরা।
ওয়ারবেকার

4
@ ওয়ারবেকার: আমি প্যারামিটারাইজড ধরণেরগুলি প্রকৃত ক্লাস থেকে আলাদা করার জন্য একটি ভাল উপায় বলে মনে করি। আপনি কিভাবে অন্যথায় জানিয়ে দেবে যদি উদাঃ Elementমধ্যে List<Element>স্থিতিমাপ কর টাইপ বা একটি বর্গ হয়?
বালুসসি

1
BiFunction<T, U, R>এই কনভেনশন অনুসরণ করে দেখে মনে হচ্ছে না । এটা যদি হয়, এটা হবে BiFunction<T, S, R>
michaelsnowden

4
প্রকৃত ক্লাস থেকে প্যারামিটারাইজড ধরণের পার্থক্য সম্পর্কে উদ্বেগ কেন? তারা হয় ক্লাস। সে যাই হোক না কেন, সেগুলি কী হিসাবে সংজ্ঞায়িত হয়েছে তা জানতে আপনাকে ফাইলের কোথাও স্ক্রোল করতে হবে। এবং এটি হয় আমদানি বা প্যারামিটারাইজড টাইপ।
ভেক্টরজহান

47

পরিশেষে Type

জাজান পৃষ্ঠাতে প্যারামিটারাইজড টাইপের নামকরণ কনভেনশনগুলিতে মন্তব্যগুলিতে একটি ভাল আলোচনা পাওয়া যাবে ।

এরউইন মুয়েলারের মন্তব্য দেখুন। তাঁর পরামর্শটি আমার কাছে নিখুঁত স্পষ্ট করে তোলে: শব্দটি যুক্ত করুনType

একটি আপেলকে একটি আপেল, একটি গাড়ীকে গাড়ি বলে। প্রশ্নে থাকা নামটি কোনও ডাটা টাইপের নাম, তাই না? ( ওওপিতে , একটি শ্রেণি মূলত একটি নতুন ডেটা টাইপ সংজ্ঞায়িত করে)) সুতরাং এটিকে একটি "প্রকার" বলুন।

মুলারের উদাহরণ, মূল পোস্টের নিবন্ধ থেকে আঁকা:

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

পরিশেষে T

একটি সদৃশ প্রশ্ন অ্যান্ডি টমাসের এই উত্তর সরবরাহ করে। গুগলের স্টাইল গাইডের সংক্ষিপ্তসারটি নোট করুন যা পরামর্শ দেয় যে কোনও একক অক্ষরে একাধিক অক্ষরের টাইপের নাম শেষ হওয়া উচিত T


3
আমি এই উত্তর পছন্দ। "প্রকার" যুক্ত করা এত পরিষ্কার এবং আপনাকে বর্ণনামূলক নাম দিতে দেয়। আমি লোকেরা অসুস্থ হয়ে বলছি, "এটি কারণ এটি কনভেনশন," কারণ অন্য কোনও যুক্তি ছাড়াই। যদি এটি একটি খারাপ সম্মেলন হয়, তবে আমাদের নতুন কোনও প্রয়োজন হবে maybe
ড্র করুন

16

একক চিঠি ব্যবহার করে অফিসিয়াল নামকরণ কনভেনশন সুপারিশ করার কারণ নিম্নলিখিত:

এই সম্মেলনটি ব্যতীত কোনও ধরণের পরিবর্তনশীল এবং একটি সাধারণ শ্রেণি বা ইন্টারফেসের নামের মধ্যে পার্থক্যটি বলা মুশকিল।

আমি মনে করি আধুনিক আইডিইগুলির সাথে কারণটি এখনকার মতো বৈধ নয়। ইন্টেলিজ আইডিয়া নিয়মিত ক্লাসের চেয়ে বিভিন্ন রঙের জেনেরিক ধরণের পরামিতি দেখায়।

জেনেরিক ধরণের কোড কোড ইন্টেলিজ আইডিয়া 2016.1 তে প্রদর্শিত হিসাবে জেনেরিক ধরণের কোড কোড ইন্টেলিজ আইডিয়া 2016.1 তে প্রদর্শিত হিসাবে

এই পার্থক্যের কারণে আমি আমার জেনেরিক প্রকারের জন্য নিয়মিত ধরণের অনুরূপ কনভেনশন সহ দীর্ঘতর বর্ণনামূলক নাম ব্যবহার করি। আমি টি বা টাইপের মতো উপসর্গ এবং প্রত্যয় যুক্ত এড়াচ্ছি কারণ আমি এগুলি অপ্রয়োজনীয় গোলমাল হিসাবে বিবেচনা করি এবং জেনেরিক ধরণের দৃশ্যত আলাদা করার প্রয়োজন নেই।

দ্রষ্টব্য: আমি যেমন এক্লিপস বা নেটবিনের ব্যবহারকারী নই, তবে তারা জানি না যে তারা একটি সিমিলিয়ার বৈশিষ্ট্য সরবরাহ করে।


আমি একই ফাইলটি পড়তে / সংশোধন করে প্রতিটি ব্যক্তি যে সরঞ্জামগুলি গ্রহণ করবে তার ধারকৃত দক্ষতার আশেপাশে নামকরণের কনভেনশনগুলি বেস করব না। আমি ব্যক্তিগতভাবে আমার কোডিং (সাব্লাইম টেক্সট) এর জন্য একটি পাঠ্য সম্পাদক ব্যবহার করতে চাই যা কোনও আইডিই নয়। পাঠ্য সম্পাদকরা সাধারণত আজকাল সিনট্যাক্স রঙিন হন, তবে অন্তর্নিহিত কোড কাঠামোর গভীর বোঝার প্রয়োজন নেই যা আমি মনে করি ভেরিয়েবলের নামগুলি সঠিকভাবে রঙ করতে হবে। এবং রঙটির উপর এই যুক্তিটি
ভিত্তিগতভাবে

1
রঙিন দৃষ্টিশক্তিযুক্ত লোকদের বিষয়ে ভাল বিষয়। আইডিই ব্যবহার না করার বিষয়ে - লোকেরা যদি সাধারণ পাঠ্য সম্পাদক ব্যবহার করা পছন্দ করে তবে এটি ঠিক আছে তবে তারা স্বল্পত্বে আরও হালকা সরঞ্জামের পক্ষে আইডিইগুলির দেওয়া বৈশিষ্ট্যগুলি স্বেচ্ছায় বলি দেয়। এটি অনুপস্থিত বৈশিষ্ট্যগুলির মধ্যে একটি হতে পারে। যদিও শেষ পর্যন্ত, যদি কোনও বর্ণের পরিবর্তে বর্ণনামূলক নাম ব্যবহার করা হয়, আপনি কোনও আইডিই ছাড়াই এবং বর্ণ কোডিং ছাড়াই নামের ভিত্তিতে অর্থ বলতে সক্ষম হবেন। রঙ কোডিং কেবল এটি দ্রুত করে তোলে।
ভোজটেক রুজিকা

16

হ্যাঁ, আপনি টাইপ ভেরিয়েবলের জন্য বহু-চরিত্রের নাম ব্যবহার করতে পারেন, যতক্ষণ না তারা শ্রেণীর নামগুলি থেকে পরিষ্কারভাবে আলাদা হয়।

এটি 2004 সালে জেনেরিকের প্রবর্তনের সাথে সনের প্রস্তাবিত সম্মেলন থেকে পৃথক। তবে:

  • একাধিক কনভেনশন বিদ্যমান।
  • মাল্টি-চরিত্রের নামগুলি জাভা সম্পর্কিত গুগলের স্টাইলের মতো অন্যান্য জাভা শৈলীর সাথে সামঞ্জস্যপূর্ণ ।
  • পঠনযোগ্য নামগুলি (আশ্চর্য!) আরও পঠনযোগ্য।

সুপাঠ্যতা

কিছু ইন্টারফেসে আমি লিখেছিলাম কোডটি আরও পঠনযোগ্য করে তুলতে আমি জেনেরিক টাইপের পরামিতিটির একাধিক অক্ষর দিয়ে নাম লিখতে চাই।

পঠনযোগ্যতা ভাল।

তুলনা করা:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

প্রতি:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

বা, গুগলের মাল্টি-ক্যারেক্টার কনভেনশন সহ:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

গুগল স্টাইল

গুগল জাভা স্টাইল গাইড পারবেন একক অক্ষর নাম এবং বহু-চরিত্র শ্রেণী-মত টি শেষ হওয়া নামের উভয়

5.2.8 পরিবর্তনশীল নাম টাইপ করুন

প্রতিটি ধরণের ভেরিয়েবলের দুটি স্টাইলের একটিতে নামকরণ করা হয়েছে:

  • একটি একক বড় হাতের অক্ষর, ঐচ্ছিকরূপে একটি একক সংখ্যা দ্বারা অনুসরণ (যেমন E, T, X, T2)

  • ক্লাস করার জন্য ব্যবহার করা আকারে একটি নাম (অনুচ্ছেদ 5.2.2 দেখুন ক্লাস নাম ), বড় হাতের অক্ষর টি (: উদাহরণ অনুসরণ RequestT, FooBarT)।

সমস্যা

"এই সম্মেলন ব্যতীত কোনও ধরণের পরিবর্তনশীল এবং একটি সাধারণ শ্রেণি বা ইন্টারফেসের নামের মধ্যে পার্থক্যটি বলা মুশকিল হবে।" - ওরাকল টিউটোরিয়ালগুলি থেকে, "জেনেরিক ধরণের"

শ্রেণীর নাম থেকে ধরণের পরামিতি আলাদা করার একমাত্র উপায় একক অক্ষরের নাম নয়, যেমন আমরা উপরে দেখেছি।

কেন শুধু জাভডোকের মধ্যে টাইপ প্যারামিটার অর্থ নথি নয়?

এটি সত্য যে @paramজাভাডক উপাদানগুলি একটি দীর্ঘ বিবরণ প্রদান করতে পারে। তবে এটিও সত্য যে জাভাডোকগুলি অগত্যা দৃশ্যমান নয়। (উদাহরণস্বরূপ, Eclipse এ সহায়তা করার জন্য একটি সামগ্রী রয়েছে যা প্যারামিটারের নামগুলি দেখায়)

মাল্টি-ক্যারেক্টার টাইপের প্যারামিটারের নামগুলি ওরাকল কনভেনশন অনুসরণ করে না!

সান এর অনেকগুলি মূল সম্মেলন জাভা প্রোগ্রামিংয়ে প্রায় সর্বজনীনভাবে অনুসরণ করা হয়।

তবে, এই বিশেষ সম্মেলনটি এমন নয়।

প্রতিযোগিতামূলক সম্মেলনের মধ্যে সেরা পছন্দটি মতের বিষয়। এক্ষেত্রে ওরাকল ব্যতীত অন্য কোন সম্মেলন বাছাইয়ের পরিণতিগুলি অপ্রয়োজনীয়। আপনি এবং আপনার টিম একটি কনভেনশন চয়ন করতে পারেন যা আপনার প্রয়োজনগুলি সবচেয়ে ভাল পূরণ করে।


15

কমপক্ষে আপনার জেনেরিক ক্লাসের ব্যবহারকারীদের একটি ক্লু দেওয়ার জন্য আপনি জাভাডোক ব্যবহার করতে পারেন। আমি এখনও এটি পছন্দ করি না (আমি @ চ্যাপার 29 এর সাথে একমত) তবে ডক্স সহায়তা দেয়।

যেমন,

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

অন্য যে জিনিসটি আমি জানতে পেরেছি তা হ'ল আমার আইডিই কনভেনশন ভাঙার ক্লাসটির রিফ্যাক্টর ব্যবহার করুন। তারপরে কোড এবং রিফেক্টরটিতে একক অক্ষরে ফিরে কাজ করুন। অনেক ধরণের প্যারামিটার ব্যবহার করা গেলে আমার পক্ষে যেকোনভাবে সহজ হয়ে যায়।


1
আমি বলব যে টাইপ পরামিতিগুলির জন্য জাভাদোকের মন্তব্যগুলি সাধারণত আবশ্যক।
মিগু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.