কীভাবে গভীর ইনডেন্টেশন রোধ করবেন? [বন্ধ]


17

আমার কোডে গভীর ইনডেন্টেশন রোধ করতে আমি কী পদক্ষেপ এবং ব্যবস্থা নিতে পারি?


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

3
একটি ছোট ট্যাব প্রস্থ ব্যবহার করুন।
মিপাদি

6
অ্যারোহেড অ্যান্টি-প্যাটার্ন। গুগল এটি, টিপস লোড
নিমচিম্পস্কি

2
অজগর ব্যবহার বন্ধ করুন: ডি
ব্যাকডোডস

আপনার নিয়ন্ত্রণ এবং লুপ যুক্তি দেখার সময় এসেছে। সম্ভবত আপনার কোডটি এটি হওয়া দরকারের চেয়ে জটিল এবং সমস্যাটির পুনরায় ধারণাটি অনেক ছোট সংকেতকে নিয়ে যাবে। ভাল কোড অধ্যয়ন করুন এবং কৌশলগুলি শিখুন।
ম্যাকনিল

উত্তর:


14

আপনার প্রোগ্রামের প্রতিটি ফাংশন / পদ্ধতি যদি একটি এবং কেবল একটি কাজ করে তবে ডিপ ইন্ডেন্টেশন সাধারণত কোনও সমস্যা হয় না। মাঝে মাঝে কন্ডিশনালগুলি কয়েক স্তরের গভীর করে নেওয়া প্রয়োজন হতে পারে তবে আমি সত্যই বলতে পারি যে আমি 12+ বছরের কোডিংয়ের জন্য কেবল গভীরভাবে ইন্টেন্টেড কোড লিখেছি hand


26

উত্তম পদ্ধতিগুলি আপনি যা করতে পারেন তা হ'ল:

int Step1(int state)
{
    if (state == 100)
    {
        return Step2(state);
    }
    else
    {
        return Step3(state);
    }
}

int Step2(int state)
{
    if (state != 100)
    {
        throw new InvalidStateException(2, state);
    }

    // ....
}

2
এটি জটিল- ifশর্তগুলির জন্যও কাজ করে । চূড়ান্তভাবে নেওয়া, আপনি এক্সিকিউটেবল সিউডোকোড দিয়ে শেষ করবেন।
অ্যালান বরই

অন্যান্য সেরা জিনিস যা আমরা করতে পারি তা হ'ল সম্ভবত অপ্রয়োজনীয় elseব্লকগুলি ফেলে দেওয়া ।
sepehr

16

আপনি গার্ড ক্লজ বিবেচনা করতে পারে ?

পরিবর্তে

public void DoSomething(int value){
    if (someCondition){
           if(someOtherCondition){
                if(yetAnotherCondition){
                       //Finally execute some code
                }
           }
    }
} 

ডু

public void DoSomething(int value){
    if(!(someCondition && someOtherCondition && yetAnotherCondition)){
        return;
        //Maybe throw exception if all preconditions must be true
    }
    //All preconditions are safe execute code
}

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

http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6

"গার্ড ক্লজ" সম্পর্কে আরও জানতে দেখুন: https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses


8

আপনার ifএস।

পরিবর্তে:

if (foo != null)
{
    something;
    something;
    if (x)
    {        
       something;
    }
    something;
}
else
{
    boohoo;
}

আমি লিখব:

if (foo == null)
{
    boohoo;
    return;
}
something;
something;
if (x)
{        
   something;
}
something;

ব্লকগুলি if- একই ক্ষেত্রে প্রযোজ্য else। যদি elseখাটো / কম বাসা বেধে থাকে তবে সেগুলি আবার ফিরিয়ে দিন।

প্যারামিটারের মানগুলি এক জায়গায় পরীক্ষা করুন

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


1
এই স্টাইলের কোনও নির্দিষ্ট নাম আছে?
টমাস লরিয়া

@ থমাস লৌরিয়া যে আমি জানতাম না এটা সবেমাত্র প্রস্থান করা। Ifকোডের শুরুতে যা কিছু শর্ত পূরণ না হওয়ার কারণে মৃত্যুদন্ড কার্যকর করা বন্ধ করে দেয় সেগুলিকে সুরক্ষা রক্ষা ধারা হিসাবেও পরিচিত , যেমন @ জেসনটুরান উল্লেখ করেছিলেন। এবং এটি একটি পৃথক নাম রাখার হিসাবে কাছাকাছি বলে মনে হচ্ছে।
কনরাড মোরাউস্কি

