সেরা অনুশীলন বুলিয়ান অ্যাসাইনমেন্ট [বন্ধ]


10

আমি অন্য কোনও বিকাশকারীর কাছ থেকে নেওয়া একটি প্রোগ্রামে আমি নিম্নলিখিত শর্তাধীন এসেছি:

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

আমি বিশ্বাস করি যে এই কোডটি অপ্রয়োজনীয় এবং কুৎসিত, তাই আমি এটিকে এটি পরিবর্তিত করেছিলাম যা তুলনাের ভিত্তিতে একটি সাধারণ বুলিয়ান অ্যাসাইনমেন্ট বলে মনে করি:

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

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

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE) ? true : false;

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

এখানে আসল প্রশ্নটি হল বুলেটিয়ানকে একটি মূল্য নির্ধারণের এই তিনটি পদ্ধতির মধ্যে obj.NeedsChangeকোনটি সবচেয়ে স্পষ্ট এবং সবচেয়ে রক্ষণাবেক্ষণযোগ্য?


25
তৃতীয় রূপটি হাস্যকর; এটি কেবল উল্লেখ করছে যা ইতিমধ্যে দ্বিতীয় ফর্মের মধ্যে স্পষ্টরূপে স্পষ্ট হওয়া উচিত।
রবার্ট হার্ভে

6
এটি সম্পূর্ণ ব্যক্তিগত পছন্দ পর্যন্ত pre আমরা অন্যথায় ভান করতে পারি, তবে তারা সমস্ত কার্যত সমতুল্য হওয়ায় এটি স্টাইলে ফোটে । অবশ্যই, পঠনযোগ্যতার মধ্যে পার্থক্য রয়েছে তবে আমার "পাঠযোগ্য এবং স্বচ্ছ" হতে পারে আপনার "
অবসেস

3
@ স্ক্রিপ্টিন 5-8 লাইন ভি 1 লাইনটি পছন্দের চেয়ে বেশি, 5-8 লাইনার সাধারণত এটি পরিষ্কার হয় এবং এর জন্য আরও ভাল। এই সাধারণ উদাহরণে, আমি 1 লাইনটি পছন্দ করি তবে সাধারণভাবে আমি খুব বেশি 10 টি লাইনার দেখেছি যা সান্ত্বনার জন্য 1-লাইনারে আবদ্ধ ছিল। এটি দেওয়া, আমি ভেরিয়েন্ট 1 সম্পর্কে কখনও অভিযোগ করব না, এটি সুন্দর নাও হতে পারে তবে এটি কাজটি ঠিক স্পষ্ট এবং স্পষ্টতই বলে।
gbjbaanb

4
বিকল্প 1 এবং 3 আমাকে বলে "লেখক আসলেই বুলিয়ান যুক্তি বুঝতে পারে না"।
26-এর

2
ভেরিয়েন্ট 1 কার্যকর হতে পারে যদি আপনার প্রায়শই একটি ব্রেকআপপয়েন্ট সেট করতে হয় যা মানের উপর নির্ভর করে।
ইয়ান

উত্তর:


39

আমি 2 পছন্দ করি তবে আমি এটিতে সামান্য সমন্বয় করতে পারি:

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

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


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

প্যারেন্থিসগুলি পাইথনে ডাবল অ্যাসাইনমেন্ট আটকাতে পারে। এমনকি যে ভাষাগুলিতে তারা দ্বিগুণ কার্যনির্বাহীতা রোধ করে না, সেখানে প্রথম বন্ধনী অবশ্যই ইঙ্গিত দেয় যে আপনি দুটি ধরণের ক্রিয়াকলাপ নিয়ে কাজ করছেন।
ব্যবহারকারী 2357112 18-15 এ মনিকা

23

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

ভেরিয়েন্ট 2 যা আমি সর্বদা লিখব এবং পড়তে আশা করব expect আমি মনে করি যে এই আইডিয়ামটি দ্বারা বিভ্রান্ত যে কেউ সফ্টওয়্যার এর পেশাদার লেখক হওয়া উচিত নয়।

বৈকল্পিক 3 1 এবং 2 উভয়ের অসুবিধাগুলি একত্রিত করে ''


ওয়েল, ভেরিয়েন্ট 1 এর সুবিধাটি 2 রূপের সাথে ভাগ করে ...
প্রতিলিপি

1
শিশুদের কোডের জন্য +1। আমি বছরের পর বছর ধরে এই জাতীয় কোডটি দেখছি, এটি সনাক্ত করার জন্য আমার কাছে সঠিক শব্দটির অভাব ছিল।
লিলিয়েনথাল

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

13

যে কোনও সময় কোডটি জটিল হওয়ার চেয়ে এটি আরও জটিল হয় "এটি কী করার কথা বলেছে?" পাঠক গন্ধ।

উদাহরণস্বরূপ, প্রথম উদাহরণটি আমাকে অবাক করে তোলে, "যদি / অন্য বিবৃতিতে অন্য কোনও কার্যকারিতা ছিল যা মুছে ফেলা হয়েছিল?"

