c++ - যদি একটি লাইন বা লুপ জন্য ব্রেসেস(অর্থাত্{}) ব্যবহার করার উদ্দেশ্য কি?




সি++ প্রোগ্রামিং (16)

অন্য সব উত্তর আপনার লেকচারার এর রুল 3 রক্ষায়।

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

"কম্পোনেন্ট 10" এর উত্তরটি কেবলমাত্র কল্পনাযোগ্য ক্ষেত্রে হাইলাইট করে যেখানে এটি একটি ত্রুটি হতে পারে। কিন্তু অন্য দিকে, নিয়মিত অভিব্যক্তি মাধ্যমে কোড প্রতিস্থাপন সবসময় যেহেতু অত্যধিক যত্ন warrants।

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

শুরুতে অনেক গার্ড ক্লজ সহ একটি ফাংশন বিবেচনা করুন (এবং হ্যাঁ, নিম্নলিখিতটি C ++ কোড খারাপ তবে অন্যান্য ভাষায় এটি একটি সাধারণ পরিস্থিতি হবে):

void some_method(obj* a, obj* b)
{
    if (a == nullptr)
    {
        throw null_ptr_error("a");
    }
    if (b == nullptr)
    {
        throw null_ptr_error("b");
    }
    if (a == b)
    {
        throw logic_error("Cannot do method on identical objects");
    }
    if (not a->precondition_met())
    {
        throw logic_error("Precondition for a not met");
    }

    a->do_something_with(b);
}

এটি ভয়ানক কোড, এবং আমি দৃঢ়ভাবে যুক্তি দিয়েছি যে নিম্নলিখিতগুলি আরও বেশি পাঠযোগ্য:

void some_method(obj* a, obj* b)
{
    if (a == nullptr)
        throw null_ptr_error("a");
    if (b == nullptr)
        throw null_ptr_error("b");
    if (a == b)
        throw logic_error("Cannot do method on identical objects");
    if (not a->precondition_met())
        throw logic_error("Precondition for a not met");

    a->do_something_with(b);
}

একইভাবে, ছোট নিস্তেজ লুপগুলি কোঁকড়া বন্ধনীগুলিকে বাদ দেওয়ার থেকে উপকৃত হয়:

matrix operator +(matrix const& a, matrix const& b) {
    matrix c(a.w(), a.h());

    for (auto i = 0; i < a.w(); ++i)
        for (auto j = 0; j < a.h(); ++j)
            c(i, j) = a(i, j) + b(i, j);

    return c;
}

তুলনা করা:

matrix operator +(matrix const& a, matrix const& b) {
    matrix c(a.w(), a.h());

    for (auto i = 0; i < a.w(); ++i)
    {
        for (auto j = 0; j < a.h(); ++j)
        {
            c(i, j) = a(i, j) + b(i, j);
        }
    }

    return c;
}

প্রথম কোড সংক্ষিপ্ত হয়; দ্বিতীয় কোড bloated হয়।

এবং হ্যাঁ, পূর্ববর্তী লাইনের উপর খোলার বন্ধনী রেখে কিছুটা হ্রাস করা যেতে পারে। কিন্তু যে কোনও কোঁকড়া বন্ধনী ছাড়াই কোডের চেয়ে কম পাঠযোগ্য হবে।

সংক্ষেপে: স্ক্রীন স্পেসটি গ্রহণ করে এমন অপ্রয়োজনীয় কোড লিখবেন না।

আমি আমার সি ++ লেকচারারের কিছু বক্তৃতা নোট পড়ছি এবং তিনি নিম্নলিখিতটি লিখেছেন:

  1. ইন্ডেন্টেশন // ঠিক আছে ব্যবহার করুন
  2. অপারেটর অগ্রাধিকার উপর নির্ভর করবে না - সর্বদা বন্ধনী // // ওকে ব্যবহার করুন
  3. সর্বদা একটি {} ব্লক ব্যবহার করুন - এমনকি একটি লাইনের জন্য // // ঠিক নেই , কেন ???
  4. তুলনা বস্তুর বাম পাশ কনস্টেবল // ঠিক আছে
  5. ভেরিয়েবলগুলির জন্য অনির্দিষ্ট ব্যবহার করুন> = 0 // চমৎকার কৌশল
  6. মুছে ফেলার পরে NULL পয়েন্টার সেট করুন - ডাবল মুছে ফেলা সুরক্ষা // খারাপ না

