টাইপ অনুমান কেন দরকারী?


37

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

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

সম্পাদনা: একটি উপসংহার হিসাবে আমি বুঝতে পারি কেন এটি কার্যকর। তবে ভাষার বৈশিষ্ট্যগুলির বিভাগে আমি এটিকে অপারেটর ওভারলোডিংয়ের একটি বালতিতে দেখি - কিছু ক্ষেত্রে দরকারী তবে অপব্যবহার হলে পাঠ্যতাকে প্রভাবিত করে।


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

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

মনে রাখবেন যে কোনও প্রোগ্রামার কোড লেখার চেয়ে বেশিবার কোড পড়েন, তার অর্থ এই নয় যে কোডের একটি অংশটি লিখিত চেয়ে বেশি বার পড়া হয়। প্রচুর কোড স্বল্পস্থায়ী হতে পারে বা অন্যথায় আর কখনও পড়তে পারে না এবং কোন কোডটি বেঁচে থাকবে এবং সর্বাধিক পঠনযোগ্যতায় লিখিত হওয়া উচিত তা বলা সহজ হতে পারে না।
jpa

2
@ জিমিহোফার প্রথম বক্তব্যটি বিশদভাবে বর্ণনা করা, সাধারণভাবে পড়া বিবেচনা করুন। একটি পৃথক শব্দের অংশ-বক্তৃতা উপর ফোকাস করার সময় একটি বাক্য কি পার্স করা এবং পড়া সহজ, একা বুঝতে দেওয়া? "(নিবন্ধ) গরু (বিশেষ্য-একবচন) লাফিয়ে (ক্রিয়া-অতীত) ওভার (প্রস্তুতি) দ্য (নিবন্ধ) চাঁদ (বিশেষ্য)। (বিরামচিহ্ন-সময়কাল)"।
জেভ স্পিটজ

উত্তর:


46

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

int x = 42;  // yes I see it's an int, because it's a bloody integer literal!

// Why the hell do I have to spell the name twice?
SomeObjectFactory<OtherObject> obj = new SomeObjectFactory<>();

এবং কখনও কখনও এটি পুরোপুরি বানানটি কেবল বিরক্তিকর।

// this code walks through all entries in an "(int, int) -> SomeObject" table
// represented as two nested maps
// Why are there more types than actual code?
for (Map.Entry<Integer, Map<Integer, SomeObject<SomeObject, T>>> row : table.entrySet()) {
    Integer rowKey = entry.getKey();
    Map<Integer, SomeObject<SomeObject, T>> rowValue = entry.getValue();
    for (Map.Entry<Integer, SomeObject<SomeObject, T>> col : rowValue.entrySet()) {
        Integer colKey = col.getKey();
        SomeObject<SomeObject, T> colValue = col.getValue();
        doSomethingWith<SomeObject<SomeObject, T>>(rowKey, colKey, colValue);
    }
}

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

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

এমন অনেকগুলি ভাষা রয়েছে যা টাইপ অনুক্রমকে সমর্থন করে। উদাহরণ স্বরূপ:

  • সি ++। autoশব্দ ট্রিগার অনুমান টাইপ করুন। এটি ছাড়া ল্যাম্বডাসের জন্য বা পাত্রে প্রবেশের জন্য প্রকারের বানানটি নরক হবে।

  • সি শার্প। আপনি এর সাহায্যে ভেরিয়েবল ঘোষণা করতে পারেন varযা সীমিত আকারের অনুক্রমের সূত্রপাত করে। এটি এখনও বেশিরভাগ ক্ষেত্রে পরিচালনা করে যেখানে আপনি টাইপ অনুমান চান want নির্দিষ্ট জায়গায় আপনি প্রকারটি পুরোপুরি ছেড়ে দিতে পারেন (যেমন ল্যাম্বডাসে)।

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


