আপনি কীভাবে কনস্টের কনস্টিউনেস কনভার্ট হয়ে গেলেন? [বন্ধ]


25

সি ++ এর 15 বছর পরে, আমি এখনও কনস্ট ব্যবহার করে ভালবাসতে শিখিনি। আমি বুঝতে পারছি এটির ব্যবহার, তবে আমি বাস্তবে কখনও এমন পরিস্থিতিতে পড়িনি যেখানে কনস্ট কনস্ট্যান্ট থাকার কারণে আমি যে সমস্যাটি ভোগ করছিলাম তা এড়াতে পারতাম।

সুতরাং আপনি কীভাবে কনসেটগুলির সুবিধাগুলি পছন্দ করতে পারেন?


3
আমি মনে করি কনস্ট্রাক্ট বা আকারের অপারেটরের মতো সমস্যা সমাধানের সরঞ্জামের চেয়ে কনস্টের সঠিকতা আরও সঠিক।
কিংবদন্তি 2 কে

9
"কনস্টেন্টটি সি ++ এ কাজ করার কারণ হ'ল আপনি এটিকে ফেলে দিতে পারেন you আপনি যদি এটি ফেলে দিতে না পারেন তবে আপনার পৃথিবী স্তন্যপান হবে।" - অ্যান্ডারস হিজলসবার্গ
ম্যাসন হুইলারের

1
কনস্ট একটি সি টাইপ মডিফায়ারও এবং প্রথম এএনএসআই সি স্ট্যান্ডার্ড থেকেই।
Huperniketes

জাভা / সি # দ্বারা নষ্ট হয়ে যাওয়ার কারণে, আমি একজন অদ্ভুত ধরণের লোক যিনি ছেড়ে যেতে পছন্দ করেন আমার যে কোনও সুযোগ পাওয়ার সম্ভাবনা জোর দিয়ে। যা ভুল হতে পারে সে ভুল হয়ে যাবে। যদি একটি সংকলন-সময় বা রান-টাইম সহায়তা থাকে তবে আমাকে গণনা করুন! আমি এটি সম্পর্কে 3-4 বার শুনার সাথে সাথেই ধর্মান্তরিত হয়েছি এবং এই লিঙ্কটির একটি অংশ অনুসরণ করেছি (সিনট্যাক্সটি দেখার জন্য যথেষ্ট, আমি এর কারণটি পড়ার দরকার নেই): সম্ভাবনা.com / Cpp / const.html আমার মুখে কিছু এখনও ফুটে ওঠেনি কারণ ... দৃ const়রূপে সংশোধন করতে খুব কম প্রচেষ্টা লাগবে, এবং তাতে কোনও ক্ষতি হয় না। জোয়েলের চিন্তাভাবনাগুলি দেখুন: joelonsoftware.com/articles/Wrong.html
কাজ

উত্তর:


28

আমি দর্শনের আলিঙ্গন করার চেষ্টা না করা পর্যন্ত আমি নিশ্চিত হইনি।

আমি প্রথমে constআমার সবচেয়ে বেসিক শ্রেণির সদস্যদের সদস্যদের এবং সদস্যদের কার্যকারিতা যুক্তি দিয়ে রিড- ওনাল পাঠকদের দ্বারা প্রথমে শুরু করেছিলাম ।

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

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

আমি একবার অ্যাপ্লিকেশনটি আবার চালু হয়ে গেলে, এটি দ্রুত হয়েছিল (কিছু অ্যালগরিদমগুলি পরিবর্তন করতে হয়েছিল যা আমি আবিষ্কার করেছি যে কাজের জন্য সঠিক ছিল না), কোডটি পড়ার সময় অনেক কম বাগ এবং সহজেই বোঝা যায়।

আমি বিশ্বাসী ছিল।

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


8
সংক্রামক জন্য +1 যার মূলত অর্থ হয় আপনাকে হয় কনস্ট কনভার্ট হতে হবে বা সম্পূর্ণরূপে এড়ানো উচিত।
মার্টিন উইকম্যান