3 য় কৌশল আমার কাছে স্পষ্ট নয়: একটি লাইন স্থাপন করে আমি কী লাভ করবো { ... } ?

উদাহরণস্বরূপ, এই অদ্ভুত কোডটি গ্রহণ করুন:

int j = 0;
for (int i = 0 ; i < 100 ; ++i)
{
    if (i % 2 == 0)
    {
        j++;
    }
}

এবং এটি দিয়ে প্রতিস্থাপন করুন:

int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;

প্রথম সংস্করণ ব্যবহার করার সুবিধা কি?


আমার 2 সি:

ইন্ডেন্টেশন ব্যবহার করুন

স্পষ্টত

অপারেটর অগ্রাধিকার উপর নির্ভর করবে না - সর্বদা বন্ধনী ব্যবহার করুন

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

সর্বদা একটি {} ব্লক ব্যবহার করুন - এমনকি একটি লাইনের জন্য

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

তুলনা বাম দিকে কনস্টেবল বস্তু

Yoda শর্তাবলী? না, দয়া করে। এটা পাঠযোগ্যতা ব্যাথা। আপনি আপনার কোড কম্পাইল যখন শুধু সর্বোচ্চ সতর্কতা স্তর ব্যবহার করুন।

> = 0 ভেরিয়েবলের জন্য স্বাক্ষরিত ব্যবহার করুন

ঠিক আছে. যথেষ্ট মজার, আমি Stroustrup অসম্মতি শুনেছেন।

মুছে ফেলার পরে NULL পয়েন্টার সেট করুন - ডাবল মুছে ফেলুন সুরক্ষা

খারাপ পরামর্শ! একটি পয়েন্টার যা একটি মুছে ফেলা বা অ বিদ্যমান বস্তু নির্দেশ করে না।


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

আমি সম্মুখীন সবচেয়ে ঘন সমস্যাযুক্ত উদাহরণ এই হল:

if ( really incredibly stupidly massively long statement that exceeds the width of the editor) do_foo;
    this_looks_like_a_then-statement_but_isn't;

তাই যখন আমি বরাবর আসি এবং একটি বিবৃতি যুক্ত করতে চাই, আমি সতর্ক থাকি যদি আমি সহজেই এটির সাথে শেষ করতে পারি:

if ( really incredibly stupidly massively long statement that exceeds the width of the editor) do_foo;
{
    this_looks_like_a_then-statement_but_isn't;
    i_want_this_to_be_a_then-statement_but_it's_not;
}

ব্রাসিস যোগ করার জন্য ~ 1 সেকেন্ড সময় লাগে এবং কয়েকটি বিভ্রান্ত মিনিট ডিবাগিংয়ে আপনাকে সংরক্ষণ করতে পারে, কেন আপনি কখনও হ্রাস-অস্পষ্টতা বিকল্পের সাথে যেতে পারবেন না ? আমার মিথ্যা অর্থনীতি মত মনে হয়।


আমি সুস্পষ্ট যেখানে কিছু ক্ষেত্রে ছাড়া সর্বত্র {} ব্যবহার করছি। একক লাইন ক্ষেত্রে এক:

if(condition) return; // OK

if(condition) // 
   return;    // and this is not a one-liner 

আপনি ফিরে যাওয়ার আগে কিছু পদ্ধতি যোগ করার সময় এটি আপনাকে আঘাত করতে পারে। ইন্ডেন্টেশন নির্দেশ করে যে শর্তটি পূরণ হলে ফেরত কার্যকর হচ্ছে, কিন্তু এটি সর্বদা ফিরে আসবে।

