সি ++ - ভাষায় কনস্টের মতো আনার সমস্যাগুলি কী?


17

আমি সি ++ এর ধারণাটিতে আগ্রহী - যেমন constনির্দিষ্ট কার্যকরকরণের মতো নয় (ফেলে দেওয়ার মতো const)।

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

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

মধ্যে সেখানে কিছু প্রকৃতির এর constযে জাহির কোন সমস্যা আছে যা এটাকে আরও ভাল ভাষা এটা এড়ানোর জন্য জন্য? কিছু constগভীর বা অগভীর হওয়া উচিত কিনা তা সিদ্ধান্ত নেওয়ার মতো ( constধারক রাখার অর্থ কি এর অর্থ আমি নতুন উপাদান যুক্ত করতে পারি না বা বিদ্যমান উপাদানগুলিকেও পরিবর্তন করতে পারি না; যদি উপাদানগুলি রেফারেন্স টাইপের হয় তবে কী হবে)?

আপডেট : আমি সি # এর উল্লেখ করার সময় এবং historicalতিহাসিক দৃষ্টিকোণটি তৈরি করার সময় আমি constভাষার সম্ভাব্য সমস্যার প্রকৃতিতে আগ্রহী ।

এটি ভাষাগুলির চ্যালেঞ্জ নয়। দয়া করে বর্তমান প্রবণতা বা জনপ্রিয়তার মতো বিষয়গুলিকে উপেক্ষা করুন - আমি কেবল প্রযুক্তিগত বিষয়েই আগ্রহী - আপনাকে ধন্যবাদ।


3
একদিকে যেমন: একাধিক উত্তরাধিকার উপলব্ধি করা শক্ত নাও হতে পারে তবে পদ্ধতি সমাধানটি বেশ কুরুচিপূর্ণ হয়ে উঠতে পারে। নিষ্পাপ গভীরতার-প্রথম রেজোলিউশনটি দ্রুত অপরিশোধিত (" হীরকের সমস্যা ") হয়ে যায় । C3 এ পদ্ধতি রেজল্যুশন অর্ডার (প্রকাশিত '96) এই solves, কিন্তু অবশ্যই না সহজ করে দিয়েছি বোঝার জন্য। একাধিক উত্তরাধিকার আটকানো প্রায়শই যথেষ্ট বুদ্ধিমান মনে হতে পারে - তবে আসল সমস্যাটি হ'ল জাভা সি 3 অ্যালগরিদমের পূর্বাভাস দেয় এবং জাভা পরে সি # ওরিয়েন্টেড।
আমন

3
@amon অনেক লোক সত্যই মনে করেন না যে একাধিক উত্তরাধিকার এমন একটি বৈশিষ্ট্য যা আপনি প্রথম স্থানে রাখতে চান, যেমন ডি প্রোগ্রামিং ল্যাঙ্গুজের নির্মাতারা: এটি বিতর্কিত মূল্যের একটি জটিল বৈশিষ্ট্য। এটি একটি দক্ষ পদ্ধতিতে বাস্তবায়ন করা খুব কঠিন এবং সংকলকগুলি এটি প্রয়োগে অনেক বাগের ঝুঁকিতে পড়ে। এমআই এর প্রায় সমস্ত মান একক উত্তরাধিকারের সাথে ইন্টারফেস এবং সমষ্টি সহ পরিচালনা করা যায়। যা অবশিষ্ট আছে তা এমআই বাস্তবায়নের ওজনকে ন্যায়সঙ্গত করে না। (উত্স)
jcora


2
এমনকি ছাড়া একাধিক ইনহেরিটেন্স, আপনি পারেন ইতিমধ্যে C # পদ্ধতি রেজোলিউশন (অথবা আরো স্পষ্ট করে ওভারলোড রেজোলিউশন) যে কোন 3-স্যাট সমস্যা এনকোড, এভাবেই দ্বারা NP-সম্পূর্ণ করে।
জার্গ ডব্লু মিটাগ

1
@ এসভিক, আপনাকে অনেক ধন্যবাদ যেহেতু এই প্রশ্নের কোনও উত্তর আমার কাছে নেই, ততই আমি historicalতিহাসিক কারণে নয়, সমস্যার প্রকৃতির দিকে মনোনিবেশ করার জন্য এটি ভারীভাবে সম্পাদনা করার স্বাধীনতা নিয়েছিলাম, কারণ মনে হয় যে এর মধ্যে 99% "সময় + মানুষ + বিরোধী সি ++ পক্ষপাতিত্ব ছিল seems + + CLR "।
গ্রীনল্ডম্যান

উত্তর:


10

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

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

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

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

সম্পাদনা : গ্রিনল্ডম্যানের মন্তব্যকে প্রতিবিম্বিত করার পরে আমি বুঝতে পেরেছি যে constডেটার অপরিবর্তনীয়তা সম্পর্কে সরাসরি নয়;constউদাহরণে এর পার্শ্ব প্রতিক্রিয়া রয়েছে কিনা তা পদ্ধতির প্রকারে এনকোড করে।

সাধারণভাবে স্বচ্ছ আচরণ অর্জনের জন্য মিউটেশন ব্যবহার করা সম্ভব । মনে করুন আপনার এমন একটি ফাংশন রয়েছে যা ডাকা হয় যখন ধারাবাহিকভাবে বিভিন্ন মান প্রদান করে - উদাহরণস্বরূপ, এমন একটি ফাংশন যা থেকে কোনও একক অক্ষর পড়ে stdin। মানগুলির একটি স্বচ্ছ প্রবাহ তৈরি করতে আমরা এই ফাংশনটির ফলাফলগুলি ক্যাশে / স্মৃতিচারণ করতে পারি। স্ট্রিমটি একটি লিঙ্কযুক্ত তালিকা হবে যার নোডগুলি প্রথমবার যখন আপনি তাদের মান পুনরুদ্ধার করার চেষ্টা করবেন তখন সেই ফাংশনটি কল করবে তবে ফলাফলটি ক্যাশে করবে। সুতরাং যদি stdinস্থির থাকে Hello, world!, প্রথমবার আপনি প্রথম নোডের মান পুনরুদ্ধার করার চেষ্টা করবেন, এটি একটি পড়ে charএবং ফিরে আসবে H। এরপরে এটির ফিরে চালিয়ে যাবেনH পড়ার জন্য আরও কল ছাড়াইchar । তেমনি, দ্বিতীয় নোড একটি charথেকে পড়া হবেstdinপ্রথমবার আপনি যখন এর মান পুনরুদ্ধার করার চেষ্টা করবেন, এবার ফিরে আসছেন eএবং সেই ফলাফলটি ক্যাশে করছেন।

এখানে আকর্ষণীয় বিষয়টি হ'ল আপনি এমন একটি প্রক্রিয়া চালু করেছেন যা অন্তর্নিহিতভাবে রাষ্ট্রীয় বলে মনে হয় রাষ্ট্রহীন object তবে এটি অর্জনের জন্য বস্তুর অভ্যন্তরীণ অবস্থার (ফলাফলগুলি ক্যাশে করে) পরিবর্তন করা দরকার ছিল - রূপান্তরটি ছিল সৌম্যর প্রভাব । আমাদের এটিকে তৈরি করা অসম্ভব CharStream constযদিও স্ট্রিমটি এক পরিবর্তনীয় মূল্যের মতো আচরণ করে । এখন ভাবুন পদ্ধতিগুলির Streamসাথে একটি ইন্টারফেস রয়েছে constএবং আপনার সমস্ত ফাংশন আশা করে const Streams। আপনি CharStreamইন্টারফেস বাস্তবায়ন করতে পারবেন না!

( সম্পাদনা 2: স্পষ্টতই একটি সি ++ কীওয়ার্ড বলা হয়েছে mutableযা আমাদের প্রতারণা করতে এবং তৈরি করতে দেয়CharStream const However তবে, এই ফাঁকটির constগ্যারান্টি নষ্ট করে - এখন আপনি সত্যিকার অর্থে নিশ্চিত হতে পারবেন না যে কোনও কিছু এর মাধ্যমে পরিবর্তিত হবে না)const পদ্ধতির I আমি মনে করি এটি এমন নয় খারাপ যেহেতু আপনাকে অবশ্যই স্পষ্টভাবে লুফোলটির জন্য অনুরোধ করতে হবে তবে আপনি এখনও সম্মান ব্যবস্থার উপর সম্পূর্ণ নির্ভরশীল))

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

