রিটার্ন-রিটার্ন বা অন্য-রিটার্ন যদি এটি ব্যবহার করা আরও দক্ষ হয়?


141

ধরা যাক আমার ifসাথে একটি বিবৃতি আছে return। দক্ষতার দৃষ্টিকোণ থেকে, আমি ব্যবহার করা উচিত

if(A > B):
    return A+1
return A-1

অথবা

if(A > B):
    return A+1
else:
    return A-1

সংকলিত ভাষা (সি) বা স্ক্রিপ্টেড (পাইথন) ব্যবহার করার সময় আমার কি অন্য একটিকে পছন্দ করা উচিত?


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

5
আপনার কোডটি বাছাই করতে আপনার সংকলকটির উপর নির্ভর করা একটি বিপজ্জনক পদক্ষেপ - এবং একটি অবর্ণনীয় সংকলক প্রয়োজন। আপনি যদি আপনার কোডটি করতে চান তবে আরও ভাল!
অ্যান্ড্রু

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

7
মতামতের ভিত্তিতে কীভাবে এটি বন্ধ করা যেতে পারে? আপনি জানার পরেও এটি একটি মতামত হতে পারে যে উভয়ের মধ্যে কোনও পারফরম্যান্স পার্থক্য নেই। আমি করিনি, এবং আমি নিশ্চিত যে অনেক লোকও তা করেনি।
জর্জি লিটাইও

1
প্রশ্নটি বেশ জনপ্রিয় হলেও, কোনও নির্দিষ্ট ভাষার কথা মাথায় না রেখে সঠিকভাবে উত্তর দেওয়া যাবে না, নাহলে, প্রতিটি ভাষার উত্তর দেওয়া এই ফর্ম্যাটটির পক্ষে খুব দীর্ঘ।
এমিল বার্গারন

উত্তর:


195

যেহেতু returnবিবৃতিটি বর্তমান ফাংশনটির সম্পাদন বন্ধ করে দেয়, দুটি ফর্ম সমান (যদিও দ্বিতীয়টি প্রথমটির চেয়ে তর্কযোগ্যভাবে বেশি পঠনযোগ্য)।

উভয় ফর্মের দক্ষতা তুলনীয়, অন্তর্নিহিত মেশিন কোডটি ifশর্তটি যাইহোক ভুল হলে একটি লাফ চালাতে হবে ।

নোট করুন পাইথন এমন একটি সিনট্যাক্স সমর্থন করে যা আপনাকে returnআপনার ক্ষেত্রে কেবলমাত্র একটি বিবৃতি ব্যবহার করতে দেয় :

return A+1 if A > B else A-1

32
সি এটিও সমর্থন করে। return (A>B)?A+1:A-1;তবে এ জাতীয় কোডটি লেখার মাধ্যমে পারফরম্যান্সে একেবারেই কোনও লাভ নেই । আমরা যা অর্জন করেছি তা হ'ল কোডকে অবিচ্ছিন্ন, অপঠনযোগ্য এবং কিছু ক্ষেত্রে অন্তর্নিহিত ধরণের প্রচারের জন্য আরও ঝুঁকিপূর্ণ করা।
লন্ডিন

47
@ লন্ডিন অবরুদ্ধ? অপাঠ্য? শুধুমাত্র যারা টের্নারি অপারেটর জানেন না তাদের জন্য।
glglgl

6
@ লন্ডিন এই যুক্তি অনুসরণ <করা খারাপ অভ্যাস কারণ -1 < 1uএকটি অপ্রত্যাশিত ফলাফলের জন্ম দেয়।
glglgl

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

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

33

থেকে Chromium- এর শৈলী গাইড:

ফিরে আসার পরে আর ব্যবহার করবেন না:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2

1
ধন্যবাদ। +1 টি। আমি জিজ্ঞাসা করতে পারি যে ফিরে আসার পরে কেন অন্যটি ব্যবহার করবেন না?
টিম

1
যদি-অন্যটি কার্যত সমতুল্য, তবে এটি ভার্জোজ ose অন্যটি অপ্রয়োজনীয়।
skeller88

17
আমি অবাক হয়েছি কারণ প্রথমটি আরও স্পষ্ট এবং এইভাবে আরও ভাল বলে মনে হচ্ছে।
টিম

4
আপনি উভয় জন্য একটি যুক্তিসঙ্গত মামলা করতে পারে। এই সিদ্ধান্তের সবচেয়ে গুরুত্বপূর্ণ বিষয় আইএমও কোড বেসের সাথে সামঞ্জস্যপূর্ণ হওয়া।
skeller88

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