স্ট্যাটমেন্ট ব্যবহার করে সি # অন্যান্য উদাহরণ

using (D d = new D())  // OK
using (C c = new C(d))
{
    c.UseLimitedResource();
}

যা সমতুল্য

using (D d = new D())
{
    using (C c = new C(d))
    {
        c.UseLimitedResource();
    }
}

উপরের অত্যন্ত বুদ্ধিমান প্রস্তাবগুলিতে যোগ করার জন্য, আমি এমন একটি উদাহরণ সম্মুখীন হয়েছিল যেখানে এটি জটিল হওয়ার কিছু কোড পুনরায় উল্লেখ করা হয়েছিল: আমি এক API থেকে অন্যটিতে স্যুইচ করার জন্য একটি খুব বড় কোডबेस পরিবর্তন করছিলাম। প্রথম API এ কোম্পানী আইডি সেট করার জন্য একটি কল ছিল:

setCompIds( const std::string& compId, const std::string& compSubId );

প্রতিস্থাপন প্রয়োজন দুটি কল:

setCompId( const std::string& compId );
setCompSubId( const std::string& compSubId );

আমি নিয়মিত এক্সপ্রেশন ব্যবহার করে এই পরিবর্তন সম্পর্কে সেট যা খুব সফল ছিল। আমরা astyle কোডটি পাস astyle , যা সত্যিই এটি খুব বেশি পাঠযোগ্য করে তোলে। তারপরে, পর্যালোচনার প্রক্রিয়ার মধ্য দিয়ে, আমি আবিষ্কার করেছি যে কিছু শর্তাধীন পরিস্থিতিতে এটি পরিবর্তন হচ্ছে:

if ( condition )
   setCompIds( compId, compSubId );

এটার জন্য:

if ( condition )
   setCompId( compId );
setCompSubId( compSubId );

যা পরিষ্কার ছিল না কি প্রয়োজন ছিল। প্রতিবন্ধকতার সাথে সম্পূর্ণরূপে ব্লকের মধ্যেই পুনরায় কাজ করা শুরু করে এবং তারপর নিজে কোনও জিনিস পরিবর্তন করে যা শেষ পর্যন্ত ভুল হয়ে যায় (অন্তত এটি ভুল হবে না।)

আমি লক্ষ্য করেছি যে astyle এখন বিকল্প --add-brackets যা আপনাকে বন্ধনীগুলি যুক্ত করার অনুমতি দেয় এবং আমি দৃঢ়ভাবে সুপারিশ করি যদি আপনি নিজের মতো একই অবস্থানে নিজেকে খুঁজে পান।


এটা আরও স্বজ্ঞাত এবং সহজে বুঝতে পারেন। এটা অভিপ্রায় পরিষ্কার করে তোলে।

এবং এটি একটি নতুন কোড বিবৃতি যোগ করার সময় একটি নতুন ব্যবহারকারী অজানাভাবে { , } মিস্ হতে পারে যখন কোড বিরতি না নিশ্চিত করে।


যদি আপনি { এবং } ব্যবহার না করেন তবে এটি হ'ল মন্তব্যগুলির সাথে নিয়ন্ত্রণ-প্রবাহকে দুর্ঘটনাক্রমে পরিবর্তন করা খুব সহজ। উদাহরণ স্বরূপ:

if (condition)
  do_something();
else
  do_something_else();

must_always_do_this();

যদি আপনি একটি লাইন মন্তব্য সহ do_something_else() মন্তব্য করেন তবে আপনি এটির সাথে শেষ করতে পারবেন:

if (condition)
  do_something();
else
  //do_something_else();

must_always_do_this();

এটি কম্পাইল, কিন্তু must_always_do_this() সবসময় বলা হয় না।

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


