বুলিয়ান ফাংশন যুক্তি যেগুলি "মিথ্যা"?


19

কিছু ওপেন সোর্স প্রকল্পগুলি থেকে, আমি নিম্নলিখিত কোডিং শৈলীটি সংগ্রহ করেছি

void someFunction(bool forget);

void ourFunction() {
  someFunction(false /* forget */);
}    

falseএখানে সবসময় কী বোঝাতে চাই তা নিয়ে আমার সবসময় সন্দেহ থাকে । এর অর্থ কি "ভুলে যাওয়া", বা "ভুলে যাওয়া" এর সাথে সম্পর্কিত প্যারামিটারের (যেমন উপরের ক্ষেত্রে যেমন) বোঝায়, এবং "মিথ্যা" বলতে কি তা তুচ্ছ করে বোঝানো হয়েছে?

অস্পষ্টতা এড়াতে কোন স্টাইলটি প্রায়শই ব্যবহার করা হয় এবং সবচেয়ে ভাল উপায় (বা আরও ভাল কিছু উপায়) কী?


38
বুলের পরিবর্তে এনামগুলি ব্যবহার করুন (কেবলমাত্র 2 টি বিকল্প রয়েছে)
এসাইলাইজা

21
কিছু ভাষা নাম যুক্তি সমর্থন করে। এই জাতীয় ভাষায়, আপনি ব্যবহার করতে পারেনsomeFunction(forget: true);
ব্রায়ান

3
আমি ফ্ল্যাগ আর্গুমেন্টগুলিতে মার্টিন ফাউলারের যুক্তি (বুলিয়ান সেটার সম্পর্কেও কথা বলি) দিতে বাধ্য বোধ করি । সাধারণভাবে এগুলি এড়াতে চেষ্টা করুন।
এফগ্রিগ

3
স্পষ্টত বেলবোর করার জন্য, মন্তব্যগুলি মিথ্যা বলতে পারে। সুতরাং আপনার কোডটি স্ব-ডকুমেন্টিং করা সর্বদা ভাল, কারণ কিছু মন্তব্য পরিবর্তন trueকরে falseআপডেট করবেন না। আপনি এপিআই পরিবর্তন করতে পারবেন না, তাহলে সবচেয়ে ভালো উপায় মন্তব্য করতে এই হলsomeFunction( false /* true=forget, false=remember */)
মার্ক Lakata

1
@ বাকুরিউ - আসলে, আমি সম্ভবত পাবলিক এপিআইয়ের দুটি পৃথক পদ্ধতি ( sortAscendingএবং sortDescending, বা অনুরূপ) থাকতে পারি। এখন, ভিতরে , তারা উভয়ই একই বেসরকারী পদ্ধতি কল করতে পারে, যার মধ্যে এই জাতীয় প্যারামিটার থাকতে পারে। আসলে ভাষাটি যদি সমর্থন করে তবে সম্ভবত আমি যা যাব তা লম্বা ফাংশন যা সাজানোর দিকনির্দেশ ছিল ...
ক্লকওয়ার্ক-মিউজিক

উত্তর:


33

আপনার পোস্ট করা নমুনা কোডটিতে দেখে মনে হচ্ছে forgetএটি একটি পতাকা যুক্তি। (আমি নিশ্চিত হতে পারি না কারণ ফাংশনটি নিখুঁত অনুমানমূলক))

পতাকা আর্গুমেন্ট একটি কোড গন্ধ। তারা ইঙ্গিত দেয় যে একটি ফাংশন একাধিক কাজ করে এবং একটি ভাল ফাংশনটি কেবল একটি কাজ করে।

পতাকা যুক্তি এড়াতে, ফাংশনটি দুটি ফাংশনে বিভক্ত করুন যা ফাংশনের নামের মধ্যে পার্থক্য ব্যাখ্যা করে।

পতাকা যুক্তি

serveIceCream(bool lowFat)

