এক-লাইন ফাংশন যা কেবল একবারেই ডাকা হয়


120

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

এটি একটি ক্যোয়ারী সম্পাদন করতে পারে, কিছু মান পরীক্ষা করতে পারে, রিজেক্স জড়িত কিছু করতে পারে ... কিছু অস্পষ্ট বা "হ্যাকি"।

এর পিছনে যুক্তিটি হ'ল হার্ড-পঠনযোগ্য মূল্যায়ন এড়ানো:

if (getCondition()) {
    // do stuff
}

যেখানে getCondition()এক-লাইন ফাংশন।

আমার প্রশ্নটি সহজভাবে: এটি কি একটি ভাল অনুশীলন? এটি আমার কাছে ঠিক আছে তবে আমি দীর্ঘমেয়াদী সম্পর্কে জানি না ...


9
আপনার কোড খণ্ডটি যদি কোনও ওওপি ভাষার অন্তর্নিহিত রিসিভারের সাথে না হয় (উদাহরণস্বরূপ) এটি অবশ্যই একটি খারাপ অভ্যাস হবে, কারণ গেটকন্ডিশন () সম্ভবত গ্লোবাল স্টেটের উপর নির্ভর করে ...
ইনগো

2
তিনি বোঝাতে চেয়েছিলেন যে getCondition () এর পক্ষে যুক্তি থাকতে পারে?
ব্যবহারকারী 606723

24
@ ইঙ্গো - কিছু জিনিসের সত্যই গ্লোবাল অবস্থা রয়েছে। বর্তমান সময়, হোস্টনাম, পোর্ট নম্বর ইত্যাদি সমস্ত বৈধ "গ্লোবালস"। ডিজাইনের ত্রুটি এমন কিছু থেকে বিশ্বব্যাপী তৈরি করছে যা সহজাতভাবে বৈশ্বিক নয়।
জেমস অ্যান্ডারসন

1
আপনি শুধু ইনলাইন না getCondition? এটি যদি আপনি যতটা ছোট এবং অবিচ্ছিন্নভাবে ব্যবহার করেন এটি হিসাবে এটি ব্যবহার করা হয় তবে এটির নাম দেওয়া কোনও কাজ সম্পাদন করছে না।
davidk01

12
ডেভিডক 01: কোড পাঠযোগ্যতা।
wjl

উত্তর:


240

এক লাইনের উপর নির্ভর করে। যদি লাইনটি নিজেই পঠনযোগ্য এবং সংক্ষিপ্ত হয় তবে ফাংশনের প্রয়োজন হতে পারে না। সরল উদাহরণ:

void printNewLine() {
  System.out.println();
}

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

boolean isTaxPayerEligibleForTaxRefund() {
  return taxPayer.isFemale() 
        && (taxPayer.getNumberOfChildren() > 2 
        || (taxPayer.getAge() > 50 && taxPayer.getEmployer().isNonProfit()));
}

99
+1 টি। এখানে যাদু শব্দটি হ'ল "স্ব-ডকুমেন্টিং কোড"।
কোনামিমন

8
চাচা বব কী ডাকবেন তার একটি ভাল উদাহরণ "শর্তাবলীর encapsulating"।
অ্যান্টনি পেগ্রাম

12
@ আদিত্য: taxPayerএই পরিস্থিতিতে বিশ্বব্যাপী এমন কিছুই বলে না । সম্ভবত এই শ্রেণিটি TaxReturn, এবং taxPayerএকটি বৈশিষ্ট্য।
অ্যাডাম রবিনসন

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

2
@ ডালিন, বব মার্টিনের ক্লিন কোডে প্রচুর আধা-বাস্তব জীবন কোডের উদাহরণ দেখানো হয়েছে। যদি আপনার একক ক্লাসে খুব বেশি ফাংশন থাকে তবে আপনার ক্লাসটি খুব বড়?
পিয়েটার তারেক

67

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

startIgnition();
petrolFlag |= 0x006A;
engageChoke();

এক্ষেত্রে মাঝারি লাইনটিকে সংবেদনশীল-নামকরণের ফাংশনে সরিয়ে নেওয়া আরও ভাল।


