পঠনযোগ্যতা (রেফারেন্স) পরামিতিগুলিতে কনস্ট ব্যবহার না করার একটি বৈধ কারণ?


24

কিছু ফাংশন লেখার সময়, আমি এই জাতীয় পরামিতিগুলিতে একটি কনস্টের শব্দটি পেয়েছি:

void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}

প্রায়শই আইডিই বা ভিমে দুটি রেখায় একটি লাইন বিভক্ত করে, তাই আমি প্যারামিটারগুলিতে সমস্ত আবশ্যক কীওয়ার্ডগুলি মুছে ফেলতে চাই:

void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
} 

কনস্ট ব্যবহার না করার এটি কি বৈধ কারণ? প্যারামিটার অবজেক্টগুলি ম্যানুয়ালি অপরিবর্তিত রাখা কি রক্ষণাবেক্ষণযোগ্য?


110
"আরে, আমি আমার প্রোগ্রামটি কার্যত পরিবর্তন করতে চাই" এটিকে আরও পঠনযোগ্য করে তোলা একটি খারাপ খারাপ কারণ।
পিটার বি

37
প্রোগ্রামটি আর কোনওভাবেই পঠনযোগ্য হয়ে উঠছে না - একবার আপনি যখন constকোনও শক্তিশালী ইঙ্গিত পেয়েছিলেন যে কোনও কিছু হস্তান্তরিত হচ্ছে তখন আপনাকে কীভাবে ফাংশনটিতে এটি পরিবর্তন করা যেতে পারে তা বিরক্ত করার দরকার নেই।
tofro

43
পঠনযোগ্যতার উন্নতির আরও ভাল উপায় হ'ল আর্গুমেন্টের সংখ্যা হ্রাস করা
5gon12eder

15
'কনস্ট' তর্কযোগ্যভাবে পাঠযোগ্যতার উন্নতি করে। এই বক্তব্যটি পরিষ্কার করে দিয়েছে যে আপত্তি বদলে যেতে পারে না!
চার্লস

14
কি পাঠ্যতা সাহায্য করবে প্রতিটি কমা পরে একটি স্থান যোগ করা হয়।
সাম হোচেভার

উত্তর:


182

পড়ার যোগ্যতা হ'ল হোয়াইটস্পেস ব্যবহার শিখার একটি বৈধ কারণ:

void MyClass::myFunction(
        const MyObject& obj,
        const string& s1,
        const string& s2,
        const string& s3
) {
    return;
}

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

constমানে কিছু। আপনার স্থান এবং ধারণার বাইরে থাকার কারণে এটিকে ছুঁড়ে ফেলবেন না। পঠনযোগ্যতা রাজা তবে এর নামে জিনিসগুলি ভাঙা কেবল ছেড়ে দেওয়া।


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

6
@ ক্যান্ডিওডআরেঞ্জ আমি অবাক হয়েছি যে আপনি এই উত্তরে "ফর্ম 6" ব্যবহার করেন নি ... এটি স্পষ্টতই কম কুৎসিত!
এসভিডজেন

6
জয়ের জন্য Form ফর্ম। এক স্তর বিন্যাসের জন্য একটি ট্যাবস্পেস। সহজ এবং কার্যকর। সমস্যার সমাধান হয়েছে :)
মনিকা

2
ঠিক আছে, ফর্ম 6 এটি। জেফগ্রিগ সি 2-তে উল্লিখিত এই রূপটি।
candied_orange

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

52

আসলে, পঠনযোগ্যতা ইস্যুটি অবশ্যই অন্য দিকে চলে গেছে। প্রথমত, আপনি হোয়াইটস্পেস ব্যবহার করে তুচ্ছভাবে আপনার রান-অন লাইনের সমাধান করতে পারেন । তবে অপসারণ constকেবল লাইনকে ছোট করে না, এটি পুরোপুরি প্রোগ্রামটির অর্থ পরিবর্তন করে।

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

void foo_const(std::string const& );
void foo_nc(std::string& );

std::string some_getter();

foo_const(some_getter());      // OK
foo_const("Hello there"); // OK

foo_nc(some_getter()); // error
foo_nc("Nope");   // error

std::string x = some_getter(); // have to do this
foo_nc(x);                     // ok
std::string msg = "Really??";  // and this
foo_nc(msg);                   // ok

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


6
আপনার দ্বিতীয় অনুচ্ছেদ আমাকে যদি চিন্তা করার চেষ্টা মাথাব্যাথা দেয় constউল্লেখ করা হয় constবা অপরকে constএবং কি constপ্রকৃতপক্ষে সবচেয়ে গুরুত্বপূর্ণconst
Mindwin

3
@ মাইন্ডউইন আমার মতে বিড়ম্বনাটি হ'ল আমার দ্বিতীয় অনুচ্ছেদটি পরিষ্কার এবং দ্ব্যর্থহীন, এবং আপনি কী বলছেন তা আমার কোনও ধারণা নেই।
ব্যারি

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

1
আমি মনে করি কিছু হাইফেনেটেড যৌগিক এটি পরিষ্কার করে দেবে।
shawnt00

