ELSE খারাপ প্রোগ্রামিং ব্যবহার করছে? [বন্ধ]


18

আমি প্রায়শই বাগটি ব্যবহার করেছি যা ELSEকনস্ট্রাক্ট ব্যবহারের কারণে তৈরি হয়েছে caused একটি প্রধান উদাহরণ হ'ল লাইন বরাবর কিছু:

If (passwordCheck() == false){
    displayMessage();
}else{
    letThemIn();
}

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

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

আপনার অ্যাপ্লিকেশনগুলিতে প্রবেশ করা বাগ / সুরক্ষা সমস্যাগুলি রোধ করার পক্ষে এটি সর্বোত্তম উপায়।

কিভাবে আপনাকে বলছি এটা করবেন?


3
আপনার জন্য সুরক্ষা সমস্যাটি কী? "পাসওয়ার্ডচেক" এর অর্থ কী? একটি পাসওয়ার্ড চেক ছিল? একটি পাসওয়ার্ড চেক করা প্রয়োজন? ব্যবহারকারী কেটে গেছে? ব্যবহারকারী সঠিক পাসওয়ার্ড প্রবেশ করতে ব্যর্থ হয়েছে?
লেনিপ্রোগ্রামারগুলি

20
I know that passwordCheck is likely to be a boolean...আপনি কি বোঝাতে চেয়েছেন? যে কোনও শক্ত-টাইপিত ভাষায়। আপনি এটি হতে চান passwordCheckযা হবে।
ববি

31
আমি মনে করি খারাপ ইনডেন্টেশন অনুশীলনগুলি elseবিবৃতি ব্যবহারের চেয়ে বেশি ত্রুটির দিকে পরিচালিত করে ...
gablin

15
এটি অদ্ভুত বলে মনে হচ্ছে। প্রথমত, আপনি passwordCheck()সম্ভবত বুলিয়ান না হওয়ার সম্ভাব্য ফিরতি সম্পর্কে অভিযোগ করেছেন (যা যুক্তিসঙ্গত উদ্বেগ হতে পারে), এবং তারপরে আপনি এটি দোষারোপ করবেন else? কি elseকারণে সমস্যা আছে তা আমি দেখছি না ।
ডেভিড থর্নলি

8
মিমি, আমার মনে হয় অন্যটি ব্যবহার করা খারাপ প্রোগ্রামিংয়ের জন্য জিজ্ঞাসা করা খারাপ প্রোগ্রামিং
Muad'Dib

উত্তর:


90

elseব্লক সবসময় কি ডিফল্ট আচরণ হতে চান উপস্থিত থাকা জরুরী।

এগুলি এড়াতে হবে না, এগুলি যথাযথভাবে ব্যবহার করতে সাবধান হন।

আপনার উদাহরণে, ডিফল্ট রাষ্ট্রটি অ্যাক্সেসের অনুমতি না দেওয়া উচিত। একটু রিফ্যাক্টরিং আপনাকে এগুলি ছেড়ে দেয়:

If (passwordCheck)
{
   letThemIn();
}
else
{
   displayMessage();
}

উদাহরণস্বরূপ, যদি পাসওয়ার্ড চেক কাজ করে তবে তাদের প্রবেশ করুন, অন্যথায় কিছু ত্রুটি বার্তা দেখাতে সবসময় বৈধ।

আপনি অবশ্যই else ifপৃথক পৃথক ifবিবৃতি না দিয়ে ব্যবহার করে আপনার যুক্তিতে অতিরিক্ত চেক যুক্ত করতে পারেন ।


2
@ ডেভ.বি উদাহরণের প্রসঙ্গে, আমি অনুমান করি এটি একটি সুরক্ষা সমস্যা হবে, তবে আপনি যে কোড বেজটির দিকে তাকিয়ে রয়েছেন এটি যদি পুরো জায়গা জুড়ে থাকে তবে এটি যে লিখেছে তাকে আরও কিছুটা বেশি প্রয়োজনের এটি একটি চিহ্ন more অনুশীলন :)
RYFN

