কোড পর্যালোচনার পরে আমি কেবল একটি নকশা পছন্দ নিয়ে আলোচনা করেছি। আমি আপনার মতামত কি অবাক।
এই Preferences
শ্রেণিটি রয়েছে, যা কী-মান জোড়গুলির জন্য একটি বালতি। নাল মান বৈধ (এটি গুরুত্বপূর্ণ)। আমরা প্রত্যাশা করি যে নির্দিষ্ট মানগুলি এখনও সংরক্ষণ নাও হতে পারে, এবং আমরা অনুরোধের সময় পূর্বনির্ধারিত ডিফল্ট মান দিয়ে এগুলি শুরু করে স্বয়ংক্রিয়ভাবে এই কেসগুলি পরিচালনা করতে চাই।
আলোচনা সমাধান নিম্নলিখিত প্যাটার্ন ব্যবহৃত (উল্লেখ্য: এই হল না প্রকৃত কোড, স্পষ্টত - এটা অর্থবোধক উদ্দেশ্যে সরলীকৃত করা হয়েছে):
public class Preferences {
// null values are legal
private Map<String, String> valuesFromDatabase;
private static Map<String, String> defaultValues;
class KeyNotFoundException extends Exception {
}
public String getByKey(String key) {
try {
return getValueByKey(key);
} catch (KeyNotFoundException e) {
String defaultValue = defaultValues.get(key);
valuesFromDatabase.put(key, defaultvalue);
return defaultValue;
}
}
private String getValueByKey(String key) throws KeyNotFoundException {
if (valuesFromDatabase.containsKey(key)) {
return valuesFromDatabase.get(key);
} else {
throw new KeyNotFoundException();
}
}
}
এটি একটি বিরোধী-নিদর্শন হিসাবে সমালোচিত হয়েছিল - প্রবাহকে নিয়ন্ত্রণ করতে ব্যতিক্রমগুলি অপব্যবহার করে । KeyNotFoundException
- কেবলমাত্র সেই এক ব্যবহারের ক্ষেত্রেই প্রাণবন্ত হয়েছিল - এই শ্রেণীর ক্ষেত্রের বাইরে কখনও দেখা যায় না।
একে অপরের সাথে কিছু যোগাযোগ করার জন্য এটি আনতে মূলত দুটি পদ্ধতি এটি নিয়ে আসে।
ডাটাবেসে উপস্থিত না থাকা কীটি উদ্বেগজনক বা ব্যতিক্রমী কিছু নয় - আমরা যখনই নতুন পছন্দ সেটিংস যুক্ত করা হয় তখন এটি ঘটবে বলে আশা করি, সুতরাং প্রয়োজনে যদি কোনও ডিফল্ট মান দিয়ে নিখরচায়ভাবে এটির প্রক্রিয়া শুরু করে।
পাল্টা পরামর্শটি ছিল যে getValueByKey
- ব্যক্তিগত পদ্ধতি - বর্তমানে নির্ধারিত হিসাবে ব্যক্তিগত মূল্য - এবং কী কী ছিল তা উভয়ই সম্পর্কে সাধারণ পদ্ধতি অবহিত করার কোনও প্রাকৃতিক উপায় নেই। (এটি না থাকলে এটি যুক্ত করতে হবে যাতে মানটি আপডেট করা যায়)।
প্রত্যাবর্তনটি null
দ্ব্যর্থহীন হবে, যেহেতু null
একটি নিখুঁত আইনী মূল্য, তাই কীটি কী ছিল না তা বোঝা যাচ্ছে না বা ছিল কিনা তা বলার অপেক্ষা রাখে না null
।
getValueByKey
কোনও ধরণের একটি ফেরত দিতে হবে Tuple<Boolean, String>
, কীটি ইতিমধ্যে উপস্থিত থাকলে বুল সেট হয়ে যায়, যাতে আমরা (true, null)
এবং এর মধ্যে পার্থক্য করতে পারি (false, null)
। (একটি out
পরামিতি সি # তে ব্যবহার করা যেতে পারে তবে এটি জাভা))
এটি কি সুন্দর বিকল্প? হ্যাঁ, আপনাকে এর প্রভাবের জন্য কিছু একক-ব্যবহারের শ্রেণি সংজ্ঞায়িত করতে হবে Tuple<Boolean, String>
তবে তারপরে আমরা মুক্তি পাচ্ছি KeyNotFoundException
, যাতে এই ধরণের ভারসাম্য থাকে। আমরা একটি ব্যতিক্রম পরিচালনা করার ওভারহেডও এড়িয়ে চলেছি, যদিও এটি ব্যবহারিক দিক থেকে তাৎপর্যপূর্ণ নয় - কথা বলার জন্য কোনও কার্যকারিতা বিবেচনা নেই, এটি একটি ক্লায়েন্ট অ্যাপ্লিকেশন এবং এটি পছন্দ নয় যে ব্যবহারকারীর পছন্দগুলি প্রতি সেকেন্ডে কয়েক মিলিয়ন বার পুনরুদ্ধার হবে।
এই পদ্ধতির বিভিন্নতা Optional<String>
কিছু কাস্টমের পরিবর্তে পেয়ারা ব্যবহার করতে পারে (পেয়ারা পুরো প্রকল্পে ইতিমধ্যে ব্যবহৃত হয়ে থাকে) Tuple<Boolean, String>
এবং তারপরে আমরা Optional.<String>absent()
"যথাযথ" এর মধ্যে পার্থক্য করতে পারি null
। এটি এখনও হ্যাকশ বোধ করে, যদিও সহজে দেখা যায় - দুটি স্তরের "নালীনতা" প্রবর্তন করা ধারণাটিকে অপব্যবহার করে বলে মনে হয় যে এটি তৈরির পিছনে দাঁড়িয়েছিল Optional
।
অন্য বিকল্পটি হ'ল কীটি উপস্থিত রয়েছে কিনা তা স্পষ্টভাবে যাচাই করা হবে (একটি boolean containsKey(String key)
পদ্ধতি যুক্ত করুন এবং getValueByKey
কেবলমাত্র যদি আমরা ইতিমধ্যে এটি বিদ্যমান বলে ধরে রেখেছি তবেই কল করুন )।
শেষ অবধি, কেউ প্রাইভেট পদ্ধতিতেও ইনলাইন করতে পারে তবে getByKey
আমার কোডের নমুনার চেয়ে প্রকৃতটি কিছুটা জটিল thus এইভাবে ইনলাইনিং এটিকে বেশ খারাপ লাগবে।
আমি এখানে কেশ বিভক্ত হতে পারে, তবে আমি আগ্রহী যে আপনি এই ক্ষেত্রে সেরা অনুশীলন সবচেয়ে নিকটতম হতে বাজি করা হবে। ওরাকল বা গুগলের স্টাইল গাইডগুলিতে আমি কোনও উত্তর পাই না।
কোড নমুনার মতো ব্যতিক্রমগুলি কী কোনও বিরোধী-প্যাটার্ন হিসাবে ব্যবহার করা হচ্ছে, বা বিকল্পগুলি খুব পরিষ্কার নয়, তা যদি দেওয়া হয় তবে তা গ্রহণযোগ্য? যদি তা হয় তবে কোন পরিস্থিতিতে তা ঠিক থাকবে? এবং বিপরীতভাবে?
getValueByKey
প্রকাশ্য হয় তখন আরও আকর্ষণীয় হয়ে ওঠে ।