একটি ভাল জেনেরিক টাইপ সিস্টেম


29

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

যাইহোক, আমি যখন অন্য ভাষার দিকে নজর রাখি, তখন সত্যিই আমি এমন একটি জেনেরিক টাইপ সিস্টেম খুঁজে পাই না যা প্রোগ্রামাররা এতে খুশি।

যদি আমরা এই জাতীয় ধরণের সিস্টেমের নকশা লক্ষ্য হিসাবে নিম্নলিখিতটি নিই:

  • সর্বদা পঠনযোগ্য-সহজ প্রকারের বিবরণ উত্পন্ন করে
  • শিখতে সহজ (covariance, বৈপরীত্য ইত্যাদির উপর ব্রাশ করার প্রয়োজন নেই))
  • সংকলন-সময় ত্রুটির সংখ্যা সর্বাধিক করে

এমন কোন ভাষা আছে যে এটি সঠিকভাবে পেয়েছে? আমি যদি গুগল করি তবে কেবলমাত্র আমি দেখতে পাচ্ছি হ'ল টাইপ সিস্টেমটি ভাষা এক্সে কীভাবে সফল হয় সে সম্পর্কে অভিযোগ। জেনেরিক টাইপিংয়ের মধ্যে এই জাতীয় জটিলতা কি অন্তর্নিহিত? সংকলনের সময় 100% টাইপ সুরক্ষা যাচাই করার চেষ্টা করা আমাদের ছেড়ে দেওয়া উচিত?

আমার মূল প্রশ্নটি হল এই তিনটি লক্ষ্য সম্পর্কে শ্রদ্ধার সাথে কোন ভাষাটি "সঠিকভাবে এটি পেয়েছে"? আমি বুঝতে পারি যে এটি ব্যক্তিগত, কিন্তু এখনও পর্যন্ত আমি এমন একটি ভাষাও খুঁজে পাই না যেখানে এটির সমস্ত প্রোগ্রামাররা একমত নন যে জেনেরিক টাইপ সিস্টেমটি একটি গোলযোগ।

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


2
আপনি কি বলতে চাইছেন easy-to-read type declarations? তৃতীয় মানদণ্ডটিও দ্ব্যর্থক: উদাহরণস্বরূপ, আমি সীমা সূচকগুলি ব্যতিক্রমের বাইরে সীমাবদ্ধকরণের সময় ত্রুটিগুলিতে রূপান্তর করতে পারি যদি না আপনি সংকলন সময়ে সূচিটি অংক করতে পারি তবে আমি আপনাকে সূচী অ্যারে না দিয়ে। এছাড়াও, দ্বিতীয় মানদণ্ডটি সাব-টাইপিংয়ের বাইরে চলে। এটি অগত্যা কোনও খারাপ জিনিস নয় তবে আপনি কী জিজ্ঞাসা করছেন সে সম্পর্কে আপনার সচেতন হওয়া উচিত।
ডোভাল


9
@ জাগ্রত, এটি সম্ভবত জাভার বিপরীতে কৌতুক নয়। আমি জাভা প্রায় একচেটিয়াভাবে প্রোগ্রাম। আমার বক্তব্যটি হ'ল জাভা সম্প্রদায়ের মধ্যে এটি সাধারণত গৃহীত হয় যে জেনেরিকস ত্রুটিযুক্ত (সম্পূর্ণ ব্যর্থতা নয়, তবে সম্ভবত একটি আংশিক এক), সুতরাং তাদের কীভাবে বাস্তবায়ন করা উচিত ছিল তা জিজ্ঞাসা করা একটি যুক্তিসঙ্গত প্রশ্ন। তারা কেন অন্যায় করছে এবং অন্যরা কী তাদের সঠিক করেছে? নাকি জেনারিক পাওয়া একেবারেই ঠিক অসম্ভব?
পিটার

1
সবাই কি কেবল # সি থেকে চুরি করছিল সেখানে অভিযোগ কম থাকবে। বিশেষত জাভা অনুলিপি করে ধরার মতো অবস্থানে রয়েছে। পরিবর্তে তারা নিকৃষ্ট সমাধানের বিষয়ে সিদ্ধান্ত নেয়। জাভা ডিজাইন কমিটি এখনও যে প্রশ্নগুলি নিয়ে আলোচনা করে তাদের অনেকগুলি ইতিমধ্যে সি # তে সিদ্ধান্ত নেওয়া হয়েছে এবং প্রয়োগ করা হয়েছে। তারা এমনকি চেহারা বলে মনে হচ্ছে না।
usr ডিরেক্টরির