সবচেয়ে প্রাসঙ্গিক উদাহরণ আমি মনে করতে পারেন:

if(someCondition)
   if(someOtherCondition)
      DoSomething();
else
   DoSomethingElse();

if else কি সঙ্গে জোড়া হবে? ইন্ডেন্টেশন বোঝায় যে বাহ্যিক if else পায় তবে কম্পাইলার কীভাবে এটি দেখতে পাবে তা আসলেই নয়; অভ্যন্তরীণ if else পেতে হবে, এবং বাইরের if না। এই কোডটি আপনার প্রত্যাশাগুলি ব্যর্থ হতে পারে কেন তা যাচাই করার জন্য আপনাকে এটি জানতে হবে (অথবা এটি ডিবাগিং মোডে যেভাবে আচরণ করে দেখুন)। আপনি পাইথন জানেন যদি এটা আরও বিভ্রান্তিকর পায়; সেই ক্ষেত্রে আপনি জানেন যে ইন্ডেন্টেশন কোড ব্লকগুলি সংজ্ঞায়িত করে, তাই আপনি এটি ইন্ডেন্টেশন অনুসারে মূল্যায়ন করার আশা করবেন। সি #, তবে হোয়াইটস্পেস সম্পর্কে উড়ন্ত ফ্লিপ দেয় না।

এখন, যে বলেন, আমি তার মুখের উপর এই "সবসময় ব্যবহার বন্ধনী" নিয়ম সঙ্গে বিশেষভাবে একমত না। এটি কোডটি খুব উল্লম্বভাবে গোলমাল করে তোলে, এটি দ্রুত মাধ্যমে পড়ার ক্ষমতা হ্রাস করে। বিবৃতি যদি:

if(someCondition)
   DoSomething();

... তারপর এটা ঠিক মত লেখা উচিত। বিবৃতি "সর্বদা বন্ধনী ব্যবহার করুন" মত শব্দ "সবসময় বন্ধনী সঙ্গে গাণিতিক অপারেশন ঘিরে"। এটি খুব সহজ বিবৃতিটি a * b + c / d ((a * b) + (c / d)) , যা ঘনিষ্ঠ-বন্ধন (অনেকগুলি কোডারের বেন) হারিয়ে যাওয়ার সম্ভাবনা এবং কীসের জন্য ? অপারেশন ক্রম সুপরিচিত এবং ভাল-জোরপূর্বক হয়, তাই বন্ধনী অকার্যকর হয়। আপনি সাধারণত প্রয়োগ করা হবে এমন ক্রিয়াকলাপগুলির একটি ভিন্ন ক্রম প্রয়োগ করার জন্য কেবল বন্ধনী ব্যবহার করবেন: উদাহরণস্বরূপ a * (b+c) / d । ব্লক ব্রেস অনুরূপ; ডিফল্ট থেকে আলাদা হওয়া ক্ষেত্রে আপনি কী করতে চান তা সংজ্ঞায়িত করতে তাদের ব্যবহার করুন এবং "সুস্পষ্ট" নয় (বিষয়বস্তুর, তবে সাধারণত বেশ সাধারণ অর্থে)।


wrt 6: এটি নিরাপদ কারণ একটি নিল পয়েন্টার মুছে ফেলা একটি নন-op। সুতরাং যদি আপনি ভুলভাবে দুবার পথের মধ্য দিয়ে যান তবে আপনি মেমরি দুর্নীতির মেমরি মুক্ত করবেন না যা বিনামূল্যে হয় বা অন্য কিছুতে বরাদ্দ করা হয়।

এটি স্ট্যাটিক ফাইল স্কোপ বস্তু এবং এককটিগুলির সাথে বেশিরভাগ সমস্যা যা খুব পরিষ্কার জীবনযাপন করে না এবং ধ্বংস হয়ে যাওয়ার পরে পুনরুজ্জীবিত হওয়ার জন্য পরিচিত হয়েছে।

