ওয়ান-লাইনার বনাম পঠনযোগ্যতা: কোড হ্রাস কখন বন্ধ করবেন? [বন্ধ]


14

প্রসঙ্গ

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

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

নোট যে আমি, "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

কোড উদাহরণগুলিতে মন্তব্যগুলি "উপেক্ষা করা" বোঝানো হয়েছে, কী হচ্ছে তা স্পষ্ট করার জন্য তারা এখানে রয়েছে তবে কোডটির পাঠযোগ্যতার মূল্যায়ন করার সময় এগুলি বিবেচনায় নেওয়া হবে না।


7
উত্তরের জন্য খুব সংক্ষিপ্ত: যতক্ষণ না আপনি পূর্ববর্তী পুনরাবৃত্তির চেয়ে ভাল এটি নিশ্চিত না হন ততক্ষণ পুনরাবৃত্তাকারে রিফ্যাক্টরিং চালিয়ে যান এবং শেষ রিফ্যাক্টরিয়েশনটি বিপরীত করুন re
ডোম

8
আমি কীওয়ার্ড যুক্ত করার সাথেreturn ভেরিয়েন্ট 3 পছন্দ করব । এই সাতটি চরিত্র আমার চোখে বেশ স্পষ্টতা যুক্ত করেছে add
মাস্টার -

2
যদি আপনি সত্যিই ভয়াবহ বোধ করেন তবে আপনি পুরো জিনিসটি লিখতে পারেন [firstname,surname,!use_email].all?(&:blank?) ? email : "#{firstname} #{surname}".strip... কারণ false.blank?সত্যটি প্রত্যাবর্তন করে এবং টেরিনারি অপারেটর আপনাকে কয়েকটি চরিত্র বাঁচায় ... ¯ \ _ (ツ) _ / ¯
ডেভমঙ্গুজ

1
ঠিক আছে, আমাকে জিজ্ঞাসা করতে হবে: returnকীওয়ার্ডটি স্পষ্ট করে যুক্ত করা উচিত ?! এটি কোনও তথ্য সরবরাহ করে না । এটা খাঁটি বিশৃঙ্খলা।
কনরাড রুডলফ

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

উত্তর:


26

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

যদি এটি ভাষা অজ্ঞেয়বাদী হত তবে আমি মনে করি এটি অবশ্যই মতামত ভিত্তিক হবে তবে রুবি ভাষার সীমানার মধ্যে আমি মনে করি আমরা এর উত্তর দিতে পারি।

প্রথমত, রুবি লেখার একটি বৈশিষ্ট্য এবং একটি মূ .় উপায় হ'ল returnকোনও পদ্ধতি থেকে তাড়াতাড়ি না ফিরলে কোনও মান ফেরত দেওয়ার সময় মূল শব্দটি বাদ দেওয়া ।

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

নীচে জোরে নিজেকে পড়ুন।

5.times { print "Odelay!" }

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

এটি দেওয়া, কোড উদাহরণ # 3 হ'ল রুবির পক্ষে সবচেয়ে মূর্তিমান:

def name(use_email = true)
  return email if firstname.blank? && surname.blank? && use_email

  "#{firstname} #{surname}".strip
end

এখন যখন আমরা কোডটি পড়ি তখন এটিতে বলা হয়:

প্রথম নামটি ফাঁকা থাকলে, এবং ডাকনাম ফাঁকা থাকলে এবং ইমেলটি ব্যবহার করুন তবে ইমেলটি ফেরত দিন

(রিটার্ন) প্রথম নাম এবং শেষ নাম ছিনিয়ে নেওয়া হয়েছে

যা প্রকৃত রুবি কোডের খুব কাছাকাছি arn

এটি সত্যিকারের কোডের মাত্র 2 টি লাইন, সুতরাং এটি বেশ সংক্ষিপ্ত, এবং এটি ভাষার প্রতিমাগুলিকে মেনে চলে।


ভাল পয়েন্ট। এটা সত্য যে প্রশ্নটি রুবি কেন্দ্রিক হতে বোঝানো হয়নি, তবে আমি একমত যে এখানে কোনও ভাষা অজ্ঞাত উত্তর দেওয়া সম্ভব নয়।
সুডুকিল