অবশেষে, কোনও constবস্তুর কারসাজ করা গ্যারান্টি দেয় না যে এটি আপনার পিঠের পিছনে কিছু বাহ্যিক (স্থির বা বৈশ্বিক) রাষ্ট্রকে রূপান্তর করছে না notconst করছে না এর গ্যারান্টিগুলি প্রাথমিকভাবে প্রদর্শিত হওয়ার সাথে ততটা শক্তিশালী নয়।

এটি আমার কাছে পরিষ্কার নয় যে টাইপ সিস্টেমে পার্শ্ব প্রতিক্রিয়াগুলির উপস্থিতি বা অনুপস্থিতি এনকোড করা সর্বজনীনভাবে ভাল জিনিস।


1
+1 আপনাকে ধন্যবাদ। অপরিবর্তনীয় বস্তুগুলি সি ++ কনস্টের ব্যতীত অন্য কিছু (এটি দেখার চেয়ে বেশি)। তবে বলুন, সি ++ এর ডিফল্টরূপে দৃ const়তা থাকবে এবং varচাহিদা অনুসারে কেবলমাত্র একটি সমস্যা থাকবে - গভীরতা?
গ্রীনল্ডম্যান

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

+1 :-) আপনার আপডেটের খুব আকর্ষণীয় বিষয়গুলি (নন / কনস্ট ল্যাম্বডাসের সাথে বাস করা এবং সম্ভবত বাহ্যিক অবস্থার সাথে দুর্বল সমস্যা), আমাকে এটি আর হজম করতে হবে। যাইহোক, আপনার মন্তব্যে আমার মনে খারাপ কিছু নেই - সম্পূর্ণ বিপরীতে, কোডটির স্পষ্টতা বাড়াতে আমি বৈশিষ্ট্যগুলি সন্ধান করছি (অন্যটি: নন-নাল পয়েন্টার)। এখানে একই বিভাগ (কমপক্ষে এটি আমার উদ্দেশ্য) - আমি সংজ্ঞায়িত করি func foo(const String &s)এবং এটি একটি সংকেত sপরিবর্তন করা হবে না foo
গ্রিনল্ডম্যান