2
@ ইমোডেন্ড্রোকেট: আমি মনে করি সি # জেনেরিক সম্পর্কে আমার সবচেয়ে বড় দুটি অভিযোগ হ'ল "সুপার টাইপ" সীমাবদ্ধতা প্রয়োগ করার উপায় নেই (উদাঃ Foo<T> where SiameseCat:T) এবং জেনেরিক ধরণের কোনও সম্ভাবনা নেই যা রূপান্তরযোগ্য নয়Object । আইএমএইচও,। নেট মোট কাঠামোগত ধরণের যা একই ধরণের, তবে আরও বেয়ার-বোনড থেকে উপকৃত হবে। যদি KeyValuePair<TKey,TValue>এ জাতীয় ধরণ ছিল তবে IEnumerable<KeyValuePair<SiameseCat,FordFocus>>একটিতে কাস্ট করা যেতে পারে IEnumerable<KeyValuePair<Animal,Vehicle>>, তবে কেবল যদি টাইপটি বক্স করতে না পারা যায়।
সুপারক্যাট

উত্তর:


24

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

তবে, আমরা যদি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজগুলিতে এবং বিশেষত জাভাতে মনোনিবেশ করি তবে একটি আরও ভাল জেনেরিক সিস্টেম ডিজাইন করা যেতে পারে:

  1. জেনেরিক প্রকারগুলি অন্যান্য প্রকারের যেখানেই হোক না কেন গ্রহণযোগ্য। বিশেষত, যদি Tকোনও টাইপ প্যারামিটার হয় তবে নিম্নলিখিত এক্সপ্রেশনগুলির সতর্কতা ছাড়াই সংকলন করা উচিত:

    object instanceof T; 
    T t = (T) object;
    T[] array = new T[1];
    

    হ্যাঁ, ভাষাটির অন্যান্য প্রকারের মতো এর জন্যও জেনেরিকগুলি সংশোধন করা দরকার।

  2. জেনেরিক প্রকারের সহজাততা এবং বৈপরীত্যতা প্রতিটি সময় জেনেরিক ধরণের ব্যবহৃত হওয়ার পরিবর্তে এর ঘোষণাপত্রে (বা অনুমান করা) নির্দিষ্ট করা উচিত, সুতরাং আমরা লিখতে পারি

    Future<Provider<Integer>> s;
    Future<Provider<Number>> o = s; 
    

    বরং

    Future<? extends Provider<Integer>> s;
    Future<? extends Provider<? extends Number>> o = s;
    
  3. জেনেরিক প্রকারগুলি আরও দীর্ঘায়িত হতে পারে, তাই আমাদের এগুলি অপ্রয়োজনীয়ভাবে নির্দিষ্ট করার দরকার নেই। যে, আমাদের লিখতে সক্ষম হওয়া উচিত

    Map<String, Map<String, List<LanguageDesigner>>> map;
    for (var e : map.values()) {
        for (var list : e.values()) {
            for (var person : list) {
                greet(person);
            }
        }
    }
    

    বরং

    Map<String, Map<String, List<LanguageDesigner>>> map;
    for (Map<String, List<LanguageDesigner>> e : map.values()) {
        for (List<LanguageDesigner> list : e.values()) {
            for (LanguageDesigner person : list) {
                greet(person);
            }
        }
    }
    
  4. যে কোনও প্রকারকে কেবলমাত্র রেফারেন্স প্রকার নয়, প্রকারের পরামিতি হিসাবে গ্রহণযোগ্য হতে হবে। (আমরা যদি একটি int[]থাকতে পারি তবে কেন আমরা একটি রাখতে পারি না List<int>)?

এই সবগুলি সি # তে সম্ভব।