8
আমি প্রাকৃতিক ভাষার মতো কোড সাউন্ড তৈরির ধারণাটি ব্যাপকভাবে ওভাররেটেড (এবং কখনও কখনও এমনকি সমস্যাযুক্ত) পাই। তবে এই প্রেরণা ছাড়াই আমি এই উত্তর হিসাবে একই সিদ্ধান্তে পৌঁছেছি।
কনরাড রুডল্ফ

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

প্রাকৃতিক ভাষার কাঠামোর অনুসরণকারী স্ট্রাকচারিং কোড আপনাকে ভাষার ফাঁদে ফেলতে পারে। উদাহরণস্বরূপ, আপনি যখন পরবর্তী প্রয়োজনীয়তাগুলি পড়েন do send an email if A, B, C but no D, আপনার অনুমিতি অনুসরণ করে 2 টাইপ করা স্বাভাবিক হবে যদি / অন্য ব্লকগুলি, সম্ভবত কোড করা সহজ হবে if not D, send an email। প্রাকৃতিক ভাষা পড়ার মুহূর্তে সতর্কতা অবলম্বন করা আবশ্যক এবং এটি কোডে রুপান্তর কারণ এটি আপনাকে একটি নতুন সংস্করণ লিখতে করতে পারেন "অফুরন্ত কাহিনী" । ক্লাস, পদ্ধতি এবং ভেরিয়েবলের সাথে। সর্বোপরি বড় কথা নয়।
লাইভ

@ লাইভ: প্রাকৃতিক ভাষার মতো কোড পড়ার অর্থ হ'ল আক্ষরিক প্রয়োজনীয়তাগুলি অনুবাদ করা। এর অর্থ কোড লিখন যাতে জোরে জোরে পড়ার সময় পাঠকটি কোড, অক্ষরের জন্য বর্ণ, ভাষা গঠনের জন্য ভাষা নির্মানের প্রতিটি বিট না পড়েই যুক্তি বুঝতে সক্ষম হন। কোডিং যদি এটি if !Dআরও ভাল হয় তবে Dএটি অর্থের মতো নামের মতো জরিমানা । এবং !অপারেটরটি যদি অন্য কোডগুলির মধ্যে হারিয়ে যায় তবে তার নাম NotDপরিচয়দাতকারী থাকা উপযুক্ত।
গ্রেগ বার্গার্ড্ট

15

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

একটি গুরুত্বপূর্ণ বিবেচনাটি কোডের শ্রোতাদের। পাঠযোগ্যতা অবশ্যই পড়ার উপর নির্ভর করে। আপনি কোডটি পড়ার আশা করছেন (নিজের পাশের) লোকেরা আসলে রুবি ভাষার আইডিয়ামগুলি জানেন? ভাল এই প্রশ্নটি এমন কিছু নয় যা ইন্টারনেটে এলোমেলো লোকেরা উত্তর দিতে পারে, এটি কেবল আপনার নিজের সিদ্ধান্ত।


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

1
যেহেতু কেউ সত্যিকারের ভয়াবহ কোডটি গ্রহণ, প্রসারিত এবং বজায় রাখতে হয়েছিল, স্পষ্টতাকে জিততে হবে। পুরানো উক্তিটি মনে রাখবেন - আপনার কোডটি লিখুন যেন রক্ষণাবেক্ষণকারী হিংস্র হিংস্র দেবদূত যিনি জানেন যে আপনি কোথায় থাকেন এবং আপনার বাচ্চাগুলি কোথায় স্কুলে যায়।
uɐɪ

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

7

এখানে সমস্যার অংশটি হ'ল "পাঠযোগ্যতা কী"। আমার জন্য, আমি আপনার প্রথম কোড উদাহরণটি দেখছি:

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 (firstname.blank? && surname.blank?) && use_email
  return email
 else
  name = "#{firstname} #{surname}"
  return name.strip
 end
end

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

string Name(bool useEmail = true) => 
    firstName.Blank() && surname.Blank() && useEmail 
    ? email 
    : $"{firstname} {surname}".Strip();

রুবিতে কি এমন কিছু সম্ভব? আপনার পোস্টের মাধ্যমে কাজ করে, আমি দেখতে পাচ্ছি:

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.blank? && surname.blank?) && use_email) 
 || "#{firstname} #{surname}".strip
end

এখন আমি খুশি. সিনট্যাক্স কীভাবে কাজ করে সে সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে কোডটি কী করে তা আমি বুঝতে পারি।

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

