বুলিয়ান যুক্তি রক্ষণাবেক্ষণ - বিবৃতি প্রয়োজন হলে বাসা বাঁধছে?


11

এর মধ্যে কোনটি রক্ষণাবেক্ষণের জন্য ভাল?

if (byteArrayVariable != null)
    if (byteArrayVariable .Length != 0)
         //Do something with byteArrayVariable 

অথবা

if ((byteArrayVariable != null) && (byteArrayVariable.Length != 0))
  //Do something with byteArrayVariable 

আমি দ্বিতীয়টি পড়তে এবং লিখতে পছন্দ করি তবে আমার কোডটি সম্পূর্ণরূপে পড়ার কথা মনে আছে যে এর মতো কাজ করা রক্ষণাবেক্ষণের পক্ষে খারাপ।

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

আমি জানি না যে এটি সত্যিই উদ্বিগ্ন হওয়ার মতো কিছু কিনা এবং আমি এই প্রশ্নের সাধারণ প্রতিক্রিয়া চাই।

ধন্যবাদ।


1
প্রথম ফর্মটিতে ঝুঁকির ঝুঁকি রয়েছে - অন্যদের
JBRWilkinson

শুধু কৌতূহলী, আপনি কোন ভাষা নিয়ে কাজ করছেন?
এসটিডাব্লু

@ এসটিডব্লিউ - আমরা সি # ব্যবহার করি এবং ডেলফিতে কিছু লিগ্যাসি কোড রয়েছে।
ভ্যাকাকানো

2
জানা ভাল. আমি ডেলফির সাথে পরিচিত নই তবে সি # তে আপনি সংক্ষিপ্ত-সার্কিট মূল্যায়ন করছেন &&এবং ||অপারেটরগুলির মধ্যে আত্মবিশ্বাসী হতে পারেন । একটি ভাষা থেকে অন্য ভাষায় যেতে সাধারণত কিছুটা গ্যাচাস থাকে এবং এই সামান্য সমস্যাগুলি ধরতে সহায়তা করার জন্য কোড পর্যালোচনা করা সম্পর্কে দৃ firm় হওয়া ভাল।
STW

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

উত্তর:


30

আমি মনে করি দ্বিতীয় ফর্মটি ভাল, এবং আপনি যা করার চেষ্টা করছেন তা আরও স্পষ্টভাবে উপস্থাপন করে। তুমি বলেছো এটা...

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

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


12
একমত। অন্য কোডে অনুলিপি করার সময় আমার কোডটি একই রকম চলবে কিনা কেন পৃথিবীতে আমি যত্ন করব?
টিম গুডম্যান 21

16

আমি অবাক হয়েছি কেউ এটি উল্লেখ করেনি (তাই আশা করি আমি প্রশ্নটি ভুল করে দেখছি না) - তবে উভয় স্তন্যপান!

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

এই মুহুর্তে আপনি এমন কিছু করবেন:

if ((byteArrayVariable == null) || (byteArrayVariable.Length != 0)) {
  return; // nothing to be done, leaving
}

// Conditions met, do something

এটি দেখতে অনেকটা বৈধতার মতো দেখাচ্ছে - এবং এটি ঠিক এটি। এটি যাচাই করে যে শর্তটি পদ্ধতিতে কাজটি করার জন্য সন্তুষ্ট হয়েছে - আপনি যে দুটি বিকল্প প্রস্তাব করেছিলেন তা প্রাক-শর্ত পরীক্ষার মধ্যে প্রকৃত যুক্তি লুকিয়ে রেখেছে।

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


জিম যেমন উল্লেখ করেছেন, কীভাবে প্রারম্ভিক-প্রস্থানকে কাঠামোগত করা যায় তা নিয়ে বিতর্কের অবকাশ রয়েছে । উপরেরটির বিকল্পটি হ'ল:

if (byteArrayVariable == null) 
  return; // nothing to be done, leaving

if (byteArrayVariable.Length != 0)
  return;

// Conditions met, do something

1
আমি ভাল যুক্তির মোড়কের পরিবর্তে ফিরে আসার সাথে একমত, তবে একই ব্যক্তিরা || ব্যবহার সম্পর্কে একই যুক্তি ব্যবহার করবেন জন্য &&.
এমআইএ

14

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

if (byteArrayVariable == null) Exit;
if (byteArrayVariable.Length == 0) Exit;
// do something

এটি আপনাকে নতুন শর্তের জন্য আপনার কোডটিকে আরও সহজ করে তুলতে দেয়

if (byteArrayVariable == null) Exit;
if (byteArrayVariable.Length == 0) Exit;
if (NewCondition == false) Exit;
if (NewerCondition == true) Exit;
// do something

2
+1 হ্যাঁ, হ্যাঁ, আপ এটির মতো সহজ যুক্তিযুক্ত ফলাফলের ফলে কঠিন কোড হওয়া উচিত নয়। আপনার (প্রশ্নকারী) অন্ত্রে এটি আপনাকে বলা উচিত।
চাকরি

11

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

if ((byteArrayVariable != null) && (byteArrayVariable.Length != 0))
  //Do something with byteArrayVariable 

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

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