13
এটিও লক্ষ করুন যে সি # এর নামবিহীন টাইপ রয়েছে, অর্থাত্ নাম ছাড়া প্রকারের, তবে সি # এর নামমাত্র টাইপ সিস্টেম রয়েছে, অর্থাত্ নামের ভিত্তিতে একটি টাইপ সিস্টেম system প্রকার অনুমান ব্যতীত, এই ধরণেরগুলি কখনও ব্যবহার করা যায় না!
Jörg W Mittag

10
কিছু মতামত আমার মতে কিছুটা সংশ্লেষিত। ৪২-তে আরম্ভ করার অর্থ স্বয়ংক্রিয়ভাবে এই নয় যে চলকটি একটি int, এটি সমান সহ কোনও সংখ্যাসূচক ধরণের হতে পারে char। এছাড়াও আমি দেখতে পাচ্ছি না কেন আপনি Entryকেবল শ্রেণীর নামটি টাইপ করতে পারেন এবং আপনার আইডিই প্রয়োজনীয় আমদানি করতে দিলে আপনি কেন পুরো টাইপটি বানান করতে চান । আপনার নিজের প্যাকেজে একই নামের সাথে ক্লাস করার সময় যখন আপনাকে পুরো নামটি বানান করতে হয় কেবল তখনই ঘটে থাকে। তবে এটি আমার কাছে খারাপ ডিজাইনের মতো বলে মনে হচ্ছে।
ম্যালকম

10
@ মালকলম হ্যাঁ, আমার সমস্ত উদাহরণ স্বীকৃত। তারা একটি পয়েন্ট উদাহরণস্বরূপ পরিবেশন। আমি intউদাহরণটি লিখতে গিয়ে , আমি বেশিরভাগ ভাষাগুলির (আমার মতে বেশ বুদ্ধিমান আচরণ) সম্পর্কে ভাবছিলাম যা বৈশিষ্ট্য অনুসারে বৈশিষ্ট্য নির্ধারণ করে। তারা সাধারণত একটি অনুমান intবা Integerবা যাই হোক না কেন এটা সেই ভাষায় বলা হচ্ছে। প্রকারের অনুমানের সৌন্দর্যটি হ'ল এটি সর্বদা alচ্ছিক; আপনার যদি প্রয়োজন হয় তবে আপনি এখনও অন্য ধরণের নির্দিষ্ট করতে পারেন। Entryউদাহরণটি সম্পর্কে : ভাল পয়েন্ট, আমি এটির সাথে প্রতিস্থাপন করব Map.Entry<Integer, Map<Integer, SomeObject<SomeObject, T>>>। জাভা এমনকি টাইপ উপনাম :( নেই
আমন

4
@ m3th0dman যদি প্রকারটি বোঝার জন্য গুরুত্বপূর্ণ হয় তবে আপনি এখনও স্পষ্টভাবে এটি উল্লেখ করতে পারেন। প্রকার অনুমান সর্বদা alচ্ছিক। তবে এখানে, প্রকারটি colKeyসুস্পষ্ট এবং অপ্রাসঙ্গিক উভয়ই: আমরা কেবল এটির দ্বিতীয় তর্ক হিসাবে উপযুক্ত হিসাবে যত্নশীল doSomethingWith। যদি আমি সেই লুপটি কোনও ফাংশনে সরিয়ে ফেলতে পারি যা একটি ট্র্যাপলস-এর একটি Iterable (key1, key2, value)-traples আসে তবে সর্বাধিক সাধারণ স্বাক্ষর <K1, K2, V> Iterable<TableEntry<K1, K2, V>> flattenTable(Map<K1, Map<K2, V>> table)। এই ফাংশনের ভিতরে, প্রকৃত ধরণের colKey( Integer, না K2) একেবারেই অপ্রাসঙ্গিক।
আমন

