টাইপ অনুমানের জন্য ট্রেড অফ কী?


29

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

  • যখন একটি পরিবর্তনশীল প্রকাশক যান তার টাইপ উল্লেখ না করে (ক টাইপ বা ছাড়া Var ব্যবহার করছে: = সিনট্যাক্স), পরিবর্তনশীল ধরন ডান দিকে মান থেকে অনুমিত হয়।
  • ডি গতিশীল ভাষাগুলির মতো অপ্রয়োজনীয়ভাবে নির্দিষ্ট ধরণের উল্লেখ ছাড়াই বড় কোড টুকরা লেখার অনুমতি দেয়। অন্যদিকে, স্থিতিশীল অনুমিতি প্রকার এবং অন্যান্য কোড বৈশিষ্ট্যগুলি হ্রাস করে, স্থিতিশীল এবং গতিশীল উভয়েরই সেরা দেয় giving
  • টাইপ অনুমান ইঞ্জিন মরচে বেশ স্মার্ট। এটি আরম্ভের সময় আর-মানের ধরণটি দেখার চেয়ে আরও বেশি কিছু করে। এটির পরিবর্তনগুলি কীভাবে তার প্রকারটি নির্ধারণের জন্য ব্যবহৃত হয় তা এটিও দেখায়।
  • উপযুক্ত টাইপটি ব্যবহার করার জন্য সুইফট টাইপ ইনফারেন্স ব্যবহার করে। প্রকার অনুমিতি কোনও সংকলককে স্বয়ংক্রিয়ভাবে কোনও নির্দিষ্ট এক্সপ্রেশনের ধরণটি স্বয়ংক্রিয়ভাবে কমিয়ে আনতে সক্ষম করে যখন এটি আপনার কোড সংকলন করে, কেবল আপনার সরবরাহিত মানগুলি পরীক্ষা করে।

3
সি # তে, সাধারণ নির্দেশিকা সর্বদা ব্যবহার না করার জন্য বলে varকারণ এটি কখনও কখনও পাঠযোগ্যতার ক্ষতি করতে পারে।
মেফি

5
"... বা কেন জাভা বা পুরাতন ভাল ভাষাগুলিতে টাইপ ইনফারেন্স না বলা যায়" কারণগুলি সম্ভবত historicalতিহাসিক; এমপি উইকিপিডিয়া অনুসারে সি এর 1 বছর পরে হাজির হয়েছিল এবং এর টাইপ অনুমান ছিল। জাভা সি ++ বিকাশকারীদের কাছে আবেদন করার চেষ্টা করছিল । সি ++ সি এর এক্সটেনশান হিসাবে শুরু হয়েছিল এবং সি এর প্রাথমিক উদ্বেগগুলি ছিল সমাবেশের উপরে বহনযোগ্য মোড়ক এবং সংকলন করা সহজ। যার জন্য এটি মূল্যবান, আমি পড়েছি যে সাব টাইপিং সাধারণ ক্ষেত্রে সাধারণত টাইপ ইনফেরেন্সকে অনস্বীকার্য করে তোলে।
ডোভাল

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