9
কেউ কি এর সুরক্ষা দিকটি বিশদভাবে বলতে পারেন? যদি (! কিছু) {do a} else {do ​​b} বনাম যদি (কিছু) b do b} else {do ​​a যৌক্তিকভাবে সমান হয় না? আমি এটির সুরক্ষার ক্ষেত্রে পার্থক্যটি কী তা বোঝার চেষ্টা করছি?
ক্রিস

11
@ ক্রিস: আমি মনে করি ওপি একটি দুর্বল টাইপযুক্ত ভাষা ব্যবহার করে। অতএব passwordCheckকিছু, ফে হতে পারে null, যা রেন্ডার হবে passwordCheck == falseথেকে falseএবং ব্যবহারকারী একটি অভ্যন্তরীণ ত্রুটির কারণে লগ-ইন করার অনুমতি দেয় হবে।
ববি

1
@ ক্রিস, আমার বোঝাপড়াটি ছিল যে ডিফল্ট রাষ্ট্রটি অ্যাক্সেসের অনুমতি দেওয়া ছিল, যা অগত্যা পরামর্শ দেওয়া উচিত নয়।
RYFN

3
হ্যাঁ, এটি খুব ভাষা নির্ভর। সি # তে, যেখানে ifএকটি প্রয়োজন bool, অবশ্যই অবশ্যই ভেরিয়েবলগুলি বরাদ্দ করা উচিত, সমস্ত পাথের অবশ্যই একটি মান প্রদান করা উচিত, ইত্যাদি, আমি কোনও কারণের ক্রম ifএবং elseপাঠযোগ্যতার বাইরেও গুরুত্বপূর্ণ বিবেচনা করতে পারি না । অর্থাৎ এর if(a){b();}{c();}সমতুল্য হওয়া উচিত if(!a){c();{b();}। অন্যদিকে জাভাস্ক্রিপ্টে আপনাকে সচেতন passwordCheckহতে হবে যে তা হতে পারে undefinedইত্যাদি ইত্যাদি
টিম গুডম্যান

57

না, এতে কোনও ভুল নেই ELSEELSEনতুন নয় GOTO। আসলে, IFএর পরিবর্তে দুটি ব্যবহার ELSEকরা বেশ কয়েকটি সমস্যার কারণ হতে পারে।

প্রথম উদাহরণ:

if (this(is(a(very())==complex(check())))) {
   doSomething();
}

if (!this(is(a(very())==complex(check())))) {
   doTheOtherThing();
}

আপনি কপি পেস্ট দেখতে পাচ্ছেন? এটি কেবল সেই দিনের অপেক্ষা করে যখন আপনি একটি পরিবর্তন করেন এবং অন্যটিকে ভুলে যান।

উদাহরণ দুটি:

foreach(x in y) {
  if (first_time) {
    first_time = false;
    doSomething();
  }

  if (!first_time) {
    doTheOtherThing();
  }
}

আপনি দেখতে পাচ্ছেন, দ্বিতীয়টিও IFপ্রথম আইটেমটির জন্য কার্যকর করা হবে, কারণ শর্তটি ইতিমধ্যে পরিবর্তিত হয়েছে। বাস্তব বিশ্বের প্রোগ্রামগুলিতে, এই ধরনের বাগগুলি খুঁজে পাওয়া শক্ত।


12
আমি এটার সাথে একমত. একটি ifবিবৃতি অনুলিপি-পেস্ট করা এবং তার বুলিয়ান এক্সপ্রেশনকে উল্টানো কেবল একটি এড়াতে else- এখন এটি খারাপ প্রোগ্রামিং! আপনি কেবল কোড নকল করছেন না ( খারাপ প্রোগ্রামিং), আপনি কর্মক্ষমতাও কমিয়ে দিচ্ছেন (যদি চেকটি সত্যই জটিল হয় তবে আপনি এখন এটি দু'বার করছেন - বা-- আহ, ভাল, তারা জানেন যে অকালিক অনুকূলতা সম্পর্কে তারা কী বলেছে আজকাল ... এত ভাল প্রোগ্রামিং না!)।
গ্যাবলিন

সত্য বলতে সত্য যে সত্য / মিথ্যা
বিলি.বব ফেরার জন্য চেকটি

ভাল উদাহরণস্বরূপ, চেক বনাম যদি অন্যের সাথে জুটিবদ্ধ হয় তবে 2 ব্যবহারের পারফরম্যান্সটি ভুলে যাবেন না। আমি বেশিরভাগ ভাষায় একটি if / অন্যটি শর্তে নয় এমন একটি ব্যবহার করে বিবৃতি দিয়ে দুটি ব্যবহার করার চেয়ে আরও ভাল পারফরম্যান্স ব্যবহার করে অনুধাবন করব।
ক্রিস

1
dave.b: অবশ্যই, তবে এটি সহজ শুরু করতে পারে এবং ধীরে ধীরে বৃদ্ধি পেতে পারে; আমার উদাহরণটিতে জটিল চেকটি সমস্যাটি আরও সুস্পষ্ট করতে এখানে।
ব্যবহারকারী 281377

3
হ্যাঁ - এবং ভুলে যাবেন না যে শর্তগুলির বেশিরভাগ ভাষায় পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং শর্তগুলির মধ্যে যদি কোন কার্যকারিতা থাকে তবে আপনি যা দেখে সত্যই বলতে পারবেন না।
ডেভিড থর্নলি

18

সবসময় একটি ELSE থাকে। যদি লিখি

if(foo)
  bar();

আপনি আসলে লিখুন

if(foo)
{
  bar();
}
else
{
   // do nothing
}

আপনি ইএলএসই-পথে যা কিছু রাখুন তা আপনার দায়িত্ব।


7
-1। এই উত্তরটি খুব হাস্যকর। আমি এটা সত্য বলছি না। এটা ঠিক পয়েন্ট মিস। আপনার কোড থেকে যা সংকলন উত্পন্ন হয় তার কোডিং অনুশীলন এবং আপনি যে বাগগুলি লিখেন তার সাথে কোনও সম্পর্ক নেই

3
প্রশ্নগুলি ছিল "ই এল এস ই খারাপ প্রোগ্রামিং ব্যবহার করছে?" আমার উত্তর: আপনি ভান করতে পারেন এটি সেখানে নেই, তবে এড়াতে পারবেন না।
লেনি প্রোগ্রামার

5
কী ভাষা ? জাভাতে অন্যটি বাইটকোডে নেই: পি
আইএডাপ্টার

@ অ্যাসিডজম্বি 24 - কোনও প্রশ্ন থেকে 'অন্য' কী তা বিবেচনা করা খুব ভাল অনুশীলন। কখনও কখনও এটি ঠিক - ফুকশনে অন্য কিছু করুন, তবে এটি আপনাকে এটি সম্পর্কে ভেবে দেখেছেন
মার্টিন বেকেট

14

আমি ব্যক্তিগতভাবে elseযতটা পারি এড়াতে ঝোঁক , তবে এটি কোনও সুরক্ষা সমস্যার জন্য নয় ।

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

if (checkPassword != OK) { displayMessage(); return; }

letThemIn();

এই ক্ষেত্রে প্রযোজ্য forএবং whileলুপ যা আমি ব্যবহার করবে continueএবং breakযখনই খাঁজ একটি স্তর এড়াতে।

ক্রিস ল্যাটনার এলএলভিএম কোডিং স্ট্যান্ডার্ডগুলিতে আমার চেয়ে আরও ভাল বলে ।


আমি রাজী. "অন্য" একটি মানসিক "কাঁটাচামচ" তৈরি করে এবং আমরা মানুষ ক্রমান্বয়ে জীব।
ব্যবহারকারী 187291

Fyi, এটি একটি প্রহরী শর্ত বলা হয়
CaffGeek

@ চাদ: আহ ধন্যবাদ, জিনিসগুলির নাম পেতে সর্বদা সুন্দর :)
ম্যাথিউ এম।

1
+1 টি। এটিই কেবলমাত্র আমি উত্তর দিতে পারি যে এর স্কোর> 1 রয়েছে 1 *writes an answer*

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

5

তারপরে এগুলি প্রতিস্থাপন করুন,

If (passwordCheck == true)
{
     letThemIn();
}
else
{
     displayMessage();
}

21
কীভাবে If ((passwordCheck == true) == true)? :-)
হিপ্পো