কয়েক বছর আগে আমার তত্ত্বাবধায়ক আমাকে বলেছিলেন যে এই স্টাইলটি "লিনিয়ার প্রোগ্রামিং" হিসাবে নামকরণ করা হয়েছিল, তবে আমি মনে করি এটিই তাঁর এক ভীতু;)
টমাস লরিয়া

4

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

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


2

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

এছাড়াও, চারটির পরিবর্তে দুটি স্পেস ইনডেন্ট করুন।


5
একবার আপনি নিজের ট্যাবের প্রস্থ পরিবর্তন করার পদক্ষেপে চলে গেলে, আপনি গভীর সমস্যায় পড়ে
যাবেন

দ্বি-স্পেস ট্যাবগুলি
ডেভিড থর্নলে

6
ইন্টেন্ট পরিবর্তন সমস্যা সমাধানের সমাধান নয়, আড়াল করার এক উপায়
মার্ফ

1

আমি মুছে ফেলার মতো শ্রেণীবদ্ধ সমস্যা হিসাবে গভীর সূচকগুলি দেখতে পাচ্ছি না (বা রিফ্যাক্টরিংকে সব কিছুর সত্য উত্তর হিসাবে দেখছি না)।

সাধারণত নেস্টেড আইএফ এর পরিবর্তে, আমি যৌক্তিক বিবৃতি লিখতে চাই:

if (foo && bar && baz) 

বরং

if foo 
 if bar
   if baz

সমস্যাটি হ'ল, এই নিয়মের আওতায় পড়ে না এমন লুপগুলির জন্যও রয়েছে এবং রয়েছে।
তমারা উইজসম্যান

@ টমউইজ: আমি শৈলী সম্পর্কে একটি আবশ্যকীয় আবশ্যক প্ররোচিত করার চেষ্টা করছি না।
পল নাথান


1

আমি নিজে এটি বিশ্বাস করি না, তবে কোড কমপ্লিট অনুসারে এটি ব্যবহারের উপযুক্ত স্থান break(যদি আপনার দলটি বোর্ডে থাকে)। আমি কল্পনা করেছিলাম এটি সি ++ প্রোগ্রামারদের কাছে আরও গ্রহণযোগ্য, যদিও এটি বিবরণীতে ডেলফি প্রোগ্রামারদের তুলনায় breakব্যবহার করা হয় switchযেখানে breakকেবল যখন আপনি whileলুপ লেখার মতো মনে করেন না তখনই ব্যবহৃত হয় ।


0

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

পরিবর্তে :

 {if (networkCardIsOn() == true)
     {if (PingToServer() == true)
        {if (AccesLogin(login,pass) == true)
             {if (nextCondition == true)
                ...
         }
     }
 }

আমি বর্তমানে লিখছি:

 {vbContinue = true;

 if (vbContinue) {
       vbContinue = networkCardIsOn();
       if (vbContinue == false) {
             code to Handle This Error();
       } 
 }

 if (vbContinue) {
       vbContinue = PingToServer();
       if (vbContinue == false) {
             code to HandleThisError2();
       } 
 }

 if (vbContinue) {
       vbContinue = AccesLogin(login,pass);
      if (vbContinue == false) {
             HandleThisErrorToo();
       } 
 }
 ...

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

আসলে, এই "কৌশল" দ্বারা প্রবর্তিত লাভটি কোডটি কম ঘন হওয়ার কারণে কোড জটিলতাটি সত্যই বিভক্ত।

কোডটি পড়ার সময় আপনাকে অতীতের পরিস্থিতি সম্পর্কে কিছু মনে রাখতে হবে না: কোডটিতে যদি আপনার সেই বিন্দুতে X থাকে তবে পূর্বের পদক্ষেপগুলি পাস হয়ে গেছে এবং সফল হয়েছে।

আর একটি লাভ হ'ল "যদি অন্যথায়" নেস্ট করা সমস্ত "escape


আপনি কীভাবে "রক্ষণাবেক্ষণ ব্যয়কে অর্ধেক ভাগ করে নিয়েছেন" এ সম্পর্কে বিস্তারিত ব্যাখ্যা করতে পারেন, তবে কীভাবে আপনি সত্যিই জানবেন যে কোনটি কার্যকর করা বন্ধ করে দেওয়া হয়েছে?
ক্রিস

আমি কিছু সম্পাদনা করেছি। আমি আশা করি আমি আপনার প্রশ্নের উত্তর দিয়েছি ...
পিয়েরে ওয়ালেটলেট

2
আপনি যদি আরও সরলভাবে যেতে চান তবে আপনার একটি গোটো ত্রুটি_হ্যান্ডলিং লাইন রয়েছে।
পল নাথান

ইহা সুন্দর না. দুঃখিত, তবে এটি ঠিক নয়। তারপরে আবার আমি অদ্ভুত
মার্ফ

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