প্রসঙ্গ
আমি সম্প্রতি আরও ভাল ফর্ম্যাট কোড তৈরি করতে আগ্রহী হয়েছি। এবং সর্বোত্তমভাবে আমার অর্থ "এটিকে একটি ভাল অনুশীলন হিসাবে বিবেচনা করার জন্য পর্যাপ্ত লোকদের দ্বারা অনুমোদিত বিধিগুলি অনুসরণ করা" (যেহেতু কোডের কোনও অনন্য "সেরা" উপায় কখনই থাকবে না)।
এই দিনগুলিতে আমি বেশিরভাগই রুবিতে কোড করি তাই আমার কোডের "মানের" সম্পর্কে সম্প্রদায়ের চালিত প্রকল্প রুবি-স্টাইল-গাইড দ্বারা সংজ্ঞায়িত এই "মানের" সম্পর্কে কিছু তথ্য সরবরাহ করতে আমি একটি লিন্টার (রুবোকপ) ব্যবহার শুরু করি ।
নোট যে আমি, "formating গুণমান" হিসেবে "কোয়ালিটি" ব্যবহার করবে না, তাই অনেক কোডের দক্ষতা সম্পর্কে, এমনকি যদি কিছু ক্ষেত্রে, কোড দক্ষতা আসলে হয় কিভাবে কোড লেখা আছে দ্বারা প্রভাবিত।
যাইহোক, সমস্ত কিছু করে, আমি কয়েকটি জিনিস বুঝতে পেরেছি (বা কমপক্ষে, মনে আছে):
- কিছু ভাষা (উল্লেখযোগ্যভাবে পাইথন, রুবি এবং এ জাতীয়) কোডের দুর্দান্ত এক-লাইনার তৈরি করার অনুমতি দেয়
- আপনার কোডের জন্য কিছু গাইডলাইন অনুসরণ করা তা উল্লেখযোগ্যভাবে খাটো এবং এখনও খুব স্পষ্ট করে তুলতে পারে
- তবুও, এই নির্দেশিকাগুলি খুব কঠোরভাবে অনুসরণ করা কোডটি কম স্বচ্ছ / পড়া সহজ করে তুলতে পারে
- কোডটি প্রায়শই সঠিকভাবে কিছু নির্দেশিকাকে সম্মান করতে পারে এবং এখনও নিম্ন মানের হতে পারে
- কোড পঠনযোগ্যতা বেশিরভাগ বিষয়গত
এগুলি নিখুঁত নিয়ম নয়, কেবল পর্যবেক্ষণ। আপনি এও নোট করবেন যে কোড পাঠযোগ্যতা এবং নিম্নলিখিত নির্দেশিকাগুলি এই মুহুর্তে সম্পর্কিত হতে পারে না তবে এখানে গাইডলাইনগুলি কোডের এক অংশের পুনর্লিখনের উপায়গুলির সংকীর্ণ করার একটি উপায়।
এই সমস্ত আরও স্পষ্ট করার জন্য এখন কয়েকটি উদাহরণ।
উদাহরণ
আসুন একটি সাধারণ ব্যবহারের কেস নেওয়া যাক: আমাদের কাছে একটি User
মডেল সহ একটি অ্যাপ্লিকেশন রয়েছে । একজন ব্যবহারকারী ঐচ্ছিক হয়েছে firstname
এবং surname
এবং একটি আবশ্যিক email
ঠিকানা।
আমি একটি পদ্ধতি "লিখতে চান name
" যা পরে নাম ফিরে আসবে ( firstname + surname
যদি অন্তত তার ব্যবহারকারীর) firstname
বা surname
হয় বর্তমান, অথবা তার email
যদি না একটি ফলব্যাক মান হিসাবে।
আমি এই পদ্ধতিটি use_email
প্যালামিটার হিসাবে একটি " " গ্রহণ করতে চাই (বুলিয়ান), ফলব্যাক মান হিসাবে ব্যবহারকারীর ইমেল ব্যবহার করার অনুমতি দেয়। এই use_email
পরামিতিটি " true
" হিসাবে ডিফল্ট (যদি পাস না হয়) হওয়া উচিত ।
এটি লেখার সবচেয়ে সহজ উপায়টি, রুবিতে হ'ল:
def name(use_email = true)
# If firstname and surname are both blank (empty string or undefined)
# and we can use the email...
if (firstname.blank? && surname.blank?) && use_email
# ... then, return the email
return email
else
# ... else, concatenate the firstname and surname...
name = "#{firstname} #{surname}"
# ... and return the result striped from leading and trailing spaces
return name.strip
end
end
এই কোডটি এটি করার সবচেয়ে সহজ এবং বোঝার সহজ উপায়। এমনকি রুবি "কথা" না বলার জন্যও।
এবার সেই সংক্ষিপ্ত করার চেষ্টা করি:
def name(use_email = true)
# 'if' condition is used as a guard clause instead of a conditional block
return email if (firstname.blank? && surname.blank?) && use_email
# Use of 'return' makes 'else' useless anyway
name = "#{firstname} #{surname}"
return name.strip
end
এটি সংক্ষিপ্ত, এখনও বুঝতে সহজ, সহজ না হলে (গার্ডের ধারাটি শর্তাধীন ব্লকের চেয়ে পড়তে বেশি স্বাভাবিক)। গার্ড ধারাটি আমি যে নির্দেশিকাগুলি ব্যবহার করছি তার সাথে এটি আরও কমপ্লায়েন্ট করে তোলে, তাই এখানে জয়-পরাজয় করুন। আমরা ইনডেন্ট স্তরও হ্রাস করি।
এটি আরও সংক্ষিপ্ত করতে এখন কিছু রুবি যাদু ব্যবহার করুন:
def name(use_email = true)
return email if (firstname.blank? && surname.blank?) && use_email
# Ruby can return the last called value, making 'return' useless
# and we can apply strip directly to our string, no need to store it
"#{firstname} #{surname}".strip
end
এমনকি ছোট এবং নির্দেশিকাগুলি নিখুঁতভাবে অনুসরণ করা ... তবে রিটার্নের বিবৃতি না থাকায় এই অভ্যাসের সাথে অপরিচিতদের জন্য এটি কিছুটা বিভ্রান্তিকর করে তোলে।
এখানেই আমরা প্রশ্ন জিজ্ঞাসা করতে শুরু করতে পারি: এটি কি আসলেই মূল্যবান? আমরা কি "না, এটি পাঠযোগ্য এবং যুক্ত করা উচিত" বলি return
(এটি জানার সাথে সাথে নির্দেশিকাগুলি সম্মত হবে না)। বা আমাদের কী বলা উচিত "এটি ভাল, এটি রুবি উপায়, জঘন্য ভাষা শিখুন!"?
যদি আমরা বি বিকল্পটি গ্রহণ করি, তবে কেন এটি আরও খাটো করা হবে না:
def name(use_email = true)
(email if (firstname.blank? && surname.blank?) && use_email) || "#{firstname} #{surname}".strip
end
এই যে, ওয়ান-লাইনার! অবশ্যই এটি সংক্ষিপ্ত ... এখানে আমরা এই অর্থটি গ্রহণ করি যে রুবি কোন মান বা অন্যটি কোনটি নির্ধারিত হবে তার উপর নির্ভর করে ফিরিয়ে দেবে (যেহেতু ইমেলটি পূর্বের মতো একই শর্তে সংজ্ঞায়িত হবে)।
আমরা এটি লিখতেও পারি:
def name(use_email = true)
(email if [firstname, surname].all?(&:blank?) && use_email) || "#{firstname} #{surname}".strip
end
এটি সংক্ষিপ্ত, পড়ার মতো কঠিন নয় (আমি বোঝাতে চাইছি, আমরা সবাই কুৎসিত ওয়ান-লাইনার দেখতে কী দেখতে পারি), ভাল রুবি, এটি আমার যে গাইডলাইনটি ব্যবহার করছে তা মেনে চলে ... তবে তবুও, লেখার প্রথম পদ্ধতির তুলনায় এটি, এটি পড়া এবং বুঝতে অনেক কম সহজ। আমরা যুক্তিও দিতে পারি যে এই লাইনটি দীর্ঘ (80 টিরও বেশি অক্ষরের)।
প্রশ্ন
কোডের কয়েকটি উদাহরণ প্রমাণ করতে পারে যে একটি "পূর্ণ-আকারের" কোড এবং এর অনেক হ্রাস করা সংস্করণ (বিখ্যাত এক-লাইনারের নিচে) এর মধ্যে নির্বাচন করা যেহেতু কঠিন হতে পারে, যেমন আমরা দেখতে পাচ্ছি, ওয়ান-লাইনার সেই ভীতিজনক হতে পারে না তবে তবুও, পাঠযোগ্যতার দিক থেকে কোনও কিছুই "পূর্ণ-আকারের" কোডটিকে হারাবে না ...
তাহলে এখানে আসল প্রশ্ন: কোথায় থামব? সংক্ষিপ্ত, যথেষ্ট সংক্ষিপ্ত কখন? কোডটি "খুব সংক্ষিপ্ত" এবং কম পঠনযোগ্য হয়ে উঠলে (এটি যথেষ্ট বিষয়গত বিষয়টিকে মনে রেখে) কীভাবে জানবেন? এবং আরও বেশি: কীভাবে সর্বদা সেইভাবে কোড করা যায় এবং যখন আমি কেবল এটির মতো বোধ করি তখন "পূর্ণ-আকারের" কোডের অংশগুলির সাথে এক-লাইনার মিশ্রণ এড়ানো যায়?
টি এল; ডিআর
এখানে মূল প্রশ্নটি হ'ল: যখন "লম্বা তবে স্পষ্ট, পাঠযোগ্য এবং বোঝার কোডের একটি অংশ" এবং "শক্তিশালী, এক-লাইন পড়ার / বোঝার পক্ষে আরও কম শক্ত" এর মধ্যে নির্বাচন করার বিষয়টি আসে, তখন এই দু'টি শীর্ষস্থানীয় এবং একটি মাত্রার নীচে এবং কেবল দুটি বিকল্প নয়: কীভাবে সংজ্ঞা দেওয়া যায় যে "যথেষ্ট পরিস্কার" এবং "যতটা পরিষ্কার হওয়া উচিত" এর মধ্যে সীমানা কোথায় রয়েছে?
মূল প্রশ্নটি শাস্ত্রীয় নয় "ওয়ান-লাইনার বনাম পাঠ্যতা: কোনটি ভাল?" তবে "এই দুজনের মধ্যে ভারসাম্য কীভাবে খুঁজে পাব?"
সম্পাদনা 1
কোড উদাহরণগুলিতে মন্তব্যগুলি "উপেক্ষা করা" বোঝানো হয়েছে, কী হচ্ছে তা স্পষ্ট করার জন্য তারা এখানে রয়েছে তবে কোডটির পাঠযোগ্যতার মূল্যায়ন করার সময় এগুলি বিবেচনায় নেওয়া হবে না।
return
ভেরিয়েন্ট 3 পছন্দ করব । এই সাতটি চরিত্র আমার চোখে বেশ স্পষ্টতা যুক্ত করেছে add
[firstname,surname,!use_email].all?(&:blank?) ? email : "#{firstname} #{surname}".strip
... কারণ false.blank?
সত্যটি প্রত্যাবর্তন করে এবং টেরিনারি অপারেটর আপনাকে কয়েকটি চরিত্র বাঁচায় ... ¯ \ _ (ツ) _ / ¯
return
কীওয়ার্ডটি স্পষ্ট করে যুক্ত করা উচিত ?! এটি কোনও তথ্য সরবরাহ করে না । এটা খাঁটি বিশৃঙ্খলা।