স্টাইলিং যৌগ এবং / অথবা বিবৃতি যদি


13

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

if (
    (
        x == y
        && a != b
        && p.isGood() 
        && (
            i + u == b
            || q >= a
        )
    )
    || k.isSomething()
    || m > n
) {
    doSomething();
}

1
বোকা ইনডেন্টিং এবং বন্ধনী / ব্রেস কাঠামো ইচ্ছাকৃত বা শৈলীর অংশ?
এড এস

হাস্যকর. আমি এক সপ্তাহ আগে এসও তে একই প্রশ্ন জিজ্ঞাসা করেছি এবং এটি বন্ধ হয়ে যায়। কোথাও এই প্রশ্নটি জীবিত দেখে খুশি!
এরিক বেলার

উত্তর:


6

প্রতিটি ছোট পদক্ষেপের জন্য বুলিয়ান ভেরিয়েবলগুলি তৈরি করুন:

bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }

এটি অবশ্যই প্রতিটি পদক্ষেপের বিভিন্ন নাম বাদে ল্যাক্রিমোলজির উত্তরের অনুরূপ।

যদি আপনি নাম দেন step1, step2এবং step3এমনভাবে যেগুলি ধারণাগত ধারণাটি তৈরি করে, এটি সবচেয়ে সুস্পষ্টভাবে হওয়া উচিত। p.isGood()এবং k.isSomething()কখনও কখনও এমন পরিস্থিতিতে আহ্বান করা যেতে পারে যেখানে এটি আপনার মূল কোডে না থাকে, সুতরাং এই ফাংশনগুলি ব্যয়বহুল হলে বা আপনি খুব সংকীর্ণ লুপে এই কোডটি চালাচ্ছেন যদি এই বিকল্প হয় না।

অন্যদিকে, নতুন ভেরিয়েবল তৈরি করতে পারে এমন পারফরম্যান্সের আঘাতের বিষয়ে আপনার চিন্তা করার দরকার নেই; একটি ভাল সংকলক তাদের অপ্টিমাইজ করবে।

আয়তক্ষেত্রের সংঘর্ষ সনাক্তকরণের একটি উদাহরণ (যা সম্ভবত আপনি পূর্বোক্ত কর্মক্ষমতা হিটের কারণে ব্যবহার করবেন না):

if((a.x + a.width >= b.x || b.x + b.width >= a.x)
 && (a.y + a.height >= b.y || b.y + b.width >= a.y)
)
{ collision(); }

হতে পারে:

bool horizMatch = a.x + a.width >= b.x || b.x + b.width >= a.x;
bool vertMatch = a.y + a.height >= b.y || b.y + b.width >= a.y;
if(horizMatch && vertMatch) { collision(); }

এছাড়াও, আপনি যদি আপনার কোডটি এইভাবেই ছেড়ে যেতে চান তবে আমার ধারণা এটিও পুরোপুরি ঠিক আছে। আমি আন্তরিকভাবে মনে করি আপনার কোডটি যথেষ্ট সুস্পষ্ট। স্পষ্টতই আমি জানি না ঠিক a b x y i u p k m nকী, তবে যতটা কাঠামো যায় ততই আমার কাছে ভাল লাগে।


8

আমি যদি আমার শর্তাবলী জটিল হয়ে উঠি তবে আমি সাধারণত আমার কোডটিকে আরও মডুলার হতে ফ্যাক্টর করি।


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

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