2
বা বিশেষত সেখানে বিশেষ্য (ফ্রেস) হিসাবে const&উল্লেখের পরিবর্তে ব্যবহার করুনconst
ক্লেথ

21

সহজ উত্তরটি "না" no

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

// parameter "foo" is not modified
void fna(Foo& foo);

void fnb(const Foo& foo);

পরবর্তী সংস্করণটি আরও সংক্ষিপ্ত হওয়ার বিষয়টি ছাড়াও এটি আরও দৃ contract়তর চুক্তি সরবরাহ করে এবং সংকলকটি আপনাকে আপনার উদ্দেশ্যগুলি বজায় রাখতে সহায়তা করে। প্রাক্তনটি fna(Foo&)আপনার এতে যে প্যারামিটারটি দেয় তা পরিবর্তন করে ফাংশনটি আটকাতে কিছুই করে না ।

@ ক্যান্ডিওড ওরেঞ্জ উত্তর হিসাবে, আপনি কোডটি ছড়িয়ে দিতে এবং পঠনযোগ্যতা বাড়ানোর জন্য সাদা স্থান ব্যবহার করতে পারেন।


14

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

typedef string str;
typedef MyObject MObj;
void MyClass::myFunction(const MObj& o,const str& s1,const str& s2,const str& s3)

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

constকোড নিজেই একটি কার্যকারিতা। আপনি MyClass::ঘোষণার অংশটি সরিয়ে ফাংশনটিকে একটি সদস্যবিহীন করবেন না, তাই এটি অপসারণ করবেন নাconst


4
আমি সম্মত হই যে আপনার দেওয়া স্নিপেট কম পাঠযোগ্য able এটি একটি পাঠককে কী MObjএবং কী তা খুঁজে পেতে বাধ্য করে strএবং অবশ্যই ভ্রু উত্থাপন করে। যেমন তুমি কেন শুধু নাম উল্লেখ করেননি: এটা ধরনের যাদের নাম আপনি ইতিমধ্যে নিয়ন্ত্রণ আছে তাদের জন্য বিশেষ করে অদ্ভুত MyObjectযেমন MObjদিয়ে শুরু করবে?
জেসন সি

3

পরামিতি পরামিতিগুলিতে কনস্ট ব্যবহার না করার একটি বৈধ কারণ?

না। ছাড় দেওয়া constকার্যকারিতা পরিবর্তন করতে পারে, সুরক্ষা constসরবরাহ হারায় এবং সম্ভাব্যভাবে কম দক্ষ কোড তৈরি করতে পারে।

প্যারামিটার অবজেক্টগুলি ম্যানুয়ালি অপরিবর্তিত রাখা কি রক্ষণাবেক্ষণযোগ্য?

বরং ব্যয় সময় চেয়ে নিজে কোড formating

void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
  //
}

স্বতঃ বিন্যাসকরণ সরঞ্জামগুলি ব্যবহার করুন । এর কার্যকরী প্রয়োজনীয়তা অনুসারে ফাংশনটি লিখুন এবং স্বতঃ-বিন্যাসটি উপস্থাপনাটি পরিচালনা করতে দিন। ম্যানুয়ালি ফরম্যাটিং সামঞ্জস্য করা স্বয়ংক্রিয় বিন্যাস ব্যবহার করা এবং কোডের অন্যান্য দিকগুলি উন্নত করতে সাশ্রয়কৃত সময় ব্যবহার করার মতো দক্ষ নয়।

void MyClass::myFunction(const MyObject& obj, const string& s1, const string& s2, 
    const string& s3) {
  // 
}

-1

যতক্ষণ সম্ভব কনস্টকে দৃশ্যমান রাখা ভাল। এটি কোড রক্ষণাবেক্ষণকে অনেক উন্নত করে (এই পদ্ধতিটি আমার যুক্তিগুলিকে পরিবর্তন করে কিনা তা অনুমান করার কোনও অনুমান নেই)।

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


একমত। আমি এটি উল্লেখ করতে দ্বিধা ছিল। সুতরাং, "চরম কেস"।
শে

@ মাস্টার যা বলেছিল, কখনও কখনও নির্দিষ্ট প্রোগ্রামারগুলির সাথে কিছু নির্দিষ্ট প্রসঙ্গে, এটি পাঠযোগ্য হতে পারে। উদাহরণস্বরূপ, উইন্ডোজ এপিআই কলগুলিতে কোমর-গভীর কোনও প্রোগ্রামের খুব নির্দিষ্ট ক্ষেত্রে, সেই পরিবেশের সাথে অভ্যস্ত এমন পাঠকের সাথে উদাহরণস্বরূপ স্টাফ typedef Point * LPPOINTএবং typedef const Point * LPCPOINTঅতি অযৌক্তিক হওয়া সত্ত্বেও একটি নিখুঁত অর্থ বহন করে, কারণ এটি তাত্ক্ষণিক প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ প্রেক্ষাপটে. তবে সাধারণ ক্ষেত্রে কখনও হয় না; আমি ভাবতে পারি এটি কেবল একটি অদ্ভুত ব্যতিক্রম।
জেসন সি

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