4
@ এম 3 তম ডিমান এটি " বেশিরভাগ " কোডটি এটি বা সে সম্পর্কে এটি বেশ বিস্তৃত একটি বিবৃতি । উপাখ্যানের পরিসংখ্যান সেখানে অবশ্যই টাইপ initializers দুবার লিখিতভাবে কোন বিন্দু আছে: View.OnClickListener listener = new View.OnClickListener()। প্রোগ্রামারটি "অলস" এবং এটি সংক্ষিপ্ত করেও যদি আপনি এখনও টাইপটি জানতেন তবে var listener = new View.OnClickListener(যদি এটি সম্ভব হত)। এই ধরণের অপ্রয়োজনীয়তা সাধারণ - আমি এখানে কোনও অনুমানের ঝুঁকি নেব না - এবং এটি অপসারণ ভবিষ্যতের পাঠকদের সম্পর্কে চিন্তাভাবনা থেকে শুরু করে । প্রতিটি ভাষার বৈশিষ্ট্য যত্ন সহকারে ব্যবহার করা উচিত, আমি এটি নিয়ে প্রশ্ন করছি না।
কনরাড মোরাউস্কি

26

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

এবং এটি আমার অভিজ্ঞতা যে প্রায়শই সঠিক টাইপটি গুরুত্বপূর্ণ নয় (যা) গুরুত্বপূর্ণ। নিশ্চয়ই মাঝে মাঝে নীড় এক্সপ্রেশন: x + y * z, monkey.eat(bananas.get(i)), factory.makeCar().drive()। এর প্রত্যেকটিতে উপ-এক্সপ্রেশন রয়েছে যা এমন কোনও মানকে মূল্যায়িত করে যার প্রকারটি লিখিত হয়নি। তবু তারা পুরোপুরি পরিষ্কার। প্রকারটি আনস্টেট না রেখেই আমরা ঠিক আছি কারণ প্রসঙ্গে অনুধাবন করা যথেষ্ট সহজ, এবং এগুলি লিখলে ভাল করার চেয়ে আরও বেশি ক্ষতি হয় (তথ্য প্রবাহের বিশৃঙ্খলা বোঝা, মূল্যবান পর্দা এবং স্বল্প-মেয়াদী মেমরি স্পেস নেওয়া)।

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

user = db.get_poster(request.post['answer'])
name = db.get_display_name(user)

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

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


2
+1 এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। টাইপ অনুমান কেন একটি দুর্দান্ত ধারণা এটি ডানদিকে যায়।
খ্রিস্টান হেইটার

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

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

4

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

  Map<String,HashMap<String,String>> map = getMap();

তবে আপনি বলতে পারেন এটি ঠিক আছে আমার আইডিই আমাকে সহায়তা করবে, এটি একটি বৈধ পয়েন্ট হতে পারে। যাইহোক, কিছু বৈশিষ্ট্য উদাহরণস্বরূপ, সি # বেনামে প্রকারের সাহায্যের সাহায্যে না থাকায়।

 var person = new {Name="John Smith", Age = 105};

Selectউদাহরণস্বরূপ , লিঙ্ক অনুকরণের মতো টাইপের সাহায্য ছাড়াই এখনকার মতো দুর্দান্ত হবে না

  var result = list.Select(c=> new {Name = c.Name.ToUpper(), Age = c.DOB - CurrentDate});

এই বেনামে টাইপটি খুব সহজেই ভেরিয়েবলের সাথে অনুমান করা হবে।

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


Map<String,HashMap<String,String>>? অবশ্যই, আপনি যদি প্রকারগুলি ব্যবহার না করে থাকেন তবে তাদের বানানটি খুব সামান্য উপকার করবে। Table<User, File, String>যদিও এটি আরও তথ্যবহুল এবং এটি লেখার সুবিধা রয়েছে।
মাইকএফএইচ

4

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

আপনাকে কখন এটি ব্যবহার করা উচিত বা কখন ব্যবহার করা উচিত নয় - তাও আপনাকে জানায় - যখন তথ্য অপ্রয়োজনীয় নয়।