15
যে 0x006A সুন্দর: ডিএ অ্যাডিটিভস এ, বি এবং সি দিয়ে কার্বনযুক্ত জ্বালানীর সুপরিচিত ধ্রুবক।
কোডার

2
+1 আমি সমস্ত স্ব-ডকুমেন্টিং কোডের জন্য করছি :) যাইহোক, আমি মনে করি যে আমি ব্লকগুলির মাধ্যমে একটি স্থির বিমূর্ততা স্তর রাখার বিষয়ে একমত, তবে কেন তা ব্যাখ্যা করতে পারলাম না। আপনি কি এটি প্রসারিত করতে আপত্তি করবেন?
vemv

3
আপনি যদি কেবল এটি বলছেন যে petrolFlag |= 0x006A;কোনও ধরণের সিদ্ধান্ত গ্রহণ petrolFlag |= A_B_C; ছাড়াই, অতিরিক্ত ফাংশন না করে কেবল বলা ভাল । সম্ভবত, engageChoke()কেবলমাত্র যদি petrolFlagনির্দিষ্ট মানদণ্ড পূরণ হয় তবেই ডাকা উচিত এবং এটি পরিষ্কারভাবে বলা উচিত 'আমার এখানে একটি ক্রিয়াকলাপ প্রয়োজন।' একটি ছোটখাট নাইট, এই উত্তরটি অন্যথায় স্পষ্ট করা হয়েছে :)
টিম পোস্ট

9
কোনও পদ্ধতির মধ্যে কোডটি নির্দেশ করার জন্য +1 একই বিমূর্ত স্তরে হওয়া উচিত। @ ওয়েমভ, এটি একটি ভাল অনুশীলন কারণ কোডটি পড়ার সময় বিমূর্ততার বিভিন্ন স্তরের মধ্যে আপনার মনের প্রয়োজন এবং এড়াতে আপনার কোডটিকে বোঝা সহজ করে তোলে it পদ্ধতিটি কল / রিটার্নগুলিতে অ্যাবস্ট্রাকশন স্তরের স্যুইচগুলি বেঁধে দেওয়া (যেমন স্ট্রাকচারাল "জাম্পস") কোডটিকে আরও সাবলীল এবং পরিষ্কার করার একটি দুর্দান্ত উপায়।
পিটার তুরিক

21
না, এটি একটি সম্পূর্ণরূপে তৈরি মান। তবে আপনি যে বিষয়টি নিয়ে আশ্চর্য হয়ে গেছেন তা কেবলমাত্র এই বিষয়টির উপরে জোর দেয়: কোডটি যদি বলে থাকে তবে mixLeadedGasoline()আপনাকে তা করতে হবে না!
কিলিয়ান ফুট

37

আমি মনে করি যে অনেক ক্ষেত্রে এই জাতীয় ফাংশনটি ভাল স্টাইল, তবে আপনি যখন কোনও স্থানে অন্য কোথাও এই শর্তটি ব্যবহার করার প্রয়োজন না হয় তবে আপনি স্থানীয় বুলিয়ান পরিবর্তনশীলটিকে বিকল্প হিসাবে বিবেচনা করতে পারেন:

bool someConditionSatisfied = [complex expression];

এটি কোড রিডারকে একটি ইঙ্গিত দেবে এবং একটি নতুন ফাংশন প্রবর্তন থেকে বাঁচাবে।


1
শর্তটি ফাংশনটির নামটি কঠিন বা সম্ভবত বিভ্রান্তিমূলক (উদাহরণস্বরূপ IsEngineReadyUnlessItIsOffOrBusyOrOutOfService) হলে বিশেষভাবে উপকারীটি উপকারী ।
dbkk

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

1
@ ওল্ফ ওটো, কোডের "বিমূর্ত গভীরতা" হ্রাস করার জন্য আমি এটি একটি ফাংশন কলে পছন্দ করি। আইএমও, কোনও ফাংশনে ঝাঁপিয়ে দেওয়া কোডের একটি সুস্পষ্ট এবং প্রত্যক্ষ দম্পতির লাইনের চেয়ে বৃহত প্রসঙ্গের সুইচ, বিশেষত যদি এটি কেবল একটি বুলিয়ান দেয় returns
কাচে

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