12
টাইপ ছাড়ের মধ্যে পার্থক্য আঁকানো উপযুক্ত (মনো # নির্দেশনামূলক, সি # varএবং সি ++ এর মতো auto) এবং টাইপ ইনফারেন্স (দ্বি নির্দেশমূলক, হাস্কেলের মতো let)। পূর্ববর্তী ক্ষেত্রে, কোনও নামের প্রকারটি কেবলমাত্র তার আরম্ভকারী থেকে অনুমান করা যায় — এর ব্যবহারগুলি অবশ্যই নামের ধরণটি অনুসরণ করে। পরবর্তী ক্ষেত্রে, নামের প্রকারটি এর ব্যবহারগুলি থেকেও অনুমান করা যেতে পারে — যা দরকারী যে আপনি []খালি অনুক্রমের জন্য উপাদানটির ধরন নির্বিশেষে বা newEmptyMVarনতুন নাল পরিবর্তনীয় রেফারেন্সের জন্য নির্বিশেষে লিখতে পারবেন এতে দরকারী টাইপ করুন।
জন পুরী

প্রকার অনুকরণটি কার্যকরভাবে কার্যকর করতে অবিশ্বাস্যরকম জটিল হতে পারে। লোকেরা চায় না যে তাদের সংকলন জটিলতা আরও জটিল এক্সপ্রেশন থেকে তাত্পর্যপূর্ণ ব্লুপআপ ভোগ করবে। আকর্ষণীয় পড়ুন: cocoawithlove.com/blog/2016/07/12/type-checker-issues.html
আলেকজান্ডার - মনিকা

উত্তর:


43

হাস্কেলের টাইপ সিস্টেমটি সম্পূর্ণরূপে নিকৃষ্ট (পলিমারফিক পুনর্বিবেচনা, কিছু ভাষা বর্ধিতকরণ এবং ভয়ঙ্কর মনোমরফিজম সীমাবদ্ধতা বাদ দিয়ে ) তবুও প্রোগ্রামাররা প্রায়শই সোর্স কোডে টাইপ টিকা প্রদান করে এমনকি যখন তাদের প্রয়োজন হয় না। কেন?

  1. টাইপ টীকাগুলি ডকুমেন্টেশন হিসাবে পরিবেশন করে । এটি হাস্কেলের মতো প্রকাশের মতো ধরণের ক্ষেত্রে বিশেষত সত্য। কোনও ফাংশনের নাম এবং এর ধরণ দেওয়া আপনার সাধারণত ফাংশনটি কী করে তা সম্পর্কে খুব ভাল অনুমান করতে পারেন, বিশেষত যখন ফাংশনটি প্যারামেট্রিকভাবে পলিমারফিক হয়।
  2. প্রকারের টীকাগুলি বিকাশ চালাতে পারে । কোনও ফাংশনের বডি লেখার আগে কোনও ধরণের স্বাক্ষর লেখার মতো পরীক্ষা-চালিত বিকাশের মতো মনে হয়। আমার অভিজ্ঞতায়, আপনি একবার হাস্কেল ফাংশন সংকলন করলে এটি সাধারণত প্রথমবারের জন্য কাজ করে। (অবশ্যই, এটি স্বয়ংক্রিয় পরীক্ষার প্রয়োজনকে প্রশ্রয় দেয় না!)
  3. সুস্পষ্ট প্রকারগুলি আপনাকে আপনার অনুমানগুলি পরীক্ষা করতে সহায়তা করতে পারে । আমি যখন এমন কিছু কোড বোঝার চেষ্টা করছি যা ইতিমধ্যে কাজ করে, তখন আমি প্রায়শই সঠিক প্রকারের টীকাগুলি বলে বিশ্বাস করি এটি দিয়ে মরিচ দিচ্ছি। যদি কোডটি এখনও সংকলিত হয় আমি জানি আমি এটি বুঝতে পেরেছি। যদি এটি না হয় তবে আমি ত্রুটি বার্তাটি পড়েছি।
  4. স্বাক্ষরগুলি টাইপ করুন আপনাকে পলিমারফিক ফাংশন বিশেষ করতে দেয় । খুব মাঝেমধ্যে, যদি কোনও নির্দিষ্ট ক্রিয়াকলাপ বহিরাগত না হয় তবে একটি এপিআই আরও অভিব্যক্তিপূর্ণ বা দরকারী। সংকলক অভিযোগ করবে না যদি আপনি কোনও ফাংশনটি অনুমিত হওয়ার চেয়ে কম সাধারণ ধরণের দেন। ক্লাসিক উদাহরণটি হ'ল map :: (a -> b) -> [a] -> [b]। এর আরও সাধারণ ফর্ম ( fmap :: Functor f => (a -> b) -> f a -> f b) Functorকেবলমাত্র তালিকা নয়, সমস্ত ক্ষেত্রে প্রযোজ্য । তবে এটি অনুভূত হয়েছিল যে mapনতুনদের পক্ষে বুঝতে সহজ হবে, তাই এটি তার বড় ভাইয়ের পাশাপাশি থাকে।

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

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

* এমনকি জাভা, সেই দুর্দান্ত মাপের ছাগল, স্থানীয় পরিমাণের অনুমানের একটি নির্দিষ্ট পরিমাণ সম্পাদন করে । মত বিবৃতিতে Map<String, Integer> = new HashMap<>();, আপনাকে কনস্ট্রাক্টরের জেনেরিক ধরণের নির্দিষ্ট করতে হবে না। অন্যদিকে, এমএল স্টাইলের ভাষা সাধারণত বিশ্বব্যাপী নিকৃষ্ট হয় না।


2
তবে আপনি কোনও শিক্ষানবিশ নন;) সত্যই "পাওয়ার" আগে আপনার টাইপ ক্লাস এবং প্রকারের একটি ধারণা থাকতে হবে Functor। তালিকাগুলি রয়েছে এবং mapঅ-পাকা হাসকলারদের সাথে পরিচিত হওয়ার সম্ভাবনা বেশি রয়েছে।
বেনিয়ামিন হজসন