3
হ্যাঁ, প্রযুক্তিগতভাবে, ম্যানুয়াল স্বাক্ষরগুলি বাদ দেওয়া সম্ভব হলে তথ্যটি সবসময় অপ্রয়োজনীয়: অন্যথায় সংকলক তাদের অনুমান করতে সক্ষম হয় না! তবে আপনি যা বলতে চাইছেন তা আমি পেয়েছি: আপনি যখন একক দর্শনতে একাধিক দাগে কেবল স্বাক্ষরটি সদৃশ করেন তখন এটি মস্তিষ্কের পক্ষে সত্যই অপ্রয়োজনীয় হয় , যখন কয়েকটি ভালভাবে টাইপ করা তথ্য আপনাকে দীর্ঘ সময় অনুসন্ধান করতে হয়, সম্ভবত একটি দিয়ে ভাল অনেক অজ্ঞাত রূপান্তর।
বাম দিকের বাইরে

@ বামফ্রন্টাউন্ডবাউট: প্রোগ্রামার দ্বারা পড়া যখন অপ্রয়োজনীয়।
jmoreno

3

ধরা যাক কেউ কোডটি দেখেছেন:

someBigLongGenericType variableName = someBigLongGenericType.someFactoryMethod();

যদি someBigLongGenericTypeরিটার্নের ধরণের থেকে নির্ধারিত হয় someFactoryMethod, কোডটি পড়ার কেউ কীভাবে প্রকারের সাথে যথাযথভাবে মেলে না তা লক্ষ্য করার সম্ভাবনা রয়েছে এবং যে তাত্পর্যটি লক্ষ্য করেছে সে যদি এটি ইচ্ছাকৃত কিনা তা কীভাবে সহজেই বুঝতে পারে?

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


2

আমি দেখতে পাচ্ছি যে ইতিমধ্যে ইতিমধ্যে বেশ কয়েকটি উত্তম উত্তর রয়েছে। যার মধ্যে আমি পুনরাবৃত্তি করব তবে কখনও কখনও আপনি কেবল নিজের কথায় জিনিস রাখতে চান। আমি সি ++ এর কয়েকটি উদাহরণের সাথে মন্তব্য করব কারণ এটি সেই ভাষা যার সাথে আমার সর্বাধিক পরিচিতি রয়েছে।

যা প্রয়োজন তা কখনই বোকামি না। অন্যান্য ভাষার বৈশিষ্ট্যগুলিকে ব্যবহারিক করে তোলার জন্য প্রকার অনুকরণ প্রয়োজনীয় necessary সি ++ তে অপরিবর্তনীয় ধরণের হওয়া সম্ভব।

struct {
    double x, y;
} p0 = { 0.0, 0.0 };
// there is no name for the type of p0
auto p1 = p0;

সি ++ 11 যুক্ত ল্যাম্বডাস যা অযোগ্যও নয়।

auto sq = [](int x) {
    return x * x;
};
// there is no name for the type of sq

টাইপ অনুমান এছাড়াও টেমপ্লেট আন্ডারপাইন।

template <class x_t>
auto sq(x_t const& x)
{
    return x * x;
}
// x_t is not known until it is inferred from an expression
sq(2); // x_t is int
sq(2.0); // x_t is double

তবে আপনার প্রশ্নগুলি ছিল "প্রোগ্রামার আমি কেন কোডটি পড়তে চাইলে আমার ভেরিয়েবলের ধরণটি নির্ধারণ করতে চাই? কোন ধরণের কী আছে তা ভাবার চেয়ে কেবল টাইপটি পড়া কি আরও দ্রুত হয় না?"

প্রকারের অনুমানটি অপ্রয়োজনীয়তা দূর করে। কোড পড়ার ক্ষেত্রে যখনই কোডটিতে অপ্রয়োজনীয় তথ্য থাকা কখনও কখনও দ্রুত এবং সহজতর হতে পারে তবে অতিরিক্ত তথ্য দরকারী তথ্যকে ছাপিয়ে যেতে পারে । উদাহরণ স্বরূপ:

std::vector<int> v;
std::vector<int>::iterator i = v.begin();