1
ভাল এটা আমার স্টাইল, পাঠযোগ্যতার উন্নতি করতে। আপনি যদি (! মান) লিখতে পারেন তবে আমি যদি পছন্দ করি তবে (মান! = সত্য)
আহমেট কাক্কে

7
এটি পাঠযোগ্যতার উন্নতি করে না। এটি কেবল শব্দ যোগ করে। তার চেয়েও খারাপ প্রোগ্রামাররা যারা বুলিয়ান অপারেটরদের ভয়ে ভীত হয়ে থাকেন কেবল সেইজন্য নির্মাণগুলি লিখলে বাসা বাঁধে।
ak2

3
যদি ভেরিয়েবলের নাম বর্ণনামূলক হয় তবে এর কোনও কারণ নেই: যদি (কিছু বুলিয়ানভ্যালু == সত্য) প্রয়োজন হয়। এটি আরও ভাল হবে: যদি (বৈধ পাসওয়ার্ড) {...
মার্ক ফ্রিডম্যান

ঠিক আছে আমি প্রশ্নের মধ্যে কোড ব্লক প্রতিস্থাপন করেছি। আপনি যদি আমার প্রথম মন্তব্যটি পড়ে থাকেন তবে আমি বলেছিলাম যে আমি যদি (! মান) পরিবর্তে (মান! = সত্য) ব্যবহার করতে পছন্দ করি। আমি আশা করি আপনি (মান) এবং যদি (! মান) এর মধ্যে পার্থক্যটি দেখতে পাচ্ছেন। আমার অর্থ আমি পরিপূরক অপারেটর ব্যবহার করি না। অন্যথায় আপনি সঠিক, সত্য মানে সত্য।
আহমেত কাক্কি

3

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

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

নোট করুন যে কার্যকরী প্রোগ্রামিংয়ের কিছু চূড়ান্ত সমর্থকরা ifপ্যাটার্ন মেলানোর পক্ষে ... সম্পূর্ণরূপে মুক্তি পাওয়ার প্রস্তাব দেয় ... আমার স্বাদের জন্য কিছুটা চরম extreme :-)