বেশিরভাগ ক্ষেত্রে, auto_ptrs ব্যবহার করে আপনি এটির প্রয়োজনীয়তা এড়াতে পারেন


আমি প্রথম তারপর দ্বিতীয় স্পষ্ট হতে বিবেচনা। এটি বন্ধ নির্দেশাবলীর অনুভূতি দেয়, কোডটি জটিল হলে কোডটি খুব ভাল হয় তবে এটিতেও বা {...}অনেকগুলি সহায়তা করেendifbegin...end

//first
int j = 0;
for (int i = 0 ; i < 100 ; ++i)
{
    if (i % 2 == 0)
    {
        j++;
    }
}


//second
int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;
i++;

আমি সবসময় {}একক লাইন জন্য ব্যবহার না স্বীকার করতে হবে , কিন্তু এটি একটি ভাল অভ্যাস।

  • দেখবেন যে আপনি এমন কোনও কোড লিখেন যা এই রকম দেখাচ্ছে:

    জন্য (int i = 0; আমি <100; ++ i) (int j = 0; j <100; ++ j) doSingleStuff ();

এবং কিছু সময়ের পরে আপনি jলুপে অন্য কিছু স্টাফ যোগ করতে চান এবং আপনি কেবল সারিবদ্ধতার সাথে এটি করেন এবং বন্ধনী যোগ করতে ভুলবেন।

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

    যদি (...) {// SomeStuff ... {// আমাদের কাছে নেই তবে, ইত্যাদি, // // SomeOtherStuff} // SomeMoreStuff}

  • এটি ব্যবহার করার তৃতীয় উপায় দ্বিতীয় সঙ্গে অনুরূপ। এটি শুধু স্ট্যাক ক্লিনার তৈরি করতে নয় তবে কিছু ফাংশন খুলতে । আপনি যদি mutexদীর্ঘ ফাংশনে ব্যবহার করেন তবে সাধারণত তথ্য অ্যাক্সেস করার আগে কেবল লক এবং আনলক করুন এবং এটি পড়ার / লেখার শেষ করার পরেই ভাল। নোট এই ভাবে যদি আপনি কিছু আপনার নিজের আছে ব্যবহার করছে classবা structসঙ্গে constructorএবং destructorমেমরির লক করতে।

  • আর কি:

    যদি (...) যদি (...) SomeStuff (); অন্য কেউ অন্য স্টাফ (); // যদি দ্বিতীয়টি যায়, তবে অ্যালগমেন্টটি দেখায় এটি প্রথম ...

সর্বোপরি, আমি বলতে পারি না, সর্বদা {}একটি লাইনের জন্য সর্বদা ব্যবহার করার সেরা উপায় কী তবে এটি করা কোনও খারাপ কাজ নয়।

গুরুত্বপূর্ণ সম্পাদনা আপনি যদি একক লাইনের জন্য কম্পাইলিং কোড বন্ধনীগুলি লেখেন তবে কিছুই করে না, তবে আপনার কোডটি ব্যাখ্যা করা হলে এটি খুব সামান্য সামান্য কোডটি হ্রাস করে। খুব সামান্য.


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

if (condition) doSomething();
else doSomethingElse();

if (condition) doSomething();
    doSomething2(); // Looks pretty obviously wrong
else // doSomethingElse(); also looks pretty obviously wrong

কন্ট্রোল স্টেটমেন্ট লেখার কয়েকটি সম্ভাব্য উপায় আছে; তাদের কিছু সমন্বয়যোগ্যতা impairing ছাড়া সহ-বিদ্যমান হতে পারে, কিন্তু অন্যান্য সমন্বয় সমস্যা হতে পারে। শৈলী

if (condition)
  statement;

কন্ট্রোল স্টেটমেন্ট লেখার অন্য কিছু উপায়ে সান্ত্বনা সহকারে সমবেত হবে, কিন্তু অন্যদের সাথে এটি ভাল নয়। যদি বহু-লাইন নিয়ন্ত্রিত বিবৃতিগুলি লিখিত হয়:

if (condition)
{
  statement;
  statement;
}

তারপর এটি দৃশ্যমান সুস্পষ্ট হবে যা ifবিবৃতিগুলি একক লাইনকে নিয়ন্ত্রণ করে এবং কোনটি একাধিক লাইন নিয়ন্ত্রণ করে। তবে, মাল্টি-লাইন ifবিবৃতিগুলি এভাবে লেখা হয়েছে:

if (condition) {
  statement;
  statement;
}

তারপর ifপ্রয়োজনীয় ধনুর্বন্ধনী ছাড়া একটি একক বিবৃতি গঠন প্রসারিত করার চেষ্টা করার সম্ভাবনা অনেক বেশি হতে পারে।

ifকোডবেসে ফর্মটির উল্লেখযোগ্য ব্যবহার করলে একক-বিবৃতি-পরবর্তী-পরবর্তী লাইন বিবৃতি সমস্যাযুক্ত হতে পারে

if (condition) statement;

আমার নিজস্ব পছন্দ হল যে তার নিজস্ব লাইনটিতে বিবৃতিটি সাধারণত ifএকই রকম নিয়ন্ত্রণের ব্লকগুলির সাথে অনেক বিবৃতির ক্ষেত্রে ব্যতিক্রম ছাড়াও সুস্পষ্টতা বাড়ায়।

if (x1 > xmax) x1 = xmax;
if (x1 < xmin) x1 = xmin;
if (x2 > xmax) x2 = xmax;
if (x2 < xmin) x2 = xmin;
etc.

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


কারন আপনার কাছে দুটি বিবৃতি থাকলে {}, কোনও সমস্যা মিস করা সহজ। আসুন মনে করি কোডটি এ রকম দেখাচ্ছে।

int error = 0;
enum hash_type hash = SHA256;
struct hash_value *hash_result = hash_allocate();

if ((err = prepare_hash(hash, &hash_result))) != 0)
    goto fail;