1
@ গ্রীনল্ডম্যান আমি অবশ্যই আবেদন এবং যুক্তি দেখতে পাচ্ছি। যাইহোক, আমি মনে করি না যতটা সম্ভব পরিবর্তনীয় অবস্থা এড়ানো (অন্যান্য বদনামের মতো nullএবং উত্তরাধিকারসূত্রে পাশাপাশি) এড়ানো ছাড়া অন্য কোনও সমস্যার আসল সমাধান নেই
D

8

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

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


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

1
লোলজের জন্য +1 @ "কিছু লোক তাদের সংকলক তাদের সহায়তা না করা পছন্দ করে I আমি এই লোকগুলি বুঝতে পারি না, তবে তাদের মধ্যে অনেকগুলি রয়েছে" "
টমাস এডিং

6

আমি ত্রুটিগুলি হিসাবে দেখছি:

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

  • এটি চূড়ান্ত গ্যারান্টি নয়। সাধারণত এমন ঘটনা রয়েছে যেখানে কনস্ট কেবলমাত্র রেফারেন্সকে সুরক্ষা দেয়, তবে একটি কারণ বা অন্য কারণে অন্তর্নিহিত মানগুলি রক্ষা করতে অক্ষম। এমনকি সি-তেও এমন প্রান্তের মামলা রয়েছে যা কনস্টের কাছে যেতে পারে না, যা কনট সরবরাহ করে এমন প্রতিশ্রুতি দুর্বল করে দেয়।

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

সুতরাং সম্ভবত প্রশ্নটি হ'ল কেন এমন কোনও সম্ভাব্য বিতর্কিত বৈশিষ্ট্যটি এগিয়ে নিয়ে যান যা এমনকি কিছু বিশেষজ্ঞ আপনার উদ্বেগজনক নতুন ভাষা গ্রহণের চেষ্টা করার সময় বিস্মিত হয়?

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


2
আপনার দ্বিতীয় বুলেটটি সঠিক নয়। সি ++ তে, রেফারেন্স / পয়েন্টার ঘোষণা করার তিন / চারটি উপায় রয়েছে, রিং constness: int *চপল মান, এর চপল পয়েন্টার int const *const মান, এর চপল পয়েন্টার int * constচপল মান, এর const পয়েন্টার int const * constconst মান const পয়েন্টার।
ফ্রেসনেল

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

1
এটি constসমস্যা নয় তবে ধরণটি সত্যই পরিবর্তন করা - আপনি যা কিছু করেন না কেন এটি সর্বদা সমস্যা হবে। পাস করার কথা বিবেচনা করুন RichString, এবং তারপরে আপনাকে আরও ভাল পাস বুঝে নিন String
গ্রীনল্ডম্যান

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

7
"কনস্টের বিষ" আসলেই কোনও সমস্যা নয় - আসল সমস্যাটি হ'ল সি ++ অ-তে ডিফল্ট const। এমন constজিনিসগুলি না হওয়া খুব সহজ constকারণ এটির পরিবর্তে আপনাকে এটিকে বেছে নিতে হবে।
ডোভাল

0

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

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

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

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


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

+1 আপনাকে ধন্যবাদ। আপনি কি দয়া করে "ক্লাস টু ক্লাস টু ক্লাস" স্পষ্ট করতে পারেন? আপনি কি কনস্টের হিসাবে ক্লাস স্থাপনের অর্থ দিয়েছিলেন? যদি হ্যাঁ, আমি এটি সম্পর্কে জিজ্ঞাসা করছি না - সি ++ কনস্ট একটি ভিউয়ের মতো কাজ করে, আপনি কোনও শ্রেণি নয় (বা সি ++ এ পরিবর্তিত কিছু) অবজেক্টের পাশে একটি কনস্ট ঘোষণা করতে পারেন। এছাড়াও পরবর্তী অনুচ্ছেদে এবং "সহজেই" শব্দটির সাথে একটি সমস্যা রয়েছে - সি # তে সি ++ - কনস্টের সম্পর্কে একটি ভাল প্রশ্ন রয়েছে এবং এতে যে পরিমাণ কাজের অন্তর্ভুক্ত রয়েছে তা সর্বজনগ্রাহ্য - আপনি যে প্রতিটি ধরণের স্থাপন করতে চান তার জন্য const(সি ++ অর্থে) ) আপনাকে সমস্ত বৈশিষ্ট্যের জন্য ইন্টারফেসও নির্ধারণ করতে হবে।
গ্রীনল্ডম্যান

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