1
এটি কি স্ব-রেফারেন্টাল জেনারিকগুলি থেকে মুক্তি পাবে? যদি আমি বলতে চাই যে তুলনামূলক অবজেক্টটি একই ধরণের বা একটি সাবক্লাসের কোনও কিছুর সাথে নিজেকে তুলনা করতে পারে? তা কি করা যায়? অথবা যদি আমি একটি সারণি পদ্ধতি লিখি যা তুলনামূলক অবজেক্টগুলির সাথে তালিকাগুলি গ্রহণ করে, যা সকলকে একে অপরের সাথে তুলনীয় হওয়া দরকার। এনুম আরেকটি ভাল উদাহরণ: এনুম <ই এনুম <ই> <>> কে প্রসারিত করে। আমি বলছি না যে কোনও টাইপ সিস্টেম এগুলি করতে সক্ষম হওয়া উচিত, আমি কেবল কৌতূহল জানাই যে সি # এই পরিস্থিতিগুলি কীভাবে পরিচালনা করে।
পিটার 9

1
জাভা 7 এর জেনেরিক ধরণের অনুমিতি এবং সি ++ এর অটো এই উদ্বেগগুলির মধ্যে কয়েকটিতে সহায়তা করে তবে সিনট্যাকটিক চিনি এবং অন্তর্নিহিত প্রক্রিয়াগুলিকে পরিবর্তন করে না।

@ সোনামান জাভার ধরণের অনুমানের সত্যিকারের কিছু দুর্বোধ্য কোণ রয়েছে যদিও যেমন আপনি বেনামে ক্লাসের সাথে কাজ না করা এবং যখন আপনি জেনেরিক পদ্ধতিটিকে অন্য জেনেরিক পদ্ধতির যুক্তি হিসাবে মূল্যায়ন করেন তখন ওয়াইল্ডকার্ডের জন্য সঠিক সীমানা না খুঁজে পাওয়া।
ডোভাল

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

34

জেনেরিক প্রোগ্রামিং করার সময় সাব টাইপের ব্যবহার অনেক জটিলতা সৃষ্টি করে। আপনি যদি সাব-টাইপ সহ কোনও ভাষা ব্যবহারের জন্য জোর দিয়ে থাকেন তবে জেনেরিক প্রোগ্রামিংয়ে এটি সহ কিছুটা অন্তর্নিহিত জটিলতা রয়েছে তা আপনাকে মেনে নিতে হবে। কিছু ভাষাগুলি এটি অন্যের চেয়ে ভাল করে তবে আপনি কেবল এটি এ পর্যন্ত নিতে পারবেন।

উদাহরণস্বরূপ, হাস্কেলের জেনেরিকগুলির সাথে এর বিপরীতে করুন। তারা সহজ যথেষ্ট যে যদি আপনি টাইপ অনুমান ব্যবহার করেন, আপনি একটি সঠিক জেনেরিক ফাংশন লিখতে পারেন হয় দুর্ঘটনা । বস্তুত, যদি আপনি একটি একক প্রকার নির্ধারণ করুন, কম্পাইলার প্রায়ই নিজেই বলেছেন, "আচ্ছা, আমি ছিল এই জেনেরিক করতে যাচ্ছে, কিন্তু আপনি আমাকে এটি শুধুমাত্র ints জন্য করতে বলা, তাই যাই হোক না কেন।"

বোঝা যাচ্ছে যে নেতারা, মানুষ ব্যবহার , কিছু তার হ্যারির মত উজ্জ্বল জটিল উপায়ে Haskell, ধরন সিস্টেম এটি যে নবাগত সর্বনাশ করে, কিন্তু অন্তর্নিহিত টাইপ সিস্টেম নিজেকে মার্জিত এবং অনেক প্রশংসিত হয়।


1
এই উত্তরের জন্য ধন্যবাদ। এই নিবন্ধটি জোশুয়া ব্লচের কয়েকটি উদাহরণ দিয়ে শুরু হয়েছে যেখানে জেনেরিকগুলি খুব জটিল হয়ে ওঠে : artima.com/weblogs/viewpost.jsp?thread=222021 । জাভা এবং হাস্কেলের মধ্যে সংস্কৃতিতে এটি কি পার্থক্য, যেখানে হাস্কেলের মধ্যে এই ধরনের নির্মাতারা সূক্ষ্ম হিসাবে বিবেচিত হবে, বা হাসাকেলের টাইপ সিস্টেমে সত্যিকারের পার্থক্য রয়েছে যা এই জাতীয় পরিস্থিতি এড়িয়ে চলে?
পিটার