আপনার এমন লিবুগুলির উপরও নির্ভর করা উচিত নয় যা দৃ const়তা সংশোধন করে না। আপনার পদ্ধতির কাজ হয় না যখন এর অর্থ আপনি কোনও গি ফাংশনকে কল করতে পারবেন না কারণ সেগুলি কনস্ট্যান্ট নয় - বা আপনার প্রতিটি গি কলটিতে এটি ফেলে দিতে হবে।
মার্টিন বেকেট

4
"ডিবাগ করা সহজ বলে মনে হয়েছে" এর জন্য +1, আমি constএমনকি স্থানীয় ভেরিয়েবলের জন্যও ব্যবহার করি যা আমি জানি যে আমার কোনও পরিবর্তন করার দরকার নেই, এই কোডটি পড়ার সময় আমি কোনও ifবা একটি forবা তিমির উপর দিয়ে স্কিম করতে পারি: আমার পরিবর্তনশীল একটি ধ্রুবক, আমি জানি না এটা বদলাবে না! আমি অপ্টিমাইজেশন সম্পর্কে কম যত্ন নিতে পারিনি, তবে আমার একটি সীমিত মস্তিষ্ক এবং ইন্ডেন্টের কয়েক স্তরের + কনস্ট-নির্ভুলতা ব্যাপকভাবে সহায়তা করে!
ম্যাথিউ এম।

@ ম্যাথিউইউম: কি কখনও হাস্কেলকে স্যুইচ করার কথা বিবেচনা করেছেন? ;-)
জর্জিও

@ জর্জিও: আমি এটি অন্বেষণ করেছি, এমনকি "রিয়েল ওয়ার্ল্ড হাস্কেল" কিনেছি। সত্য কথা বলতে গেলে আমি ডিফল্টরূপে অলসতা এবং অনেক ক্রিপ্টিক অপারেটর উদ্ভূত হয়ে শিহরিত হই না।
ম্যাথিউ মিঃ

15

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

মূলত, অপরিবর্তনীয় হতে পারে এমন সমস্ত কিছু সম্ভবত হওয়া উচিত, যদি না আপনি পরিবর্তনীয় অবস্থার জন্য কোনও ভাল কারণ পেয়ে থাকেন। আমার অভিজ্ঞতা অনুসারে, এই লক্ষ্যের অনুধাবনে যে কোনও ভাষায় প্রোগ্রাম লেখাই নিরাপদ, আরও ভাল কোডের দিকে নিয়ে যায় । constপ্রযোজ্য — অনিবার্যতা বিনামূল্যে যেখানে ব্যবহার করে আপনার হারাতে হবে না !

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


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

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


2
আপনি মূলত কেবল বলেছেন যে দৃ said়তা সঠিকতা একটি ভাল জিনিস। আপনি বলেছিলেন যে এটি "নিরাপদ, আরও ভাল কোডের দিকে নিয়ে যায়"। আপনি বলতে পারবেন কেন?
ডেভিড রেইস

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

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

2
@ ডেভিড থর্নলি: ধারাবাহিকতার জন্য mutableলজিক্যাল পছন্দ। স্থানীয় পরিবর্তনশীল void alter(mutable Point&)হিসাবে যেমন উপলব্ধি করা যায় তেমনি mutable int fooবিদ্যমান ভাষা বা বিদ্যমান ব্যবহারের সাথে এই দ্বন্দ্বগুলির মধ্যেও নয় mutable। এছাড়াও, Object mutable* mutableএটি প্রয়োজনীয় বা সঠিক কিনা তা সম্পর্কে একটি সতর্কতা হিসাবে যথেষ্ট ভয়ঙ্কর দেখাচ্ছে।
জন পুরী

আপনি যদি কখনও কাঁটাচামচ করেন তবে পরিবর্তে ক্লাংয়ের সাথে যেতে বিবেচনা করুন - কম বেদনাদায়ক হওয়া উচিত।
gf