দৃশ্যত যদিও, আপনি আপনার ফাংশন বাইরে ঝুঁকতে চান, এবং এটি ফাংশন ঠিক কি করে তা অবিলম্বে পরিষ্কার হবে না। আপনি স্ক্রোল আপ না হওয়া অবধি এটি একটি কালো বাক্স। আপনি যদি এমন ভাষায় না থাকেন যা ফাংশনগুলিতে ফাংশনগুলি সক্ষম করে, আপনি কতটা ভাল প্রতিবন্ধক হন তা নির্বিশেষে পাঠকের পক্ষে বা লেখকের পক্ষে এটি মোটেই সুবিধাজনক হবে বলে আমি মনে করি না। এবং যদি আপনি এমন কোনও ভাষায় থাকেন যা ফাংশনগুলিতে ফাংশনগুলিকে মঞ্জুরি দেয় তবে তার বাক্যবিন্যাস হ'ল পরিবর্তিতভাবে বাঁধাই বা ভেরিয়েবল ঘোষণার চেয়ে আলাদা, যেমন let x = a > bবা let f a b = a > b
রেই মিয়াসাকা

ভেরিয়েবলগুলি সমানভাবে ভাল কাজ করবে। আমি সেই রিফ্যাক্টরিংও বিবেচনা করব।
জনএফএক্স

আহ ঠিক আছে.
রেই মিয়াসাকা

8

জটিলতার এই স্তরে আমি এরকম আরও কিছু করব

bool doIt = x == y && a != b && p.isGood();
doIt &= ( i + u == b || q >= a);
doIt |= k.isSomething() || m > n;

if(doIt)
{
    doSomething();
}

এটি কুৎসিত, তবে এটি পঠনযোগ্য এবং আমি দৃ certain়ভাবে নিশ্চিত যে সংকলক এটি কীভাবে রিফ্যাক্টর করতে হবে তা জানবে।