1
আপনি কি সি # varএর ধরণের অনুমিতির উদাহরণ হিসাবে বিবেচনা করবেন ?
বেনিয়ামিন হজসন

1
হ্যাঁ, সি # এর varযথাযথ উদাহরণ।
ডোভাল

1
সাইট ইতিমধ্যে এই আলোচনাটিকে অনেক দীর্ঘ হিসাবে পতাকাঙ্কিত করছে তাই এটি আমার শেষ জবাব হবে। পূর্বে সংকলক অবশ্যই প্রকার নির্ধারণ করতে হবে x; পরবর্তীকালে নির্ধারণের জন্য কোনও প্রকার নেই, সমস্ত প্রকারের জানা রয়েছে এবং আপনাকে কেবল এটি পরীক্ষা করতে হবে যা অভিব্যক্তিটি বোঝায়। আপনি অতীতের তুচ্ছ উদাহরণগুলি সরানোর সাথে সাথে পার্থক্যটি আরও গুরুত্বপূর্ণ হয়ে ওঠে xএবং একাধিক জায়গায় ব্যবহৃত হয়; সংকলকটি তখন অবস্থান xনির্ধারণের জন্য যে অবস্থানগুলি ব্যবহার করে সেখানে ক্রস-চেক করতে হবে) xকোডটি চেক টাইপ করবে এমন কোনও ধরণ নির্ধারণ করা কি সম্ভব ? 2) যদি এটি হয় তবে আমরা এটি নির্ধারণ করতে পারি এমন সাধারণ ধরণটি কী?
ডোভাল

1
নোট করুন যে new HashMap<>();বাক্য গঠনটি কেবল জাভা 7-এ যুক্ত হয়েছিল এবং জাভা 8-এ ল্যাম্বডাস বেশ "রিয়েল" টাইপের অনুমিতির জন্য অনুমতি দেয়।
মাইকেল বর্গওয়ার্ট

8

সি # তে, টাইপ অনুমানটি সংকলন সময়ে ঘটে, তাই রানটাইম ব্যয় শূন্য।

শৈলীর বিষয় হিসাবে, varএমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে ম্যানুয়ালি টাইপটি নির্দিষ্ট করা অসুবিধাজনক বা অপ্রয়োজনীয়। লিনক এমনই একটি পরিস্থিতি। আরেকটি হ'ল:

var s = new SomeReallyLongTypeNameWith<Several, Type, Parameters>(andFormal, parameters);

যা ব্যতীত আপনি কেবল প্রকৃতপক্ষে বলার চেয়ে আপনার প্রকৃত দীর্ঘ টাইপের নাম (এবং টাইপ পরামিতি) পুনরাবৃত্তি করবেন var

কোডের স্বচ্ছতা সুস্পষ্ট হয়ে যখন স্পষ্ট হয় তখন টাইপের আসল নামটি ব্যবহার করুন।

কিছু পরিস্থিতি রয়েছে যেখানে টাইপ অনুমান ব্যবহার করা যায় না, যেমন সদস্যের পরিবর্তনশীল ঘোষণাপত্র যার মান নির্মানের সময় নির্ধারিত হয়, বা যেখানে আপনি সত্যিকার অর্থে ইন্টিলিসেন্সটি সঠিকভাবে কাজ করতে চান (হ্যাকারঙ্কের আইডিই ভেরিয়েবলের সদস্যদের সাথে ইন্টেলিজেন্স করবে না যতক্ষণ না আপনি স্পষ্টভাবে প্রকারটি ঘোষণা করেন) ।