তবে একটি কথা আমি বলতে চাই: "চতুর কোড" থেকে সাবধান থাকুন যেমন আপনার শেষ উদাহরণে। নিজেকে জিজ্ঞাসা করুন, [firstname, surname].all?(&:blank?)আপনার চালাক বোধ করা ছাড়া কি অন্য কিছু যুক্ত করা যায় কারণ এটি আপনার দক্ষতা প্রদর্শন করে, যদিও এখন পড়াশোনা করা কিছুটা কঠিন? আমি বলব এই উদাহরণটি সম্ভবত সেই বিভাগে পূর্ণ হবে। আপনি যদি পাঁচটি মানের সাথে তুলনা করে থাকেন তবে আমি এটি একটি ভাল কোড হিসাবে দেখতাম। সুতরাং আবার, এখানে কোন নিখুঁত রেখা আছে, খুব চতুর থাকার বিষয়ে সচেতন থাকুন।

সুতরাং সংক্ষেপে: পাঠযোগ্যতার জন্য আপনাকে আপনার শ্রোতাগুলি জানতে হবে এবং সেই অনুযায়ী আপনার কোডটি লক্ষ্যবস্তু করতে হবে এবং সংক্ষিপ্ত বিবরণ লিখবেন, তবে পরিষ্কার কোড; "চালাক" কোডটি কখনই লিখবেন না। এটি সংক্ষিপ্ত রাখুন, তবে খুব ছোট নয়।


2
ঠিক আছে, আমি এটি উল্লেখ করতে ভুলে গিয়েছিলাম, তবে মন্তব্যগুলি "উপেক্ষা করা" বোঝানো হয়েছিল, তারা এখানে যারা কেবল রুবিকে ভালভাবে চেনে না তাদের সহায়তা করার জন্য। শ্রোতাদের সম্পর্কে বৈধ পয়েন্ট যদিও আমি সে সম্পর্কে ভাবি নি। যে সংস্করণটি আপনাকে খুশি করে তোলে: এটি যদি লাইন দৈর্ঘ্যের সাথে বিবেচনা করে তবে আমার কোডের তৃতীয় সংস্করণ (কেবলমাত্র একটি রিটার্ন বিবৃতি সহ একটি) কিন্ডা এটি করে এবং এটি আরও কিছুটা বোধগম্য, না?
সুদিউকিল

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

একজন রুবি বিকাশকারী নন তবে শীর্ষ ভোটের জবাবের চেয়ে এটি আমার কাছে অনেক বেশি অর্থবোধ করে, যা এই বলে যে "আমি এখানে যাচ্ছি [পাদটীকা: একটি নির্দিষ্ট দীর্ঘ অবস্থার অধীনে]। এছাড়াও, এখানে একটি স্ট্রিং রয়েছে যা দেরিতে এসেছিল পার্টিতে." যুক্তি যা মূলত কেবল একটি কেস স্টেটমেন্টে একক ইউনিফর্ম কেস স্টেটমেন্টের মতো লেখা উচিত, একাধিক আপাতদৃষ্টিতে সম্পর্কিত নয় এমন বিবৃতিতে ছড়িয়ে পড়ে না।
পল

ব্যক্তিগতভাবে আমি আপনার দ্বিতীয় কোড ব্লকের সাথে যাব যদি না আমি আপনার অন্য শাখায় দুটি বিবৃতি একত্রিত করি:return "#{firstname} #{surname}".strip
পল

2

এটি সম্ভবত এমন একটি প্রশ্ন যেখানে মতামত-ভিত্তিক উত্তর না দেওয়া শক্ত, তবে, এখানে আমার দুটি সেন্ট রয়েছে।

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

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


1

উত্তরটি কিছুটা বিষয়ভিত্তিক, তবে আপনি নিজের যে সমস্ত সততা অর্জন করতে পারেন তার সাথে নিজেকে জিজ্ঞাসা করতে হবে, আপনি যদি এই কোডটি বুঝতে পেরেছিলেন যখন আপনি এক-দু'মাস পরে ফিরে আসবেন।

প্রতিটি পরিবর্তনের কোড বোঝার জন্য গড় ব্যক্তির দক্ষতা উন্নত করা উচিত। কোডটি বোধগম্য করার জন্য, এটি নিম্নলিখিত নির্দেশিকাগুলি ব্যবহার করতে সহায়তা করে:

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

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

