শর্তগুলির ক্ষেত্রে দীর্ঘতম বিন্যাসের সবচেয়ে পঠনযোগ্য উপায়? [বন্ধ]


43

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

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

অথবা

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

অথবা

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

অথবা

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

বা অন্য কোন পছন্দ?

উত্তর:


30

প্রায়শই, শর্ত হ'ল কোডের সাইন যা রিফ্যাক্টরিং প্রয়োজন, তবে কখনও কখনও আপনি এড়াতে পারবেন না। এই ক্ষেত্রে, আমি প্রথম পছন্দ:

if (bar || baz || quux) { ... }

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

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

3
পার্শ্ব বনাম উল্লম্বভাবে স্ক্রোলিং প্রায় পুরানো দিনগুলিতে ছিল এমন সীমাবদ্ধতা নয় ...
বিল

2
এবং ফাংশনটিতে একটি অর্থপূর্ণ (ব্যবসায়) নাম দিন যাতে লোকেরা বুঝতে পারে যে এখানে কী পরীক্ষা করা হয়েছে।
ম্যাথিউ এম।

19

ধারাবাহিকতাটি নির্দেশ করতে অপারেটরদের শেষে রাখার মত আমি পছন্দ করি:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

1
আমি মনে করি আমি এটি পছন্দ করি। আমি অগ্রাধিকার ক্রমটি বুঝতে পারি তা নিশ্চিত করতে আমি প্রচুর বন্ধনী নিয়োগ করি।
জাসারিন

5
আমি লজিকাল অপারেটরগুলিকে লাইনের শুরুতে রেখে দেওয়া পছন্দ করি যাতে আমি একটি লাইন পড়ার সাথে সাথে সহজেই দেখতে পারি এটি শর্তের একটি অংশ এবং কেবল নিয়মের নিয়মিত লাইন নয়।

11

আমি অর্থপূর্ণ পরিবর্তনশীল নামের একটি বড় অনুরাগী:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

বা ফাংশন হিসাবে রিফ্যাক্টর, উপরে উল্লিখিত হিসাবে।


7

আমি মেসিয়ার সুবে এক্সপ্রেসনগুলি বা তাদের সমস্তগুলিকে বুল ভেরিয়েবল হিসাবে বের করে দিই। তারপরে 'যদি' বিবৃতিটির শীর্ষ স্তরের বুলিয়ান যুক্তিটি পরিষ্কার করা যায়। আমি যে ধরণের কাজ করি তা সর্বদা বেশিরভাগ জিনিসই ORed বা ANDed হয় না।

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

এটি একটি ডিবাগারে বিশেষত ভাল, যেখানে আমি যদি 'if' চালানোর আগে সমস্ত বুলের দিকে নজর দিতে পারি।


আমি এটিও পছন্দ করি তবে আপনি একটি উপকার হারাবেন: আর শর্ট সার্কিটের ব্যয়বহুল তুলনা আর সম্ভব নয়।

... এবং আপনি সমস্ত দিন ভেরিয়েবলের নামকরণে খুব ভাল হওয়া দরকার ...
ক্রোনভেল

6

আমি নতুন লাইনগুলির শুরুতে অপারেটরগুলিকে সারিবদ্ধ করার প্রবণতা রাখি যাতে আমি মনে করি কীভাবে আমি পদগুলি সংযুক্ত করছি (দীর্ঘ যুক্তি এবং দীর্ঘ পাটিগণিত উভয়ের জন্য)। এটার মত:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

এটি কেবল তখনই কাজ করে যদি আমি 2-স্পেসে ইন্ডেন্ট যুক্ত করি বা আমার পরিবেশকে ইনডেন্ট মাল্টলাইনে আরও পূর্বাভাস সেট করি তবে অন্যথায় ভবিষ্যদ্বাণীপূর্ণ শেষ এবং দরকারী কোডটি কোথায় শুরু হবে তা বলা শক্ত হবে।


0

আমি নিম্নলিখিত একটি ভক্ত:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

এইভাবে এখনও এটি একটি অভিব্যক্তির মতো দেখায় এবং ভাবটি যদি ভাঙা-ডাউন-টু-পিস হয় না। ইন্ডেন্টেশনটি দেখাতে সহায়তা করে যে এটি পূর্ববর্তী লাইনের ধারাবাহিকতা।

প্রারম্ভিক বন্ধনীটি পূর্ববর্তী লাইনের শেষে না হওয়া পর্যন্ত আপনি এটি প্রবর্তন করতে পারেন যাতে এটি যদি প্রকাশের শেষে থাকে তবে এটি অনুমান করা হয়।


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