6

দৃ const়তা শুদ্ধ করার সুবিধাটি হ'ল এটি প্রোগ্রামের উপর একটি শৃঙ্খলা চাপিয়ে দেয় এবং প্রোগ্রামের অংশগুলির বিষয়ে যুক্তি করা সহজ করে তোলে।

শৃঙ্খলাটি হ'ল আপনার কিছুটা পরিবর্তন হতে পারে তা জানা দরকার। সম্পর্কিত সুবিধা হ'ল রাষ্ট্রের পরিবর্তন কী হতে পারে তা আপনি যখন বলতে পারেন কোনও কোডের টুকরা কী করে তা দেখতে সহজ।


1
"প্রোগ্রাম পড়তে হবে লোকদের পড়ার জন্য, এবং ঘটনাক্রমে কেবল মেশিনের সঞ্চালনের জন্য।" - অ্যাবেলসন এবং সুসমান, এসআইসিপি
ব্র্যান্ডন ডুরেট

4

হচ্ছে const নকশা যা আমি একটি অনুরূপ সমস্যা যা ঢালাই অপারেটার ব্যবহার করছে না পাসে আচরণ শুদ্ধি সঠিক জোর দেয়; সুতরাং castালাই ব্যবহার করা এবং কনস্টের সঠিক না হওয়া, পরিবর্তনের ন্যূনতম ব্যবহার - এই সমস্তই নকশাগুলি কতটা ভাল তা পরিমাপ করার জন্য পয়েন্টার যা হ'ল সামগ্রিক সমস্যাটি সমাধানের জন্য আসল সরঞ্জাম নয়।

PS: আমি constএকবার এটি ব্যবহারের সঠিকতা বুঝতে পেরে পুরোপুরি নিশ্চিত হয়েছি ;)



2

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


2

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

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

2

অন্যান্য উত্তরে কভার করা দুটি পয়েন্ট সংক্ষিপ্ত করতে এবং একটি নতুন যুক্ত করতে:

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

  • constসংকলক আপনার অভিপ্রায় নথি। সংকলন সময়ে ভুলগুলি খুঁজে পাওয়া সর্বদা কোডটির এই অংশটি অপেক্ষা করার চেয়ে ভাল।

  • constটাইপ নিরাপদ পলিমারফিজমের জন্য প্রয়োজনীয়। পয়েন্টারগুলি (তাদের সমস্ত ফর্মের মধ্যে, কেবল কাঁচা পয়েন্টার নয়) কেবলমাত্র কোভেরিয়েন্ট হয় const(দ্রষ্টব্য: "পয়েন্টার টু কনস্ট" এর মতো নয়)। কোভারিয়েন্সের একটি পঠনযোগ্য কেবল ইন্টারফেস প্রয়োজন, এবং বিপরীতে লিখনের জন্য কেবল ইন্টারফেসের প্রয়োজন।

এর মধ্যে দ্বিতীয়টি আমি প্রথমে শিখেছি। আমি constকেবল পয়েন্টার এবং রেফারেন্সের পরামিতিগুলির লক্ষ্য নিয়ে শুরু করেছি, যতক্ষণ না আমি আগে ত্রুটিগুলি ধরা এবং এর স্থানীয়দের উপর ব্যবহার শুরু করা ইত্যাদি সুবিধাগুলি দেখতে শুরু করি until

তখন আমি শিখেছি যে বেশিরভাগ #defineগুলি টাইপ-সুরক্ষার অতিরিক্ত সুবিধা সহ বৈশ্বিক ধ্রুবক দ্বারা (সি ++ এ) প্রতিস্থাপন করা যেতে পারে। সুতরাং আমি এটি সেখানে ব্যবহার করেছি।

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


1

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

এটি একই নীতি, তবে আমি কেবল কনস্ট ব্যবহারের ব্যবহারিক কারণ যুক্ত করতে চেয়েছিলাম।

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