23

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

পিটারের উদাহরণ অনুসরণ করা, যদি এটি হয়

boolean isTaxPayerEligibleForTaxRefund() {
  return taxPayer.isFemale() 
        && (taxPayer.getNumberOfChildren() > 2 
        || (taxPayer.getAge() > 50 && taxPayer.getEmployer().isNonProfit()));
}

এটি হয়ে যায়

boolean isTaxPayerEligibleForTaxRefund() {
  return taxPayer.isMutant() 
        && (taxPayer.getNumberOfThumbs() > 2 
        || (taxPayer.getAge() > 123 && taxPayer.getEmployer().isXMan()));
}

আপনি একটি একক সম্পাদনা করেন এবং এটি সর্বজনীনভাবে আপডেট হয়। রক্ষণাবেক্ষণের ভিত্তিতে, এটি একটি প্লাস is

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


2
আমি একটি সম্পাদনা পয়েন্ট রাখার সুবিধা সম্পর্কে ইতিমধ্যে সচেতন - সে কারণেই প্রশ্নটি "... একবার বলা হয়" বলে। তবুও এই সংকলক অপ্টিমাইজেশানগুলি সম্পর্কে জেনে রাখা দুর্দান্ত, আমি সর্বদা ভেবেছিলাম তারা এই ধরণের নির্দেশকে অক্ষরে অক্ষরে অনুসরণ করেছে।
vemv

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

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

5

পঠনযোগ্যতা ছাড়াও (বা এর পরিপূরক হিসাবে) এটি বিমূর্তির সঠিক স্তরে ফাংশন লিখতে দেয় allows


1
আমি ভীত আমি বুঝতে চাইছি না আমি বুঝতে পেরেছি ...
vemv

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

4

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

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


3

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


স্টিফেনের জবাব অনুসারে এটি সর্বদা না ঘটতে পারে (যদিও সংকলকের জাদুতে অন্ধভাবে বিশ্বাস করা যাইহোক ভাল হতে পারে না)
Vemv

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

গ্রহগুলির সারিবদ্ধকরণের জন্য +1 :) তবে আপনার শেষ বাক্যটি আমার কাছে সম্পূর্ণ বাদাম লাগছে, আপনি কি সত্যিই তা করেন?
Vemv

এটি সত্যই নির্ভর করে যে বেশিরভাগ সময় আমি না করি যতক্ষণ না আমি পেমেন্টের সঠিক পরিমাণ না পেয়ে যাচ্ছিলাম কিনা তা পরীক্ষা করার জন্য গতিবেগ এবং এই জাতীয় অন্যান্য জিনিসগুলি করে কিনা। তবে পুরানো সংকলকগুলিতে এটি অনুলিপি করার জন্য এটি অনুলিপি করে আটকানো আরও ভাল ছিল 9-10 figure
ওয়াজনসটেক

3

কোডটি সেন্স কমেন্টের আসল অর্থটি স্পষ্ট করার জন্য আমি সম্প্রতি একটি অ্যাপ্লিকেশনটিতে রিফ্যাক্টরিং করেছি যা এই ঠিক কাজটি করেছি:

protected void PaymentButton_Click(object sender, EventArgs e)
    Func<bool> HaveError = () => lblCreditCardError.Text == string.Empty && lblDisclaimer.Text == string.Empty;

    CheckInputs();

    if(HaveError())
        return;

    ...
}

শুধু কৌতূহলী, এটি কোন ভাষা?
vemv

5
@ ওয়েমভি: আমার কাছে সি # এর মতো দেখাচ্ছে।
স্কট মিচেল

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

@ ওল্ফ আরে মানুষ, হ্যাঁ আমি এটি বেশ কিছুক্ষণ আগে লিখেছিলাম :) আমি স্পষ্টতই এখনকার দিনে বেশ আলাদাভাবে জিনিসগুলি করি। আসলে, কোনও ত্রুটি হয়েছে কিনা তা দেখার জন্য লেবেলের সামগ্রীতে তাকানো আমাকে ক্রিঞ্জ করে তোলে ... আমি কেন কেবল একটি বুল ফিরিয়ে CheckInputs()দিইনি ???
জোশপুরি