16
"সি # তে, টাইপ অনুমানটি সংকলন সময়ে ঘটে, তাই রানটাইম ব্যয় শূন্য" " সংজ্ঞা অনুসারে সংকলন সময়ে টাইপ অনুমান হয়, তাই প্রতিটি ভাষার ক্ষেত্রে এটিই ঘটে।
ডোভাল

তাই অনেক ভালো.
রবার্ট হার্ভে

1
@ ডাবল জেআইটি সংকলনের সময় প্রকারের অনুমান করা সম্ভব, যার স্পষ্টতই রানটাইম ব্যয় হয়।
জুলাই

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

7

ভাল প্রশ্ন!

  1. যেহেতু প্রকারটি স্পষ্টভাবে বর্ণিত হয়নি, তাই এটি সময় সময় কোডটি আরও শক্ত করে পড়তে পারে - যা আরও বেশি বাগের দিকে নিয়ে যায়। এটি অবশ্যই যথাযথভাবে ব্যবহার করা কোড ক্লিনার এবং আরও পাঠযোগ্য। আপনি যদি একটি দুঃখবাদী হন এবং মনে করেন যে, বেশির ভাগ প্রোগ্রামাররা খারাপ (বা কাজ যেখানে সবচেয়ে প্রোগ্রামারদের হন হয় খারাপ), এই একটি নেট ক্ষতি হবে।
  2. টাইপ ইনফারেন্স অ্যালগরিদম তুলনামূলকভাবে সহজ হলেও এটি নিখরচায় নয় । এই ধরণের জিনিস সামান্য সময় সঙ্কলন বৃদ্ধি।
  3. যেহেতু প্রকারটি স্পষ্টভাবে বর্ণিত নয়, আপনার আইডিই আপনি কী করতে চাইছেন তা অনুমান করতে পারে না, ঘোষণা প্রক্রিয়া চলাকালীন স্ব-পরিপূর্ণ এবং অনুরূপ সহায়কদের ক্ষতি করে।
  4. ফাংশন ওভারলোডগুলির সাথে একত্রিত হয়ে আপনি মাঝে মধ্যে এমন পরিস্থিতিতে যেতে পারেন যেখানে টাইপ ইনফারেন্স অ্যালগরিদম কোন পথটি গ্রহণ করতে পারে না তা সিদ্ধান্ত নিতে পারে না, ফলে কৃপণতা ingালাইয়ের শৈলীর টীকাগুলি বাড়ে। (উদাহরণস্বরূপ সি # এর বেনামে ফাংশন সিনট্যাক্সের সাথে এটি বেশ খানিকটা ঘটে)।

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


1
স্বতঃপূরণ টাইপ অনুমান সম্পর্কে ছিটে না। প্রকারটি কীভাবে সিদ্ধান্ত নেওয়া হয়েছিল তা নয়, কেবল টাইপটি কী type এবং সি # এর ল্যাম্বডাসের সমস্যাগুলি অনুমান সহকারে কিছুই করার নয়, এগুলি হ'ল ল্যাম্বডাস বহুবাদী হলেও টাইপ সিস্টেমটি এটি মোকাবেলা করতে পারে না which যার অনুকরণের সাথে কিছুই করার নেই।
ডেড এমজি

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

@ ডিএডএমজি - ল্যাম্বডাসের জন্য, আপনি কী বোঝাতে চেয়েছেন তা সম্পর্কে আমি পরিষ্কার নয়, তবে আমি নিশ্চিত যে জিনিসগুলি কীভাবে কাজ করে তা বোঝার উপর ভিত্তি করে এটি পুরোপুরি সঠিক নয়। এমনকি সাধারণ হিসাবে কিছু var foo = x => x;ব্যর্থ হয় কারণ ভাষা xএখানে অনুমান করা প্রয়োজন এবং এর কিছুই করার নেই। ল্যাম্বডাসগুলি Func<int, int> foo = x => xতৈরি করা হলে, সেগুলি স্পষ্টভাবে টাইপ করা প্রতিনিধিদের সিআইএল হিসাবে তৈরি করা হয় Func<int, int> foo = new Func<int, int>(x=>x);যেখানে ল্যাম্বডা একটি উত্পন্ন, স্পষ্টত টাইপ করা ফাংশন হিসাবে নির্মিত হয়। আমার কাছে, ধরণের xধরণের
অনুমিতকরণের

3
@ টেলাস্টিন এটি সত্য নয় যে ভাষার কোনও কিছুই চলবে না। এক্সপ্রেশন টাইপ করার জন্য প্রয়োজনীয় সমস্ত তথ্য x => xল্যাম্বদার ভিতরেই রয়েছে - এটি পার্শ্ববর্তী স্কোপ থেকে কোনও ভেরিয়েবল উল্লেখ করে না to কোন বিবেকী কার্মিক ভাষা সঠিকভাবে অনুমান করবে যে তার প্রকার "সব ধরনের জন্য a, a -> a"। আমি মনে করি ডেড এমএমজি যা বলার চেষ্টা করছে তা হ'ল সি # এর টাইপ সিস্টেমে প্রিন্সিপাল টাইপের সম্পত্তি নেই যার অর্থ এটি যে কোনও অভিব্যক্তির জন্য সর্বাধিক সাধারণ ধরণটি খুঁজে পাওয়া সর্বদা সম্ভব। এটি ধ্বংস করা খুব সহজ সম্পত্তি।
ডোভাল

@ দোভাল - এনহ ... সি # তে জেনেরিক ফাংশন অবজেক্টের মতো কিছুই নেই, যা আমি মনে করি যে আপনি দুজনই যে একই সমস্যার দিকে পরিচালিত করছেন তার থেকেও যে কথা বলছেন তার চেয়ে সম্পূর্ণ আলাদা।
টেলাস্টিন

4

এটি আমার কাছে দুর্দান্ত লাগছে তবে আমি ভাবছি যে কোনও ট্রেড-অফ রয়েছে কিনা বা কেন জাভা বা পুরানো ভাল ভাষাগুলিতে টাইপের অনুপাত নেই?

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

অন্তর্নিহিত টাইপিং এবং টাইপ অনুমানের অনেক ভাল ব্যবহারের কেস রয়েছে এবং এমন কিছু ব্যবহারের ক্ষেত্রেও রয়েছে যেখানে আপনার সত্যই এটি করা উচিত নয়। এটি কখনও কখনও স্বাদের বিষয়, এবং বিতর্কেরও বিষয়।

নিঃসন্দেহে যে কোনও ব্যবহারের ক্ষেত্রে নিঃসন্দেহে ভাল ব্যবহারের ঘটনা রয়েছে তা কোনও ভাষা কার্যকর করার জন্য এটি বৈধ কারণ। বৈশিষ্ট্যটি কার্যকর করা, রানটাইম পেনাল্টি নয়, এবং সংকলনের সময়টিকে উল্লেখযোগ্যভাবে প্রভাবিত করে না।

বিকাশকারীকে প্রকারের অনুমিতি ব্যবহারের সুযোগ দেওয়ার ক্ষেত্রে আমি প্রকৃত কোনও ত্রুটি দেখতে পাচ্ছি না।

কিছু উত্তরদাতা পুনরায় জবাব দেয় যে স্পষ্টভাবে টাইপিং কখনও কখনও ভাল হয়, এবং তারা অবশ্যই সঠিক right তবে অন্তর্নিহিত টাইপিং সমর্থন না করার অর্থ একটি ভাষা সর্বদা স্পষ্ট টাইপিং প্রয়োগ করে en

সুতরাং আসল প্রতিস্থাপনটি হ'ল যখন কোনও ভাষা অন্তর্নিহিত টাইপিং সমর্থন করে না , কারণ এর সাথে এটি সূচিত করে যে, বিকাশকারীকে এটি ব্যবহার করার কোনও বৈধ কারণ নেই যা সত্য নয়।


1

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

এইচএম টাইপ অনুমিতিটি একটি দুর্দান্ত উদ্ভাবন যা বহুবিজ্ঞানযুক্ত টাইপড ফাংশনাল ভাষাগুলির সাথে ভাল কাজ করে তবে গো এর লেখকরা সম্ভবত যুক্তি দিতেন যে এটি খুব বেশি করার চেষ্টা করে:

  1. তথ্য এগিয়ে এবং পিছনে উভয় প্রবাহিত হ'ল এইচএম টাইপ অনুমিতি একটি খুব অ-স্থানীয় বিষয়; প্রকারের টীকাগুলির অভাবে, আপনার প্রোগ্রামের কোডের প্রতিটি লাইন একটি একক লাইন কোড টাইপ করতে অবদান রাখতে পারে। আপনার যদি কেবল ফরওয়ার্ড প্রতিস্থাপন থাকে, আপনি জানেন যে কোনও ধরণের ত্রুটির উত্স অবশ্যই আপনার ত্রুটির পূর্বে থাকা কোডে থাকতে হবে; কোড পরে আসে না।

  2. এইচএম প্রকারের অনুমান সহ, আপনি সীমাবদ্ধতায় চিন্তাভাবনা করেন: আপনি যখন কোনও প্রকার ব্যবহার করেন, তখন এটি কী ধরণের সম্ভাব্য ধরণের হতে পারে তা সীমাবদ্ধ করেন। দিনের শেষে, কিছু ধরণের ভেরিয়েবল থাকতে পারে যা সম্পূর্ণরূপে নিয়ন্ত্রণহীন রেখে যায়। এইচএম প্রকারের অনুমানের অন্তর্দৃষ্টিটি হ'ল, সেই ধরণের প্রকৃতপক্ষে কোনও বিষয় আসে না এবং তাই সেগুলি বহুবর্ষীয় ভেরিয়েবলগুলিতে তৈরি হয়। তবে এই অতিরিক্ত বহুতল বহুবিধ কারণে অবাঞ্ছিত হতে পারে। প্রথমত, কিছু লোক যেমন উল্লেখ করেছেন, এই অতিরিক্ত বহুত্ববাদ অনাকাঙ্ক্ষিত হতে পারে: এইচএম কিছু বোগাস কোডের জন্য একটি বোগাস, বহুবৈজ্ঞানিক ধরণের সিদ্ধান্ত গ্রহণ করে এবং পরে আশ্চর্যর ত্রুটির দিকে পরিচালিত করে। দ্বিতীয়ত, যখন কোনও প্রকারটি বহুতল থেকে যায়, রানটাইম আচরণের জন্য এটির পরিণতি হতে পারে। উদাহরণস্বরূপ, একটি অত্যধিক পলিমারফিক মধ্যবর্তী ফলাফল হ'ল কারণ 'শো। পড়া 'হাস্কেলকে অস্পষ্ট মনে করা হয়; অন্য উদাহরণ হিসাবে,


2
দুর্ভাগ্যক্রমে, এটিকে অন্য প্রশ্নের ভাল উত্তর বলে মনে হচ্ছে। ওপিতে "গো-স্টাইলের টাইপ অনুমান" সম্পর্কে জিজ্ঞাসা করছে বনাম যেসব ভাষাতে কোনও প্রকারের অনুক্রমের মোটেই নেই, "গো-স্টাইল" বনাম এইচএম নয়।
Ixrec

-2

এটি পঠনযোগ্যতা ব্যথা করে।

তুলনা করা

var stuff = someComplexFunction()

বনাম

List<BusinessObject> stuff = someComplexFunction()

গিথুবের মতো আইডিইর বাইরে পড়ার সময় এটি বিশেষত সমস্যা।


4
এটি পূর্ববর্তী 6 টি উত্তরগুলিতে তৈরি এবং ব্যাখ্যা করা হয়েছে এর চেয়ে বেশি কিছু দেওয়ার প্রস্তাব বলে মনে হচ্ছে না
gnat

আপনি যদি "জটিল অপঠনযোগ্য" এর পরিবর্তে যথাযথ নাম ব্যবহার করেন, তবে varপঠনযোগ্যতার ক্ষতি না করে ব্যবহার করা যেতে পারে। var objects = GetBusinessObjects();
Fabio

ঠিক আছে তবে তারপরে আপনি টাইপ সিস্টেমটি পরিবর্তনশীল নামগুলিতে ফাঁস করছেন। এটি হানি হরফের মতো। রিফ্যাক্টরিংয়ের পরে আপনার নামগুলির সাথে শেষ হওয়ার সম্ভাবনা বেশি যা কোডের সাথে মেলে না। সাধারণভাবে, কার্যকরী শৈলী আপনাকে ক্লাসগুলি সরবরাহ করে এমন প্রাকৃতিক নেমস্পেসিং সুবিধা হারাতে ধাক্কা দেয়। সুতরাং আপনি স্কোয়ার.এরিয়া () এর পরিবর্তে আরও স্কোয়ারআরিয়া () দিয়ে শেষ করুন।
মিগুয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.