উদাহরণ (২) সহজ, পরিষ্কার এবং সঠিকভাবে যা প্রয়োজন তা করে। আমি এটি পড়েছি এবং সাথে সাথে কোডটি কী করে তা বুঝতে পারি understand

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


2

এটি সহজেই দেখতে পাওয়া যায় যে ভেরিয়েন্ট 2 এবং ভেরিয়েন্ট 1 স্পষ্টত এবং সহজ রিফ্যাক্টরিংগুলির একটি সিরিজের মাধ্যমে সম্পর্কিত:

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

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

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE)
{
    true
}
else
{
    false
}

বা আরও সংক্ষিপ্তভাবে লেখা:

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE) true else false

এখনই এটি অবিলম্বে স্পষ্ট হওয়া উচিত যে এটি শর্তটি সত্য বলে নির্ধারণ করে এবং শর্তটি মিথ্যা হলে মিথ্যা নির্ধারণ করে, IOW এটি শর্তের মান নির্ধারণ করবে, অর্থাত্ এটি সমান

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE

ভেরিয়েন্টগুলি 1 এবং 3 হ'ল এমন কারও কারও দ্বারা লিখিত রুকি কোড যা বুঝতে পারে না যে তুলনার ফেরতের মান কী।


আমি যদি আপনার (...) ... মিথ্যা অংশটি একটি সুন্দর মন্তব্যের ঠিক আগে একটি মন্তব্য হিসাবে যুক্ত করব তবে আপনি কোডের স্পষ্টতা এবং আরও ভাল কোডের মাধ্যমে সহজ স্ক্যান পাবেন।
ডেভএম

2

যদিও আপনার প্রোগ্রামিংটি স্পষ্টর দিকে ঝুঁকছে "যদি আপনার কোডটি বজায় রাখে এমন লোকটি হিংস্র মনোবিজ্ঞানী যে আপনি কোথায় থাকেন জানেন" তবে আপনি কয়েকটি প্রাথমিক বিষয় ধরে নিতে পারেন যা আপনার সাইকো উত্তরসূরি সক্ষম হবে।

এর মধ্যে একটি হ'ল তিনি যে ভাষাটি ব্যবহার করছেন তার বাক্য বাক্য গঠন

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

সি / সি ++ / সি # / জাভা / জাভাস্ক্রিপ্ট সিনট্যাক্স যিনি জানেন তাদের পক্ষে খুব স্পষ্ট।

এটি 8 লাইনের চেয়েও বেশি পঠনযোগ্য।

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

এবং ভুল কম ঝুঁকিপূর্ণ

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.Needschange = false;
}

এবং এটি অপ্রয়োজনীয় অক্ষর যুক্ত করার চেয়ে ভাল, যেন আপনি ভাষার বাক্য গঠনটি অর্ধ-ভুলে গেছেন:

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE ? true : false;

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE);

আমি মনে করি অনেক ভাষার সি-এর মতো সিনট্যাক্স সম্পর্কে অনেক ভুল রয়েছে: ক্রিয়াকলাপের অসামঞ্জস্য ক্রম, বাম / ডান অসামঞ্জস্যতা, চিহ্নগুলির ওভারলোডেড ব্যবহার, ব্রেস / ইনডেন্টেশন সদৃশ, টের্নারি অপারেটর, ইনফিক্স নোটেশন ইত্যাদি

তবে সমাধানটি এর নিজস্ব মালিকানাধীন সংস্করণ আবিষ্কার করার নয়। এইভাবে পাগলামিটি রয়েছে, যেমন প্রত্যেকে নিজের তৈরি করে।


সাধারণত # 1 টি জিনিস যা রিয়েল ওয়ার্ল্ড টিএম কোডটিকে অপঠনযোগ্য করে তোলে তার পরিমাণ এটি।

একটি অ-প্যাথলজিকাল 200 লাইন প্রোগ্রাম এবং একটি তুচ্ছ হিসাবে অভিন্ন 1,600 লাইন প্রোগ্রামের মধ্যে, সংক্ষিপ্ততরটি প্রায় সর্বদা পার্স করা এবং বুঝতে সহজ হবে। আমি যে কোনও দিন আপনার পরিবর্তনকে স্বাগত জানাব।


1

বেশিরভাগ বিকাশকারী এক নজরে দ্বিতীয় ফর্মটি বুঝতে সক্ষম হবেন। 1 ম ফর্ম হিসাবে সরলীকরণ সম্পর্কে আমার মতে সহজভাবে অপ্রয়োজনীয়।

আপনি স্পেস এবং ব্রেসেস যুক্ত করে পাঠযোগ্যতার উন্নতি করতে পারেন:

obj.NeedsChange =    obj.Performance <= LOW_PERFORMANCE;

অথবা

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

জ্যাকব রায়হলে যেমন উল্লেখ করেছেন

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