আমি যা বলার তা বলি:

আপনি যখন নিজের কোডটি আরও ভাল করতে পারবেন তখন উন্নত করুন (আরও বোধগম্য)

মনে রাখবেন, আপনাকে বা আপনার মতো কাউকে পরে কোডটি বজায় রাখতে হবে। পরের বার আপনি যখন এটিটি দেখতে পাবে তখন কয়েক মাস লাইন ধরেই। নিজের পক্ষে একটি সুবিধা করুন এবং আপনার কোডটি বুঝতে সক্ষম হবেন এমন ব্যয় করে লাইন গণনা কমাতে তাড়াবেন না।


0

পঠনযোগ্যতা হ'ল এমন একটি সম্পত্তি যা আপনি রাখতে চান, বহু-ওয়ান-লাইনার নেই। সুতরাং "ওয়ান-লাইনার বনাম পঠনযোগ্যতা" এর চেয়ে প্রশ্নটি হওয়া উচিত:

ওয়ান-লাইনারগুলি কখন পাঠযোগ্যতা বৃদ্ধি করে এবং কখন এটিকে ক্ষতি করে?

আমি বিশ্বাস করি যে ওয়ান-লাইনার যখন এই দুটি শর্ত পূরণ করে তখন পাঠযোগ্যতার পক্ষে ভাল:

  1. এগুলি কোনও ফাংশনে নিষ্ক্রিয় হওয়ার জন্য খুব নির্দিষ্ট।
  2. আপনি আশেপাশের কোডটি পড়ার "প্রবাহ" বাধা দিতে চান না।

উদাহরণস্বরূপ, বলা যাক name আপনার পদ্ধতির জন্য একটি ভাল ... নাম ছিল না। প্রথম নাম এবং উপাধির সংমিশ্রণ করা, বা নামের পরিবর্তে ইমেল ব্যবহার করা প্রাকৃতিক জিনিস ছিল না। সুতরাং nameআপনি সর্বোত্তম জিনিসটির পরিবর্তে দীর্ঘ এবং জটিল হয়ে উঠতে পারেন:

puts "Name: #{user.email_if_there_is_no_name_otherwise_use_firstname_and_surname(use_email)}"

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

তবুও - কেন এটি ওয়ান-লাইনার তৈরি করবেন? এগুলি সাধারণত মাল্টলাইন কোডের চেয়ে কম পঠনযোগ্য। এখানেই আমাদের আমার দ্বিতীয় শর্তটি পরীক্ষা করা উচিত - পার্শ্ববর্তী কোডের প্রবাহ। আপনার যদি এরকম কিছু থাকে তবে:

puts "Group: #{user.group}"
puts "Title: #{user.title}"
if user.firstname.blank? && user.surname.blank?) && use_email
  name = email
else
  name = "#{firstname} #{surname}"
  name.strip
end
puts "Name: #{name}"
puts "Age: #{user.age}"
puts "Address: #{user.address}"

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

puts "Group: #{user.group}"
puts "Title: #{user.title}"
puts "Name: #{(email if (user.firstname.blank? && user.surname.blank?) && use_email) || "#{user.firstname} #{user.surname}".strip}"
puts "Age: #{user.age}"
puts "Address: #{user.address}"

আপনার প্রবাহ ব্যাহত হবে না এবং আপনার প্রয়োজন হলে আপনি নির্দিষ্ট অভিব্যক্তিতে মনোনিবেশ করতে পারেন।

এটা কি আপনার মামলা? অবশ্যই না!

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

দ্বিতীয় শর্ত হিসাবে - এটি কি আশেপাশের কোডটির প্রবাহকে বাধা দেয়? না! পার্শ্ববর্তী কোডটি একটি পদ্ধতি ঘোষণা, যা বাছাই করেname একমাত্র উদ্দেশ্য। নাম বাছাইয়ের যুক্তি চারপাশের কোডের প্রবাহকে বাধাগ্রস্থ করছে না - এটি আশেপাশের কোডের খুব উদ্দেশ্য!

উপসংহার - পুরো ফাংশন বডিটিকে ওয়ান-লাইনারে পরিণত করবেন না

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

বিঃদ্রঃ

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

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