কেন পদ্ধতির নামগুলিতে সংমিশ্রণের ব্যবহার একটি খারাপ নামকরণ কনভেনশন? [বন্ধ]


12

আমার দলে, আমরা কয়েকটি সফটওয়্যার স্থপতিদের সাথে ঘনিষ্ঠভাবে কাজ করি। তারা আমাদের প্রকল্পগুলির সমস্ত ডিজাইনের সিদ্ধান্তগুলি অনুমোদন করে, কিছু কোড পর্যালোচনা ইত্যাদি করে etc.

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

সাম্প্রতিককালে, তারা এমন কিছু পরামর্শ দিয়েছে যা আমি খুব অদ্ভুত বলে মনে করি: সমস্ত পদ্ধতির নামের সাথে মিল থাকা উচিত getEntityOrNull, setValueOrExceptionইত্যাদি etc.

এই জাতীয় নামকরণের কনভেনশনটি আমার কাছে খুব খারাপ লাগছে, তবে আমি কোনও দৃ challenge় যুক্তি বা অনলাইন নিবন্ধ / পৃষ্ঠাগুলি নিয়ে আসতে পারছি না যা এটিকে বিশেষভাবে চ্যালেঞ্জ করে।

আমি যে বিষয়গুলি নিয়ে এসেছি তা হ'ল:

  • পদ্ধতির টীকাগুলিতে যেমন @returnবা তেমন তথ্য উপস্থিত থাকতে হবে@throws
  • পদ্ধতির নামগুলিতে সংযুক্তি ("এবং", "বা" ইত্যাদি) এর ব্যবহার সাধারণত পরামর্শ দেয় যে একক দায়িত্বের নীতিটি যথাযথভাবে সম্মানিত নয়

এই নামকরণ কনভেনশনটির বিরুদ্ধে আরও কিছু যুক্তিযুক্ত যুক্তি কি?



5
the use of conjunctions ("and", "or" etc.) in method names usually suggest that the Single Responsibility Principle is not properly respectedআপনি তালিকাভুক্ত উদাহরণগুলির ক্ষেত্রে এটি নয়, যেখানে ব্যর্থতাগুলি পরিচালনা করতে ব্যবহৃত ব্যবস্থাকে স্পষ্ট করতে সংমিশ্রণটি ব্যবহৃত হয়, এটি কোনও কাজ বা অন্য কোনও কাজ করতে পারে তা বোঝাতে নয়। এমনকি খুব সংক্ষিপ্ত-সংজ্ঞায়িত ফাংশনটিতে বৈধ ব্যর্থতা শর্ত থাকতে পারে, যেমন একটি খালি স্ট্যাক পপিং।
ডোভাল

4
বিবেচনা করুন: (1) "বা নাল" না দিয়ে "alচ্ছিক" ব্যবহার করুন। "GetOptionalEntity" আমার কানের কাছে "getEntityOrNull" এর চেয়ে ভাল লাগে। (২)। নেট বেস ক্লাসের লাইব্রেরিটি কনভেনশনটি ব্যবহার করে যে যদি আপনার দুটি পদ্ধতি থাকে যা কেবল তারা ফেলে দেয় তার মধ্যে পৃথক হয়, এমন একটিটির নাম দিন যা "ট্রাইব্লাহ" নিক্ষেপ করতে পারে না। উদাহরণস্বরূপ, Int32.TryParseএবং Int32.Parse- উভয়ই একটি স্ট্রিংকে একটি পূর্ণসংখ্যার মধ্যে পার্স করে, তবে পূর্ববর্তীটি একটি বুলিয়ানকে সাফল্যের সূচনা করে এবং পরে ব্যর্থতার দিকে ছুড়ে দেয়।
এরিক লিপার্ট

আমি নিক্ষেপকরণ বৈকল্পিকের জন্য প্রত্যয় ব্যবহার করব না, তবে নাল রিটার্নিং ভেরিয়েন্টের জন্য আমি একটি ব্যবহার করব। হতে পারে Try..., ...OrNull, ...OrDefault। @ এরিকলিপার্ট। নেট এ এটিই কেবল সম্মেলন নয়। Singleবনাম বিবেচনা করুন SingleOrDefault, যা OrNullপ্রস্তাবিত ওপির খুব কাছাকাছি ।
কোডসইনচাউস

উত্তর:


11