কোনও পতাকা যুক্তি নেই

serveTraditionalIceCream()
serveLowFatIceCream()

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


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


4
+17, হেলমেট চালু। শরীরের চেহারা serveTraditionalIceCreamএবং serveLowFatIceCreamদেখতে কি? আমার 14 ধরণের আইসক্রিম রয়েছে en
জনমার্ক

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

@ অ্যারন "ফিচার হিংসা" দ্বারা আপনি কী বোঝাতে চেয়েছেন?
গিগ

27

সাধারণ মানুষের কথায়:

  • false একটি আক্ষরিক।
  • আপনি একটি আক্ষরিক উত্তীর্ণ হয় false
  • আপনি someFunctionভুলতে বলছেন
  • আপনি বলছেন someFunctionযে প্যারামিটারটি ভুলে গেছেfalse
  • আপনি someFunctionমনে রাখতে বলছেন

আমার মতে যদি ফাংশনটি এমন হয় তবে ভাল হবে:

void someFunction(bool remember);

আপনি এটি কল করতে পারেন

void ourFunction() {
  someFunction(true);
} 

বা পুরানো নাম রাখুন তবে এতে আপনার র‍্যাপার ফাংশনটি পরিবর্তন করুন

void ourFunctionWithRemember() {
  someFunction(false);
} 

সম্পাদনা করুন:

@ ভোরাক যেমন বলেছে, সদা ইতিবাচক শব্দ ব্যবহার করার চেষ্টা করুন। দ্বিগুণ অবহেলা বিভ্রান্তিকর।


15
ইতিবাচক শব্দ ব্যবহার করার জন্য ধারণার জন্য ধারণার জন্য +1। দ্বিগুণ অবহেলা বিভ্রান্তিকর।
ভোরাক

1
সম্মত, দুর্দান্ত ধারণা। সিস্টেমকে কিছু না করার কথা বলা বিভ্রান্তিকর। যদি কোনও বুলিয়ান প্যারামিটার গ্রহণ করে থাকে তবে তা ইতিবাচকভাবে প্রকাশ করুন।
ব্র্যান্ডন

বেশিরভাগ ক্ষেত্রে, আমি মনে করি যে আপনি rememberযদি ফাংশনটির নামটি remember খুব স্পষ্টতার অর্থ না করে থাকেন তবে আপনি এর চেয়েও বেশি নির্দিষ্ট হতে চাই । rememberToCleanUp* or *persistঅথবা অন্যকিছু.
ব্রুস

14

প্যারামিটারটি ভাল নামযুক্ত হতে পারে; ফাংশনটির নাম না জেনে বলা শক্ত। আমি অনুমান যে মন্তব্য ফাংশনের মূল লেখক দ্বারা লিখিত হয়, এবং এটি কি ক্ষণস্থায়ী একটি অনুস্মারক ছিল falseমধ্যে someFunctionমানে, কিন্তু কেউ পরে বরাবর আসার জন্য, এটি প্রথমে নজরে একটু স্পষ্ট নয়।

একটি ব্যবহার ইতিবাচক পরিবর্তনশীল নাম (ইন প্রস্তাবিত কোড সম্পূর্ণ হয়েছে ) সহজ পরিবর্তন এই পড়া, যেমন সহজ snippet করতে হবে হতে পারে

void someFunction(boolean remember);

তারপরে ourFunctionহয়ে যায়:

void ourFunction() {
    someFunction(true /* remember */);
}

তবে, একটি এনাম ব্যবহার করে কিছু সমর্থনকারী কোডের ব্যয় করে ফাংশন কলটি বুঝতে আরও সহজ করে তোলে:

public enum RememberFoo {
    REMEMBER,
    FORGET
}

...

void someFunction(RememberFoo remember);

...

void ourFunction() {
    someFunction(RememberFoo.REMEMBER);
}