if ((err = hash_update(&hash_result, &client_random)) != 0)
    goto fail;
if ((err = hash_update(&hash_result, &server_random)) != 0)
    goto fail;
if ((err = hash_update(&hash_result, &exchange_params)) != 0)
    goto fail;
    goto fail;
if ((err = hash_finish(hash)) != 0)
    goto fail;

error = do_important_stuff_with(hash);

fail:
hash_free(hash);
return error;

এটা জরিমানা দেখাচ্ছে। এটির সমস্যাটি মিস করা সত্যিই সহজ, বিশেষ করে যখন কোডটি ধারণ করে এমন কোডটি বড় হয়। সমস্যাটি goto failনিঃশর্তভাবে চলছে। আপনি সহজেই কল্পনা করতে পারেন যে এটি কীভাবে হতাশাজনক (আপনাকে জিজ্ঞাসা করা হচ্ছে কেন hash_updateসর্বদা সর্বদা ব্যর্থ হয়, সবকিছু ঠিকঠাক দেখায় পরে hash_update)।

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

if (something) goto fail;

কিন্তু নিম্নলিখিত এক না।

if (something)
    goto fail;

যদি আপনি একটি কম্পাইলার, এটি কোন পার্থক্য না। উভয় একই।

কিন্তু প্রোগ্রামারদের জন্য, প্রথমটি আরও স্পষ্ট, পড়া সহজ এবং কম ত্রুটি-প্রবণ।