10
@ পিটার হাস্কেলের সাব-টাইপিং নেই, এবং কার্লের মত বলেছেন যে সংকলকটি "টাইপটি aঅবশ্যই এক ধরণের পূর্ণসংখ্যার হতে হবে " এর মতো সীমাবদ্ধতাগুলি সহ স্বয়ংক্রিয়ভাবে প্রকারগুলি নির্ধারণ করতে পারে।
ডোভাল

অন্য কথায় স্কোরিয়ার মতো ভাষায় সমবায়তা।
পল

14

প্রায় 20 বছর আগে সাবটাইপিংয়ের সাথে জেনেরিকগুলির সংমিশ্রণে বেশ গবেষণা হয়েছিল। এমআইটি-তে বারবারা লিসকোভের গবেষণা গোষ্ঠী দ্বারা বিকাশিত থোর প্রোগ্রামিং ভাষাটির "যেখানে" অনুচ্ছেদের একটি ধারণা ছিল যা আপনাকে যে ধরণের পরামিতি করছে তার প্রয়োজনীয়তা নির্দিষ্ট করতে দেয়। (এটি ধারণাগুলির সাথে সি ++ কী করার চেষ্টা করছে তার অনুরূপ ))

থোরের জেনেরিকগুলি বর্ণনা করে এবং যেভাবে তারা থোর সাব-টাইপের সাথে ইন্টারঅ্যাক্ট করে তা হ'ল ডে, এম; গ্রুবার, আর; লিসকভ, বি; ম্যাইইয়ার্স, এসি: উপশাখা বনাম যেখানে ক্লজ: স্থিতিমাপ পলিমরফিজম constraining , OBJ ওরিয়েন্টড প্রগ, সিস্টেমের, ল্যাঙ এবং অ্যাপ্লিকেশনের এসিএম কনফারেন্স (OOPSLA -10): 156-158, 1995।

আমি বিশ্বাস করি তারা পরিবর্তে, সেই কাজটি তৈরি করেছিলেন যা 1980 এর দশকের শেষের দিকে পান্নাতে হয়েছিল on (আমি সেই কাজটি পড়িনি, তবে রেফারেন্সটি হ'ল: কালো, এ; হাচিনসন, এন; জুল, ই; লেভি, এইচ; কার্টার, এল: পান্না মধ্যে ডিস্ট্রিবিউশন এবং অ্যাবস্ট্রাক্ট প্রকার , _IEEE টি সফ্টওয়্যার ইঞ্জিন।, 13 ( 1): 65-76, 1987।

থোর এবং পান্না উভয়ই "একাডেমিক ভাষা" ছিলেন তাই তারা সম্ভবত ক্লোস (ধারণাগুলি) কোন সত্যিকারের সমস্যার সমাধান করে কিনা তা বোঝার জন্য লোকেরা সম্ভবত এটি যথেষ্ট ব্যবহার করতে পারেনি। স্ট্রোভস্ট্রুপের, বি: এটা কেন সি ++ এ ধারণা প্রথম ব্যবহার করে দেখুন ব্যর্থ উপর বিয়ারনে স্ট্রোভস্ট্রুপের এর নিবন্ধ পড়তে আকর্ষণীয় দ্য সি ++ 0x "সরান ধারণা" ডিসিশন , ড Dobbs , 22 জুলাই, 2009 (আরও তথ্য স্ট্রোভস্ট্রুপের হোম পৃষ্ঠাতে । )

আরেকটি দিক যে মানুষ চেষ্টা করছে বলে মনে হচ্ছে কিছু বলা হয় বৈশিষ্ট্যগুলো । উদাহরণস্বরূপ মজিলার মরিচা প্রোগ্রামিং ভাষা বৈশিষ্ট্য ব্যবহার করে। যেহেতু আমি এটি বুঝতে পেরেছি (যা সম্পূর্ণ ভুল হতে পারে), কোনও শ্রেণি একটি বৈশিষ্ট্য সন্তুষ্ট করে তা ঘোষণা করা অনেকটা বলার মতো যে একটি শ্রেণি একটি ইন্টারফেস প্রয়োগ করে, তবে আপনি বলছেন যে "একটি" এর চেয়ে "একটি" এর মতো আচরণ করে। এটা যে অ্যাপলের নতুন সুইফট প্রোগ্রামিং ভাষার একটি অনুরূপ ধারণা ব্যবহার করছে বলে মনে হয় প্রোটোকল থেকে জেনেরিক্স করার পরামিতি উপর সীমাবদ্ধতা উল্লেখ

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