5

কোডিং স্টাইল সম্পর্কিত:

বেশিরভাগ কোডিং মানকই কোনও বিষয় নয় ভাষা খারাপ অভ্যাস হিসাবে একক ফাংশন থেকে একাধিক রিটার্নের বিবৃতি নিষিদ্ধ করে।

(যদিও ব্যক্তিগতভাবে আমি বলব যে বেশ কয়েকটি ক্ষেত্রে এমন একাধিক রিটার্ন স্টেটমেন্ট উপলব্ধি করে: পাঠ্য / ডেটা প্রোটোকল পার্সার, বিস্তৃত ত্রুটি পরিচালনা সহ ফাংশন ইত্যাদি)

এই সমস্ত শিল্পের কোডিং মানগুলির Theক্যমতটি হ'ল অভিব্যক্তিটি এইভাবে লেখা উচিত:

int result;

if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;

দক্ষতা সম্পর্কিত:

উপরের উদাহরণ এবং প্রশ্নের দুটি উদাহরণ সমস্ত দক্ষতার দিক থেকে সম্পূর্ণ সমতুল্য । এই সমস্ত ক্ষেত্রে মেশিন কোডকে এ> বি এর সাথে তুলনা করতে হবে, তারপরে শাখাটি A + 1 বা A-1 গণনার সাথে তুলনা করতে হবে, তারপরে সিপিইউ রেজিস্টারে বা স্ট্যাকের ফলাফলটি সংরক্ষণ করতে হবে।

সম্পাদনা:

সূত্র:

  • মিস্রা-সি: ২০০৪ এর নিয়ম ১৪..7, যা পরিবর্তিতভাবে উদ্ধৃত করে ...:
  • আইইসি 61508-3। পার্ট 3, টেবিল বি 9।
  • আইইসি 61508-7। C.2.9।

37
আপনি কি নিশ্চিত যে একক-ফেরত ধর্মটি বেশিরভাগ কোডিং মানকে সংক্রামিত করেছে? এটা ভীতিজনক হবে।
ড্যানিয়েল ফিশার

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

3
@ ড্যানিয়েলফিশার: আমি আমার সংস্থার জন্য যে নকশাকৃত নকশা তৈরি করেছি তার ভিত্তিতে সি কোডিং স্ট্যান্ডার্ডে আমার এই নিয়ম রয়েছে "ফাংশনটির প্রান্তে কেবলমাত্র একমাত্র পয়েন্টের প্রস্থান থাকতে হবে, যদি না একমাত্র বহির্গমন বিন্যাস কোড তৈরি করে কম পাঠযোগ্য "। সুতরাং এটি মিশ্র-সি কিন্তু নিয়ম ব্যতিক্রম ছাড়া। যদি আপনি একটি উন্নত পার্সার ফাংশন লিখেন যা ফিরে আসতে পারে তবে 10 টি পৃথক ত্রুটি বলতে দেয়, নেস্টেড ব্রেসগুলির স্তর কোডটি পুরোপুরি অপঠনযোগ্য করে তোলে - এমন ক্ষেত্রে ত্রুটি দেখা দেওয়ার সাথে সাথে তা ফিরিয়ে দেওয়া আরও বুদ্ধিমানের কাজ হবে।
লন্ডিন

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

1
@percebus আমি সম্পূর্ণরূপে একমত এবং সাইক্লোমেটিক জটিলতা একক রিটার্নের বিরুদ্ধে একটি ভাল যুক্তি। এবং আমি এই সম্পর্কে বেশ কয়েকবার মিশ্র কমিটিকে খোঁচা দিয়েছি, উদাহরণস্বরূপ এটি দেখুন । কমপক্ষে এই বিধিটি মিস্র-সি: ২০১২-তে উপদেষ্টার অধীনে নামিয়ে আনা হয়েছে।
লন্ডিন

3

যে কোনও বুদ্ধিমান সংকলক সহ, আপনার কোনও পার্থক্য লক্ষ্য করা উচিত; তারা সমতুল্য হওয়ায় তাদের অভিন্ন মেশিন কোডে সংকলন করা উচিত।


2

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

পছন্দ হিসাবে আমি ব্যবহার:

return A+1 if (A > B) else A-1

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

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

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