সি ++ প্রোগ্রামার সনাক্ত করতে আমি যে একজন পুনরুক্তিকারী i = v.begin()তাই স্পষ্টত প্রকারের ঘোষণাটি সীমিত মানের জন্য এটি স্ট্যান্ডার্ড লাইব্রেরির সাথে খুব বেশি পরিচিতি লাভ করে না । এর উপস্থিতি দ্বারা এটি বিশদগুলিকে অস্পষ্ট করে যা আরও গুরুত্বপূর্ণ (যেমন iভেক্টরের শুরুর দিকে নির্দেশ করে)। @ ইমনের উত্তম উত্তরটি গুরুত্বপূর্ণ বিবরণকে ছাপিয়ে ভার্বোসটির আরও ভাল উদাহরণ সরবরাহ করে। বিপরীতে টাইপ ইনফারেন্স ব্যবহার করে গুরুত্বপূর্ণ বিশদটিকে আরও বেশি গুরুত্ব দেওয়া হয়।

std::vector<int> v;
auto i = v.begin();

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

std::vector<int> v;
std::vector<int>::iterator i = v.begin();

কোডটি দ্বিগুণ করার জন্য আমাকে ভেক্টরের মান ধরণের পরিবর্তন করতে হবে:

std::vector<double> v;
std::vector<double>::iterator i = v.begin();

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

std::vector<int> v;
auto i = v.begin();

এবং সংশোধিত কোড:

std::vector<double> v;
auto i = v.begin();

নোট করুন যে আমাকে এখন কেবল কোডের একটি লাইন পরিবর্তন করতে হবে। এটি একটি বৃহত প্রোগ্রামে এক্সট্রপোলেট করুন এবং টাইপ ইনফারেন্স এডিটরের চেয়ে আপনি যত দ্রুত করতে পারেন প্রকারভেদে পরিবর্তনগুলি প্রচার করতে পারে।

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

int pi = 3.14159;

অপ্রয়োজনীয় বিষয়গুলি বোঝা শক্ত করে তোলে। কিছু ক্ষেত্রে টাইপ অনুক্রমটি পড়া এবং বোঝা সহজ হতে পারে কারণ এটি স্পষ্টত ধরণের স্পেসিফিকেশনের চেয়ে সহজ। কোডের খণ্ডটি বিবেচনা করুন:

int y = sq(x);

যদি যে sq(x)আয় একটি int, তাই নয় সুস্পষ্ট কিনা yএকটি হল int, কারণ এটি ফেরত ধরনের sq(x)বা কারণ এটি মামলা বিবৃতি ব্যবহারের y। যদি আমি অন্য কোডগুলি পরিবর্তন করি যে sq(x)আর আর ফিরে আসে না int, তবে line লাইনটি থেকে একাই অনিশ্চিত হয় যে প্রকারটি yআপডেট করা উচিত। একই কোডের সাথে বৈসাদৃশ্য করুন তবে টাইপ অনুমান ব্যবহার করুন:

auto y = sq(x);

এতে উদ্দেশ্যটি পরিষ্কার, yঅবশ্যই ফিরে আসা একই ধরণের হতে হবে sq(x)। কোড যখন রিটার্নের ধরণ পরিবর্তন করে sq(x), yপরিবর্তনের ধরণটি স্বয়ংক্রিয়ভাবে মেলে।

সি ++ তে দ্বিতীয় কারণ রয়েছে যে উপরের উদাহরণটি টাইপ অনুক্রমের সাথে সহজ, টাইপ ইনফারেন্স অন্তর্ভুক্ত প্রকারের রূপান্তরটি প্রবর্তন করতে পারে না। যদি রিটার্নের ধরণটি sq(x)না হয় intতবে সংকলকটি নিঃশব্দে এতে অন্তর্ভুক্ত রূপান্তর conversোকান int। যদি রিটার্ন টাইপ sq(x)কোনও ধরণের জটিল ধরণ যা সংজ্ঞায়িত করে তবে operator int()এই লুকানো ফাংশন কলটি নির্বিচারে জটিল হতে পারে।


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