আপনি যদি someFunctionকোনও কারণে স্বাক্ষর পরিবর্তন করতে অক্ষম হন তবে অস্থায়ী ভেরিয়েবল ব্যবহার করে কোডটি পড়াও সহজ হয়, মানুষের দ্বারা কোডটি পার্স করা সহজ করার পরিবর্তে অন্য কোনও কারণে ভেরিয়েবল প্রবর্তন করে শর্তসীমা সহজ করার মতো সাজানো sort ।

void someFunction(boolean remember);

...

void ourFunction() {
    boolean remember = false;
    someFunction(remember);
}

1
rememberসত্যে সেট করা মানে ভুলে যাওয়া (আপনার উদাহরণে someFunction(true /* forget */);)?
ব্রায়ান

2
এটি enumএখন পর্যন্ত সেরা সমাধান is শুধু কারণ একটি টাইপ করতে পারেন একটি হিসাবে প্রতিনিধিত্ব করা bool-ie, তারা isomorphic এটা হয় মানে এই নয় যে এটা করা উচিত এই ধরনের হিসাবে প্রতিনিধিত্ব করা। একই যুক্তি stringএমনকি এমনকি প্রযোজ্য int
জন পুরী

10

ভেরিয়েবলটির নতুন নাম দিন যাতে একটি বুল মানটি বোঝায়।

এই নামটি অস্পষ্ট কারণ একটি ফাংশন যুক্তি ব্যাখ্যা করতে একটি মন্তব্য যুক্ত চেয়ে মিলিয়ন গুণ ভাল।


3
যে প্রশ্নের উত্তর দেয় না। যখন পদ্ধতিটি সংজ্ঞায়িত করা হয় এবং একই ফাইলে 4 লাইন আলাদা করে ডাকা হয় তখন সমস্ত জিনিস সুস্পষ্ট হয়। তবে এই মুহুর্তে যদি আপনি যা দেখেন সবাই আহ্বানকারী কি হয়? যদি এর একাধিক বুলেট থাকে? কখনও কখনও একটি সরল ইন-লাইন মন্তব্য অনেক দীর্ঘ যায়।
ব্র্যান্ডন 18

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

5

আরও বর্ণনামূলক নামের সাথে একটি স্থানীয় বুলিয়ান তৈরি করুন এবং এর মান নির্ধারণ করুন। অর্থটি আরও স্পষ্ট হবে।

void ourFunction() {
    bool takeAction = false;  /* false means to forget */
    someFunction( takeAction );
}    

আপনি যদি ভেরিয়েবলটির নাম পরিবর্তন করতে না পারেন তবে মন্তব্যটি আরও কিছুটা ভাবপূর্ণ হওয়া উচিত:

void ourFunction() {
    /* false means that the method should forget what was requested */
    someFunction( false );
}    

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

@ স্টিভেন বার্নাপ - ধন্যবাদ! আপনি ঠিক বলেছেন যে আমার পুরানো উত্তরটি ওপি-র প্রশ্নের সমাধানের ক্ষেত্রে যথেষ্ট পরিষ্কার ছিল না। এটি আরও স্পষ্ট করার জন্য আমি এটি সম্পাদনা করেছি।

3

একটি ভাল নিবন্ধ রয়েছে যা এই সঠিক পরিস্থিতির উল্লেখ করে কারণ এটি Qt- স্টাইল এপিআইগুলি বোঝায়। সেখানে, এটি বুলিয়ান প্যারামিটার ট্র্যাপ বলে এবং এটি পড়ার মতো।

এর সূচনাটি হ'ল:

  1. ফাংশনটি ওভারলোড করা যাতে বুলের প্রয়োজন হয় না তা আরও ভাল
  2. একটি এনাম ব্যবহার করা (যেমন এসাইলাইজার পরামর্শ অনুসারে) সেরা

2

এটি একটি উদ্ভট মন্তব্য।