1
পার্শ্ব নোট হিসাবে: আপনার যদি আপনার খাঁটি কার্যকরী ভাষায় কোনও নির্মাণ থাকে তবে আপনার অন্য একটি দরকার have প্রতিটি অভিব্যক্তি কিছু না কিছু ফিরিয়ে দিতে হবে!
টোকল্যান্ড

2

ইএলএসই ব্যবহার করে কোনও ভুল নেই। তবে এটি অতিরিক্ত জটিল কোডের দিকে নিয়ে যেতে পারে যা পড়া এবং বোঝা শক্ত to এটি একটি খারাপ নকশা নির্দেশ করতে পারে। এটি অবশ্যই অতিরিক্ত ব্যবহারের ক্ষেত্রে ইঙ্গিত করে যা পরীক্ষা করার প্রয়োজন হবে।

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

আপনার বিশেষ সমস্যার জন্য চেষ্টা করার পদ্ধতি:

  • পলিমারফিজম ব্যবহার করুন। আপনার সিস্টেমের সীমানায় ব্যবহারকারীর সুরক্ষা শংসাপত্রগুলি বৈধতা দিন। যদি তারা বৈধ হয় তবে একটি সেশন অবজেক্টটি ফিরিয়ে দিন - সিস্টেমের প্রাসঙ্গিক অংশগুলিতে অ্যাক্সেস সহ বা একটি ব্যতিক্রম নিক্ষেপ করুন। তবে এটি আপনাকে সিস্টেমকে আরও জটিল করে তুলতে পারে। সুতরাং আপনি বুঝতে এবং বজায় রাখা সহজ কি সিদ্ধান্ত নেন।

সাধারণভাবে - নিম্নলিখিতগুলি আপনার কোডে ইএলএসই হ্রাস করতে সহায়তা করতে পারে:

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

2
আমি "আলাদা আলাদা ফাংশনে জটিল বুলিয়ান চেকগুলি সরান" অন্তর্ভুক্ত করব।
গ্যাবলিন

2