নামকরণের দ্বন্দ্বের কারণে তারা সম্ভবত এটি করছে। আমি ধরে নিলাম আপনার দুটি নামকরণের নাম থাকতে পারে না getEntity, একটি সম্ভবত সম্ভবত একটি ব্যতিক্রম ছুঁড়ে দেয় এবং একটি যা প্রত্যাবর্তন করে null। অতএব, আপনাকে সে অনুযায়ী নামকরণ করতে হবে।

আমি, একের জন্য, একই পদ্ধতিটি কল করার অনেকগুলি ভিন্ন পদ্ধতি থাকার অভ্যাসটি অপছন্দ করি না যদি না এটি কিছুটা পরিবর্তন করে যা কেবলমাত্র সেই নির্দিষ্ট শ্রেণিই সম্পাদন করতে পারে।

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

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


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

1
@Doval গুড পয়েন্ট, এবং সম্ভবত সবচেয়ে গুরুত্বপূর্ণভাবে, ব্যতিক্রম হওয়া উচিত ব্যতিক্রমী । আপনি যদি প্রায়শই ব্যতিক্রম ছুঁড়ে ফেলে থাকেন তবে আপনি সেগুলি সঠিকভাবে ব্যবহার করছেন না। ফিরে আসার nullক্ষেত্রে কেবল সমস্যাটি হ'ল এটি nullকিছু ক্ষেত্রে প্রকৃতপক্ষে বৈধ রিটার্ন হতে পারে এবং তাই আপনাকে আদর্শ থেকে বিচ্যুত হতে হবে এবং এই জাতীয় উদাহরণগুলিতে একটি ব্যতিক্রম নিক্ষেপ করতে হবে।
নিল

3

যদিও সংশ্লেষের ব্যবহার প্রায়শই এসআরপি লঙ্ঘনের ইঙ্গিত দেয়, তবে এই ক্ষেত্রে এটি কেবল একজন দরিদ্র ব্যক্তির বীজগণিত ডেটা টাইপের প্রত্যাবর্তন মূল্য নির্দেশ করে যা দুটি মানগুলির মধ্যে nullএকটি বা "সাফল্য" মান হতে পারে।

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

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

আপনি যে ভাষাটি ব্যবহার করছেন তার সীমাবদ্ধতাগুলি দেওয়া, এটি সম্পূর্ণরূপে অযৌক্তিক শৈলী নয়।


2

আমার কোডে আমি মাঝে মাঝে getEntity () এবং getEntityOrNull () এর মতো নামের সাথে পদ্ধতির জুড়ি তৈরি করি। নামটি প্রত্যাশিত আচরণটি পরিষ্কার করে দেয়। যদি getEntity () কোনও সত্তা খুঁজে না পায় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়। getEntityOrNull () একটি নাল ফিরিয়ে দেবে।

এটি করার মাধ্যমে, কলিং কোডটি কিছুটা পরিষ্কার হয়ে যায়। যদি কলিং কোডটিতে কোনও সত্তা থাকতে হয় তবে getEntity কৌশলটি করবে। সত্তা যদি একরকম optionচ্ছিক পাতলা হয় তবে getEntityOrNull পছন্দ করার পদ্ধতি choice

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

যদি আপনার স্থপতিরা এই ধরণের পদ্ধতির জোড় ব্যবহার না করে তবে হ্যাঁ, আমি প্রত্যয়টির প্রয়োজনীয়তা নিয়ে প্রশ্ন করব।

সত্যই কখনও কোনও সেটভ্যালিউরঅ্যাক্সেপশন পদ্ধতি দেখেনি। এর জন্য ভাল একটি সাধারণ ব্যবহারের ক্ষেত্রে ভাবতে পারে না।

আপনি স্থপতিদের কেন তা জিজ্ঞাসা করতে পারেন। আমি যাদের জানি তাদের সিদ্ধান্তগুলি ব্যাখ্যা করতে সর্বদা খুশি। প্রায়শই দুর্দান্ত (এবং কখনও কখনও উদ্দীপক) বিশদে।


এই getEntity ব্যর্থতার উপর একটি ব্যতিক্রম ছুঁড়ে ফেলবে আমার কাছে মোটেও পরিষ্কার নয়, আমি একটি সাধারণ NULL আশা করব।
এলিস ভ্যান লুইজ

1

আপনার দুটি যুক্তি সুস্পষ্ট। তবে তারা যদি নামকরণের সম্মেলনের সিদ্ধান্ত নেওয়ার দায়িত্বে থাকেন তবে এটির সাথে আপনি একমত নন এমনটি হওয়ায় খুব খারাপ লাগার চেষ্টা করবেন না।

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

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