সংকলকের দৃষ্টিকোণ থেকে, someFunction(false /* forget */);আসলে someFunction(false);(মন্তব্য প্রত্যাহার করা হয়)। সুতরাং, সমস্ত লাইনটি someFunctionসেট করা প্রথম (এবং কেবল) আর্গুমেন্টের সাথে কল করা false

/* forget */প্যারামিটারের নাম মাত্র। এটি সম্ভবত দ্রুত (এবং নোংরা) অনুস্মারক ছাড়া আর কিছুই নয়, আসলে সেখানে থাকার দরকার নেই। কেবলমাত্র একটি কম अस्पष्ट প্যারামিটার নাম ব্যবহার করুন এবং আপনার কোনও মন্তব্য করার প্রয়োজন হবে না।


1

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

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


1 কয়েকটি জটিল কোড মন্তব্য করা ঠিক আছে।


বিটিডব্লু কে এরকম কিছু বলেছিলেন: "সবচেয়ে খারাপ প্রোগ্রামারের সমস্যাটি হল ভেরিয়েবলের নাম কীভাবে রাখা যায় এবং একে একে অফসেট করা হয়"?
BЈовић

4
আপনি সম্ভবত এটির উত্স হিসাবে martinfowler.com/bliki/TwoHardThings.html অনুসন্ধান করছেন । আমি "কম্পিউটার সায়েন্সে দু'টি শক্ত জিনিস আছে: ক্যাশে অবৈধকরণ, জিনিসগুলির নামকরণ এবং একটি ত্রুটি দ্বারা বন্ধ" শুনেছি।

1

স্পষ্টত বেলবোর করার জন্য, মন্তব্যগুলি মিথ্যা বলতে পারে। ব্যাখ্যা করার জন্য মন্তব্যে অবলম্বন না করে আপনার কোডটি স্ব-ডকুমেন্টিং করা সর্বদা ভাল, কারণ কিছু ব্যক্তি (সম্ভবত আপনি) মন্তব্যটিতে পরিবর্তন trueকরবেন falseএবং আপডেট করবেন না।

আপনি যদি এপিআই পরিবর্তন করতে না পারেন তবে আমি 2 টি বিকল্প অবলম্বন করি

  • মন্তব্যটি পরিবর্তন করুন যাতে কোডটি নির্বিশেষে এটি সর্বদা সত্য true যদি আপনি কেবল একবার এটি কল করেন তবে এটি একটি ভাল সমাধান, যেহেতু এটি দলিলপত্র স্থানীয় রাখে।
     someFunction (মিথ্যা / * সত্য = ভুলে যান, মিথ্যা = মনে রাখবেন * /); ``
  • # ডেফাইনস ব্যবহার করুন, বিশেষত যদি আপনি এটি একাধিকবার কল করেন।
     # নির্ধারণ করা সত্য
     # সংক্ষিপ্ত স্মরণে রাখা মিথ্যা
     someFunction (স্মরণ কর);

1

মন্তব্যটি সর্বদা সত্য করা সম্পর্কে আমি উত্তরটি পছন্দ করি তবে ভাল বলে আমি মনে করি যে এই কোডটির সাথে এটি মৌলিক সমস্যাটি বাদ দেয় - এটি আক্ষরিক দিয়ে ডাকা হচ্ছে।

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


-1

সি # তে, আমি এই পরিষ্কার করার জন্য নামযুক্ত পরামিতি ব্যবহার করেছি

someFunction(forget: false);

বা enum:

enum Memory { Remember, Forget };

someFunction(Memory.Forget);

বা অতিরিক্ত লোড:

someFunctionForget();

বা বহুমুখিতা:

var foo = new Elephantine();

foo.someFunction();

-2

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

void printTree(Tree tree, bool shouldPrintPretty){ ... }

ইত্যাদি। আপনি যখন অন্য কারও কোডটি উল্লেখ করছেন তখন মানগুলি পাস করার সময় কেবল মন্তব্য করা ভাল।


এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

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