সর্বদা কোঁকড়া ধনুর্বন্ধনী হচ্ছে খুব সহজ এবং শক্তসমর্থ নিয়ম। তবে অনেকগুলি ধনুর্বন্ধনী থাকলে কোডটি অসাধারণ দেখতে পারে। নিয়ম কোঁকড়া ধনুর্বন্ধনী বাদ দিতে অনুমতি দেয় তাহলে আরো বিস্তারিত শৈলী নিয়ম এবং আরো অত্যাধুনিক সরঞ্জাম হতে হবে। অন্যথায় এটি সহজেই বিশৃঙ্খল এবং বিভ্রান্তিকর (মার্জিত) কোডের সাথে হতে পারে। অতএব স্টাইল গাইড এবং সরঞ্জাম বাকি থেকে পৃথক একক শৈলী নিয়ম খুঁজছেন সম্ভবত ফলহীন। আমি কেবলমাত্র সেই নিয়ম # 3 সম্পর্কে কিছু গুরুত্বপূর্ণ বিবরণ আনব যা অন্যান্য উত্তরগুলিতে উল্লেখ করা হয়নি।

প্রথম আকর্ষণীয় বিবরণ যে নিয়ম অধিকাংশ সমর্থক ক্ষেত্রে লঙ্ঘন করতে সম্মত হন else। অন্য কথায় তারা পর্যালোচনা কোডের জন্য দাবি করে না:

// pedantic rule #3
if ( command == Eat )
{
    eat();
}
else
{
    if ( command == Sleep )
    {
        sleep();
    }
    else
    {
        if ( command == Drink )
        {
            drink();
        }
        else
        {
            complain_about_unknown_command();
        }
    }
}

পরিবর্তে, তারা যদি এটি দেখতে পায় তবে তারা এমনটি লিখতেও পরামর্শ দিতে পারে:

// not fully conforming to rule #3
if ( command == Eat )
{
    eat();
}
else if ( command == Sleep )
{
    sleep();
}
else if ( command == Drink )
{
    drink();
}
else
{
   complain_about_unknown_command();
}

যে টেকনিক্যালি যে নিয়ম এর লঙ্ঘন আছে যেহেতু কোন কোঁকড়া বন্ধনী আছে elseএবং if। নিয়মহীনতার এই দ্বৈততা যখন কোনও মনের সরঞ্জাম দিয়ে স্বয়ংক্রিয়ভাবে কোড বেস এ প্রয়োগ করার চেষ্টা করবে। প্রকৃতপক্ষে, যুক্তি কেন, কেবল একটি শৈলী স্বয়ংক্রিয়ভাবে আবেদন করতে দেয়।

দ্বিতীয় বিবরণ (যে নিয়মের সমর্থকদের দ্বারা প্রায়ই ভুলে যাওয়া হয়) হল যে যে ত্রুটিগুলি ঘটতে পারে তা শুধুমাত্র সেই নিয়ম # 3 এর লঙ্ঘনের কারণে হয় না। প্রকৃতপক্ষে যারা প্রায় সবসময় নিয়ম # 1 লঙ্ঘন জড়িত (যে কেউ এক সঙ্গে যুক্তি)। স্বয়ংক্রিয় সরঞ্জামগুলির দৃষ্টিকোণ থেকে আবার, এমন একটি সরঞ্জাম তৈরি করা কঠিন নয় যা নিয়ম # 1 লঙ্ঘন হওয়ার পরে অবিলম্বে অভিযোগ করে এবং তাই অধিকাংশ ত্রুটি সময়মত ধরা যেতে পারে।

তৃতীয় বিবরণ (যে নিয়মের বিরোধীদের দ্বারা প্রায়ই ভুলে যাওয়া হয়) হ'ল খালি বিবৃতির বিভ্রান্তিকর প্রকৃতি যা একক সেমিকোলন দ্বারা উপস্থাপিত হয়। কিছু অভিজ্ঞতার সাথে বেশিরভাগ ডেভেলপার খুব শীঘ্রই বা পরে বিভ্রান্তিকর সেমিকোলন দ্বারা বা একমাত্র সেমিকোলন ব্যবহার করে খালি বিবৃতি দ্বারা বিভ্রান্ত হয়ে পড়ে। একক সেমিকোলন পরিবর্তে দুটি কোঁকড়া ধনুর্বন্ধনী স্পট স্পষ্টভাবে সহজ উপায়।








defensive-programming