কোডটি সুরক্ষা ফাঁস হওয়ার বিষয়ে আপনার ধারণাটি আপনি যে ভাষাটি ব্যবহার করছেন তার উপর নির্ভর করে সত্য হতে পারে । সি কোডে এটি একটি সমস্যা হতে পারে (বিশেষত সিতে একটি বুলিয়ান কেবল একটি শূন্য বা শূন্য নয় এমন একটি শব্দ) - তবে বেশিরভাগ দৃ strongly়ভাবে টাইপ করা ভাষায় (যেমন রানটাইম টাইপ চেকিং) যদি passwordCheckভেরিয়েবলটি বুলিয়ান হিসাবে ঘোষণা করা হয়, এটিতে অন্য কিছু বরাদ্দ করার কোনও উপায় নেই। প্রকৃতপক্ষে, ifপ্রিপিকেটের প্রতিটি জিনিসই বুলিয়ান সমাধান করতে হবে, আপনি বুলিয়ান অপারেটর ব্যবহার করুন বা কেবল মানটি ব্যবহার করুন। যদি আপনি passwordCheckরানটাইমের সাথে আবদ্ধ অন্য ধরণের অবজেক্টটি পরিচালনা করতে সক্ষম হন তবে কিছু প্রকার অবৈধ কাস্ট ব্যতিক্রম ছুঁড়ে ফেলবেন।

যদি অন্যরকম কনস্ট্রাক্টগুলি নির্মাণ করা হয় তবে / যদি কনস্ট্রাক্টগুলি পড়ার চেয়ে পড়া সহজ হয় - এবং কেউ যদি নির্মাণটি উল্টানোর চেষ্টা করে তবে অমনোযোগী সমস্যার ঝুঁকি কম। এক সেকেন্ডের জন্য একই উদাহরণটি নেওয়া যাক:

if(passwordCheck == false) {
    denyAccess();
}

if(passwordCheck) {
    letThemIn();
}

আপনি উপরোক্ত কার্যকর করতে চান এমন পারস্পরিক একচেটিয়া ধারাগুলির অর্থ হারিয়ে গেছে। এটিই যদি অন্য / অন্যদের কাছে পৌঁছে দেয়। কার্যকর করার দুটি পারস্পরিক একচেটিয়া শাখা, যেখানে তাদের মধ্যে একটি সর্বদা চলবে। এটি সুরক্ষার একটি গুরুত্বপূর্ণ অঙ্গ - letThemInআপনি ফোন করার পরে কোনও উপায় নেই তা নিশ্চিত করে denyAccess

কোডের স্পষ্টতা এবং সমালোচনামূলক বিভাগগুলি সর্বাধিক সুরক্ষিত করার লক্ষ্যে, সেগুলি প্রাথমিক ধারা ( ifঅংশ) এর মধ্যে থাকা উচিত। ডিফল্ট অ-আনুগত্যমূলক আচরণটি বিকল্প ধারার ( elseঅংশ) মধ্যে হওয়া উচিত । উদাহরণ স্বরূপ:

if(passwordCheck) {
    letThemIn();
} else {
    denyAccess();
}

দ্রষ্টব্য: বিভিন্ন ভাষার সাথে কাজ করার জন্য, আমি একটি কোডিং হ্যাবিট তৈরি করেছি যা "যদি এটি স্ট্রিং হয় তবে" এর প্রশ্নটি এড়াতে সহায়তা করে? মূলত, এটি বুলিয়ান এক্সপ্রেশন মধ্যে ধ্রুবক প্রথম স্থাপন করা হয়। উদাহরণস্বরূপ, পরীক্ষা করার পরিবর্তেpasswordCheck == false আমি খুঁজে দেখছি false == passwordCheck। এটি সি ++ তে দুর্ঘটনাজনিত কার্যভার সমস্যাও এড়ানো যায়। এই পদ্ধতির ব্যবহার করে, আমি =পরিবর্তে টাইপ করলে সংকলকটি অভিযোগ করবে ==। জাভা এবং সি # এর মতো ভাষায়, সংকলক যদি বিধি হিসাবে অ্যাসাইনমেন্টটিকে একটি ত্রুটি হিসাবে বিবেচনা করে তবে সি ++ আনন্দের সাথে গ্রহণ করবে। এই কারণেই আমি nullপ্রথমটির সাথে নাল চেক করার প্রবণতাও রাখি ।

আপনি যদি নিয়মিতভাবে ভাষা পরিবর্তন করেন তবে ধ্রুবকটিকে প্রথমে স্থাপন করা খুব সহায়ক। যাইহোক, আমার দলে এটি কোডিং স্ট্যান্ডার্ডের বিপরীতে এবং সংকলক যে কোনওভাবেই এই সমস্যাগুলি ধরে ches এটি ভাঙ্গা একটি হার্ড অভ্যাস হতে পারে।