অন্যদিকে, আমি যদি কখনও এই জাতীয় বিবৃতি লেখার মতো পরিস্থিতিতে নিজেকে দেখি তবে আমি সমাধানটি পুনর্বিবেচনা করছি, কারণ আমি এটাকে সহজ করার একটি উপায় আছে, বা কমপক্ষে কিছু শর্তকে বিমূর্ত করে ফেলছি (যেমন: সম্ভবত x == y && a != b && p.isGood()সত্যিই ঠিক বোঝায় this->isPolygon()এবং আমি সেই পদ্ধতিটি তৈরি করতে পারি;


4

আমি সময়ের সাথে উল্লম্ব সারিবদ্ধতায় কম আচ্ছন্ন হচ্ছি, তবে বহু লাইন প্রকাশের সাথে আমার সাধারণ ফর্মটি হ'ল ...

if (   (   (expr1 == expr2)
        || (expr3 == expr4)
        || (expr5 == expr6)
       )
    && (   (expr7 == expr8)
        || (expr9 == expra)
       )
   )
{
  blah;
}

গুরুত্বপূর্ণ দিক...

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

কখনও কখনও, আমি ফর্ম্যাট করব +এবং এটির *মতো কিছু অপারেটরও। বেশ কয়েকটি জটিল এক্সপ্রেশন একটি প্রোডাক্ট বা প্রোডাক্ট অফ-সম-ফর্ম গ্রহণ করে (এটি বুলিয়ান "অঙ্কগুলি" এবং "পণ্যগুলি" বোঝায়) তাই এটি সম্ভবত যথেষ্ট সাধারণ যে এটির জন্য একটি সামঞ্জস্যপূর্ণ স্টাইলটি উপযুক্ত।

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

আপনি যদি ডান পাশে আপনার ঘনিষ্ঠ-পেরেনগুলি স্ট্যাক করতে পছন্দ করেন তবে আমি এটি ঘৃণা করি না , তবে আমার ধারণা এটি খুব খারাপ নয়। খুব দূরে নিয়ে যাওয়া, আপনি ঝুঁকিটি চালান যে কোনও ভুল পেনড্রেসেসগুলি কী করে তবে ইন্ডেন্টেশনটি ভুল উপস্থাপন করতে পারে।

if (   (   (expr1 == expr2)
        || (expr3 == expr4)
        || (expr5 == expr6))

    && (   (expr7 == expr8)
        || (expr9 == expra)))
{
  blah;
}

+1 আমি আপনার স্টাইলিং পছন্দ করি। এটি আমার প্রশ্নের সরাসরি উত্তর দিয়েছে, তবে আমি মনে করি যে রি মিয়াসাক সমস্যার মূলটি পেরেক দিয়েছিল। যদি আমি কখনই রিয়ের পদ্ধতিটি করতে অলস হয় তবে আমি আপনার স্টাইলিংটি ব্যবহার করব।
জোজো

বাহ এটা সত্যিই দুর্দান্ত।
রেই মিয়াসাকা

1

http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

আমি জনএফএক্সের উত্তর এবং ল্যাক্রিমোলজির সাথে একমত। আমি ছোট ছোট লক্ষ্যগুলি অর্জন করে এবং তারপরে স্মার্ট উপায়ে গড়ে তুলি এমন একগুচ্ছ ক্রিয়াকলাপগুলি (প্রায়শই স্থির) তৈরি করব would

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

// Currently based on members or global vars
// (which is often a bad idea too)
function doSomethingCondirionally()
{
  if (k.isSomething() || m > n)
  {
    doSomething();
    return;
  }

  // Else ... 
  if (x != y) return;
  if (a == b) return;
  if (!p.isGood()) return;

  // Final, positive check
  if (i + u == b || q >= a)
  {
    doSomething();
  }
}

যদি কোনও ফাংশন থেকে কেবলমাত্র একটি প্রস্থান পয়েন্ট থাকা আপনার মূল্যকে মূল্য দেয় এমন কিছু জিনিস (যেমন আপনি যদি কার্যকরী ভাষায় থাকেন) তবে এটি সর্বোত্তম বিকল্প, এমনকি কোনও উপলভ্য বিকল্পও নাও হতে পারে। বলেছিল, হ্যাঁ, আমি প্রায়শই এটি করি।
রেই মিয়াসাকা

যদি এটি জাভাস্ক্রিপ্টের মতো ব্যাখ্যাযোগ্য ভাষা হয়?
জোজো

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

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

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

1

এটির জন্য মূল্যবান, আমি অবাক হয়ে দেখলাম যে আপনার উদাহরণটি দেখতে অনেক জটিল জটিল ভবিষ্যদ্বাণীগুলির মতো লাগে। আমি অন্যদের সাথে একমত যে একটি জটিল শিকারীতা রক্ষণাবেক্ষণযোগ্যতা বা পঠনযোগ্যতার পক্ষে সবচেয়ে বড় নয়, তবে মাঝে মাঝে সেগুলি সামনে আসে।

আমাকে জোর দিয়ে বলি যে আপনি এই অংশটি সঠিকভাবে করেছেন: && a != b কখনও লাইনটির শেষে লজিকাল সংযোজকটি রাখেনি , এটি দৃশ্যতভাবে মিস করা খুব সহজ। লাইনের শেষে অপারেটর রাখার দরকার নেই এমন অন্য কোনও স্থানে এই জাতীয় অপারেটরের ভাষায় স্ট্রিং কনকেন্টেশন হয়।

এটা কর:

String a = b
   + "something"
   + c
   ;

এটি করবেন না:

String a = b +
   "something" +
   c;

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

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

আমিও গাণিতিক অপারেটরদের উপসর্গ পছন্দ করি। আমি আমার প্রোগ্রামিং ক্যারিয়ারে শেষ অবধি বুঝতে পেরেছি :)
জোজো

0

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


0

আপনি কোডটি একাধিক বক্তব্যগুলিতে বিভক্ত করতে পারেন, এটি সহজ করে বোঝার জন্য। তবে একটি বাস্তব নিনজা এই জাতীয় কিছু করবে। :-)

if
(
    (
        x == y
    &&
        a != b
    &&
        p.isGood()
    &&
        (
            i + u == b
        ||
            q >= a
        )
    )
||
    k.isSomething()
||
    m > n
)
{
    doSomething();
}

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