0

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


0

ইতিমধ্যে অনেক ভাল উত্তর আছে, তবে উল্লেখ করার মতো একটি বিশেষ ক্ষেত্রে রয়েছে

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

মজার বিষয় হচ্ছে, বর্তমানে করার মতো কিছু না হলে একই কাজ করা যেতে পারে তবে একটি মন্তব্য প্রসারণের স্মরণ করিয়ে দেওয়ার প্রয়োজন (খুব অদূর ভবিষ্যতে 1) ), তাই এটি,

def sophisticatedHello():
    # todo set up
    say("hello")
    # todo tear down

পাশাপাশি এটি মধ্যে পরিবর্তন করতে পারে

def sophisticatedHello():
    setUp()
    say("hello")
    tearDown()

1) আপনার এ সম্পর্কে সত্যই নিশ্চিত হওয়া উচিত ( YAGNI নীতিটি দেখুন)


0

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

someCondition = lambda p: True if [complicated expression involving p] else False
#I explicitly write the function with a ternary to make it clear this is a a predicate
if (someCondition(p)):
    #do stuff...

আইএমএইচএ এটি একটি সমঝোতা কারণ এটি ifছোট থ্রো-অ্যাওয়ে লেবেলগুলির সাথে গ্লোবাল / প্যাকেজ নেমস্পেসকে বিশৃঙ্খলা এড়ানোর সময় শর্তকে বিশৃঙ্খলা না করে পঠনযোগ্য সুবিধা দেয় । এটির অতিরিক্ত সুবিধা রয়েছে যে "সংজ্ঞা" ফাংশনটি সঠিক যেখানে এটির সংজ্ঞা সংশোধন করা এবং পড়তে সহজ করে তোলে।

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

#goal - I have a list of PIL Image objects and I want them all as grayscale (uint8) numpy arrays
im_2_arr = lambda im: array(im.convert('L')) 
arr_list = [im_2_arr(image) for image in image_list]

কেন "ল্যাম্বডা পি: সত্য" যদি [ল্যাম্বদা পি: [পি জড়িত জটিল অভিব্যক্তি] "এর পরিবর্তে অন্যথায় মিথ্যা" মিথ্যা ভাব প্রকাশিত p]? 8-)
হান্স-পিটার স্টার

@hstoerr তার এই লাইনের ঠিক নীচে মন্তব্যে। আমি এটিকে সুস্পষ্টভাবে জানাতে চাই যে আমরা কিছু শর্ত একটি পূর্বসূরী। এটি কঠোরভাবে অপ্রয়োজনীয় হওয়ার পরেও আমি প্রচুর বৈজ্ঞানিক স্ক্রিপ্টগুলি এমন লোকদের দ্বারা পড়েছি যারা এগুলিকে বেশি পরিমাণে কোড করে না, আমি ব্যক্তিগতভাবে আমার সহকর্মীদের বিভ্রান্ত করার চেয়ে অতিরিক্ত বীর্যপাত করা বেশি উপযুক্ত বলে মনে করি কারণ তারা তা [] == Falseবা অন্য কিছু জানেন না because অনুরূপ পাইথোনিক সমতুল্য যা 'সর্বদা' স্বজ্ঞাত নয়। এটি মূলত ফ্ল্যাগ করার একটি উপায় যা সামারিকানশনটি আসলে একটি শিকারী।
ক্র্যাসিক

শুধু আমার সুস্পষ্ট ভুল পরিষ্কার [] != Falseকিন্তু []যখন একটি bool কাস্ট হিসেবে মিথ্যা হয়
crasic

@ ক্র্যাসিক: যখন আমি আমার পাঠকদের জানতে না প্রত্যাশা করি যে [] মিথ্যাটিকে মূল্যায়ন করে, আমি len([complicated expression producing a list]) == 0ব্যবহার করা পছন্দ করি না , True if [blah] else Falseযা ব্যবহার করার চেয়ে এখনও পাঠকের জানতে হবে যে []] মিথ্যাটির মূল্যায়ন করে।
মিথ্যা রায়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.