1

বলছে যে ব্যবহার করে elseপ্রোগ্রামিংয়ের সময় করা খারাপ বলে otherwiseবলা যেমন কথা বলার সময় ব্যবহার করা খারাপ like

অবশ্যই, সেগুলি উভয়ই খারাপ উপায়ে ব্যবহার করা যেতে পারে, তবে এর অর্থ এই নয় যে আপনি এড়াতে পারবেন কারণ আপনি ভুল করেছেন যা এগুলি অন্তর্ভুক্ত করেছে। বিবৃতিতে অনেকগুলি বাগ অনুপস্থিত defaultমামলার উপর নির্ভর করে থাকলে আমি অবাক হব না switch


1

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

Else নিজেই খারাপ নয়, তবে আপনি এটি খারাপ ব্যবহার করেন, আপনি অনাকাঙ্ক্ষিত প্রভাব দেখতে পারেন।

এছাড়াও, সম্পর্কে আপনার বিবরণ প্রসঙ্গে

"আমি জানি যে পাসওয়ার্ড চেক সম্ভবত বুলিয়ান হতে পারে তবে আমি আমার অ্যাপ্লিকেশনগুলিকে এর উপর সুরক্ষা দেব না।"

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


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

1
আলগাভাবে টাইপ করা ভাষায় এবং বিশেষত পিএইচপি-তে ফাংশনগুলি একাধিক ডেটা-টাইপ ফিরতে পারে। উদাহরণস্বরূপ: স্ট্রাস্টার- "ম্যাচ করা সাবস্ট্রিং ফিরিয়ে দেয় le যদি সন্ধান না পাওয়া যায় তবে মিথ্যা ফিরিয়ে দেয়"
ক্রেইজ

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

মজাদার. আমি কখনও পিএইচপি এর সাথে কাজ করি নি। যদিও ব্যাখ্যাটির জন্য ধন্যবাদ - সম্ভবত ভবিষ্যতে আমাকে সহায়তা করুন! জাভাস্ক্রিপ্ট এর মত সাজানোর মত?
মাইকেল কে

@ মিশেল - জাভাস্ক্রিপ্টের সাথে অনেকটা মিল।
ক্রেইজ

1

সবার আগে। হাঃ হাঃ হাঃ! এগুলি এড়ানোর জন্য কোনও কারণ নেই। এটি কোনওভাবেই আকার বা আকারে খারাপ অভ্যাস নয়।

কিছু হলে কোড হওয়া উচিত

if(!IsLoggedIn) { ShowBadLoginOrNoAccessPage(); return }

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

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

সম্পাদনা 2- আপনি / অন্য ব্যবহারের বিষয়ে যদি উদ্বিগ্ন হন। আমি আরও নোট করব যে আমার পছন্দটি সবচেয়ে কম সংখ্যক কোড ব্লককে শীর্ষে স্থাপন করা

if(cond == false) {
    a()
    b()
    c()
    onetwothree()
}
else
{
    a()
    b()
    c()
    more()
    onetwothree()
    code()
    longer()
}

বরং তারপর

if(cond) 
{
    a()
    b()
    c()
    more()
    onetwothree()
    code()
    longer()
}
else
{
    a()
    b()
    c()
    onetwothree()
}

0

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

foo = bar;

if ('fubar' == baz) {
    foo = baz;
}

পরিবর্তে ...

if ('fubar' == baz) {
    foo = baz;
} else {
    foo = bar;
}

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


0

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

একটি উদাহরণ হিসাবে, টেরিনারি অপারেটরগুলিও সাধারণত ভাল প্রার্থী হয়:

If VIP Then 
  Discount = .25
Else
  Discount = 0
End If
Total = (1 - Discount) * Total

একটি ত্রৈমাসিক পদ্ধতির ব্যবহার:

Discount = VIP ? .25 : 0
Total = (1 - Discount) * Total

টার্নারি অপারেটরগুলি একটি ভাল উপায়ে শাখা প্রশাখাকে ডানদিকে সরিয়ে দেয়।

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