1
যদি কোনও ব্যবহারকারী আমার উত্তরটি ডাউন-ভোট দিতে চলেছে তবে আমি কেন তাদের ভুল বলে মনে করেছি সে সম্পর্কে আমি একটি মন্তব্যে প্রশংসা করব।
স্টিফেন ইলউড

আমি পঠনযোগ্যতার জন্য স্টেটমেন্ট প্রতি 1 লাইন করার আগে সম্ভবত একটি লাইন করব would var n = 1 if (A > B) else -1 return A+n
পেরেসবাস

@ স্পেরসবাস কিছু ক্ষেত্রে ভেরিয়েবলের নামটি বাড়িয়ে তুলতে পারলে আমি সম্মত হব। উদাহরণস্বরূপ: 'কোড' মুভি_এক্স = 1 যদি আমার_এক্স <বিপরীতমুখী_এক্স -1 # প্রতিপক্ষের দিকে সরান
স্টিফেন

বিটিডাব্লু আমি আসলে আপনার উত্তরটিকে উড়িয়ে দিয়েছি আপনি যদি দেখেন আমার উত্তরটি বরং অনুরূপ
পেরেসবাস

2

elseসম্ভব হলে আমি ব্যক্তিগতভাবে ব্লকগুলি এড়িয়ে চলি । দেখুন এন্টি-যদি ক্যাম্পেইন

এছাড়াও, তারা লাইনের জন্য 'অতিরিক্ত' চার্জ করে না, আপনি জানেন: পি

"জটিলের চেয়ে সহজ সরল" এবং "পাঠযোগ্যতা রাজা"

delta = 1 if (A > B) else -1
return A + delta

2
কেন ডাউন ভোট? এটি একটি 'পাইথোনিক' উত্তর। আপনি এটিকে পছন্দসই উত্তর হিসাবে বিবেচনা করবেন না। তবে এটি একটি অবৈধ নয়। আমিও চুম্বন নীতি অনুসরণ করছি en.wikipedia.org/wiki/KISS_principle
percebus

3
আপনার উত্তরটি আমি উচ্চতর করে দিয়েছি কারণ এটি আমার পক্ষে পাঠযোগ্যতা এবং সহজ স্কোর। আমার ব্যক্তিগতভাবে এটি আপত্তিজনক বলে মনে হচ্ছে যে কেউ আমার উত্তর কেন সক্রিয়ভাবে নেতিবাচক তা সম্পর্কে আমাকে শিক্ষিত না করে আমাকে ভোট দেয় down
স্টিফেন ইলউড

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

1
@ স্টেফেনএলউড ডিফগুলি dictএড়াতে s ব্যবহার করা খুব খারাপ ধারণা কর্মক্ষমতা অনুযায়ী।
বাচ্চাউ

@ বাছসৌ আপনি সম্ভবত ঠিক বলেছেন। আমার সমস্ত স্ক্রিপ্টগুলি সেকেন্ডে চালিত হওয়ার কারণে আমাকে কখনই পারফরম্যান্স সম্পর্কে চিন্তা করতে হয়নি। আমার জন্য পাঠযোগ্যতা সাধারণত কর্মক্ষমতা ট্রাম্প করে। যেহেতু আমি পুরো সময়ের প্রোগ্রামার নই; এগুলি কেবল শেষ করার উপায়।
স্টিফেন ইলউড

1

সংস্করণ A সহজ এবং সে কারণেই আমি এটি ব্যবহার করব।

এবং আপনি যদি জাভাতে সমস্ত সংকলক সতর্কতা চালু করেন তবে আপনি দ্বিতীয় সংস্করণে একটি সতর্কতা পাবেন কারণ এটি অনিসেসারি এবং কোড জটিলতা তৈরি করে।


1

আমি জানি প্রশ্নটি অজগরটিকে ট্যাগ করা হয়েছে, তবে এটি গতিশীল ভাষার উল্লেখ করেছে তাই ভেবেছিলাম যে আমি উল্লেখ করতে হবে যে রুবিতে যদি বিবৃতিতে আসলে একটি রিটার্ন টাইপ থাকে যাতে আপনি এর মতো কিছু করতে পারেন like

def foo
  rv = if (A > B)
         A+1
       else
         A-1
       end
  return rv 
end

বা কারণ এটিরও প্রত্যক্ষভাবে অন্তর্নিহিত প্রত্যাবর্তন রয়েছে

def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end

যা বেশ ভালভাবে একাধিক রিটার্ন না পাওয়ার স্টাইল ইস্যুটির আশেপাশে।

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