যা যা বলেছিল, এটি এড়াতে অনেক বেশি পঠনযোগ্য এবং এসটিডাব্লু তাদের উত্তরে যা বলেছে তাতে সন্তুষ্ট না হলে কেবল পদ্ধতিটি থেকে বেরিয়ে আসুন।


দুটিরও বেশি শর্তাদি তাদের নিজস্ব ক্রিয়াকলাপের ওয়ারেন্ট দিতে পারে যা বাতিল করে দেয়।
চাকরি

3

এই উদাহরণে আপনার দুটি ধারাটি সরাসরি সম্পর্কিত, সুতরাং ২ য় ফর্মটি পছন্দনীয়।

যদি তারা সম্পর্কিত না হয় (উদাহরণস্বরূপ বিভিন্ন অবস্থার উপর প্রহরী ধারাগুলির একটি সিরিজ) তবে আমি 1 ম ফর্মটি পছন্দ করতাম (বা আমি এমন একটি পদ্ধতি সহ একটি পদ্ধতির প্রতিস্থাপন করব যা যৌগিক শর্তটি আসলে প্রতিনিধিত্ব করে)।


1

আপনি যদি ডেলফিতে কাজ করেন তবে প্রথম উপায়টি হ'ল সাধারণভাবে নিরাপদ। (প্রদত্ত উদাহরণের জন্য, নেস্টেড ifs ব্যবহার করে লাভ করার মতো খুব বেশি কিছু নেই))

ডেলফি আপনাকে বুলিয়ান এক্সপ্রেশনগুলি মূল্যায়িত করে বা "শর্ট সার্কিট" সংকলক সুইচের মাধ্যমে নির্দিষ্ট করতে দেয়। # 1 (নেস্টেড ifs) করার মাধ্যমে আপনি নিশ্চিত করতে পারবেন যে দ্বিতীয় ধারাটি কার্যকর হয় যদি এবং কেবল যদি (এবং কঠোরভাবে পরে ) প্রথম ধারাটি মূল্যায়ন করে।


1
ডেলফি বিকাশের 23 বছরে আমি কখনই "কমপ্লিট বুলিয়ান ইভাল" বিকল্পটি পরিবর্তন করি নি । আমি যদি অন্য কোথাও কোড শিপিং করতাম তবে আমি ইউনিটে $ OO বুলেটওয়াল অফ} বা {$ বি- put রেখে দিতাম।
গেরি

আমিও না. আমি সবসময় রেঞ্জ চেকিংও ব্যবহার করি ... তবে অন্য লোকেরা তা করে না। এবং এটা করা উচিত নয় সম্ভবত একটি কার্যকারিতা দৃষ্টিকোণ থেকে ছাড়া একটি পার্থক্য করতে becuase আপনি করা উচিত নয় বুলিয়ান এক্সপ্রেশন ব্যবহার করা ফাংশন পার্শ্ব প্রতিক্রিয়া ব্যবহার করা। আমি নিশ্চিত কেউ বাইরে আছে, যদিও!
ফ্র্যাঙ্ক শায়ারার

@ জিরি: সম্মত আপনি সম্ভবত সম্পূর্ণ মূল্যায়ন চাইতে পারার একমাত্র কারণ হ'ল পার্শ্ব প্রতিক্রিয়া - এবং শর্তাধীন পার্শ্ব প্রতিক্রিয়াগুলি একটি খারাপ ধারণা!
লরেন পেচটেল

আমার মন্তব্যটি পুনরায় পড়ুন 23 বছর 13 হওয়া উচিত! আমার কাছে তার্ডিস নেই
গেরি

1

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


2
এটি কারণ
ভিবিএ

@ ফালমারি, এটি সম্পর্কে কিছু ভয়ঙ্কর জিনিস রয়েছে (এবং কিছু ভাল জিনিস)। আমার ড্রথার থাকলে আমি অনেক কিছুই ঠিক করে ফেলতাম।

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

1

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


0

আমি তাদের উভয়ই পঠনযোগ্য দেখতে পেয়েছি এবং আপনি যদি ভাষা পরিবর্তন করতে চান তবে কোড রক্ষণাবেক্ষণ সম্পর্কে আপনার যে উদ্বেগ হওয়া উচিত তা আমি গ্রহণ করি না।

কিছু ভাষায় দ্বিতীয় বিকল্পটি আরও ভাল কার্য সম্পাদন করে তাই এটি তখন পরিষ্কার পছন্দ হবে।


0

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

আমার মনে, এটি করার প্রথম উপায়টির সাথে বিপত্তিটি হ'ল ifআমি যখন বোঝাতে চাইনি তখন দুর্ঘটনাক্রমে n নেস্টেড ব্লকের বাইরে কোড রাখার জন্য আমাকে দুর্বল করে দেয়। যা সত্যই স্বীকার করা যায় যে এটি একটি বিশাল উদ্বেগের বিষয় নয়, তবে আমার কোডটি ভাষা অজ্ঞেয়াত্মক কিনা তা নিয়ে চিত্তাকর্ষক হওয়ার চেয়ে এটি আরও যুক্তিসঙ্গত বলে মনে হয়।


0

আমি দ্বিতীয় বিকল্পটি পছন্দ করি, কারণ এটি আরও পাঠযোগ্য।

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


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