উভয়সঙ্কট
আমি অবজেক্ট অরিয়েন্টেড প্র্যাকটিস সম্পর্কে প্রচুর সেরা অনুশীলনের বই পড়ছি এবং আমি যে প্রায় প্রতিটি বই পড়েছি তার একটি অংশ ছিল যেখানে তারা বলে যে এনামগুলি একটি কোডের গন্ধ। আমি মনে করি এনামগুলি বৈধ হওয়ার সময় তারা যে অংশটি ব্যাখ্যা করেছে সেখানে তারা মিস করেছে।
যেমন, আমি খোঁজ করছি নির্দেশিকা এবং / অথবা ব্যবহার-মামলা যেখানে enums হয় না একটি কোড গন্ধ ও একটি বৈধ কনস্ট্রাক্ট আসলে।
সূত্র:
"সতর্কতা থাম্বের একটি নিয়ম হিসাবে, এনামগুলি কোডের গন্ধ এবং এটিকে বহুবর্ষীয় ক্লাসগুলিতে রিফ্যাক্ট করা উচিত [[৮]" সিম্যান, মার্ক,। নেট ইন ডিপেন্ডেন্সি ইনজেকশন, নেট, ২০১১, পৃষ্ঠা। 342
[8] মার্টিন ফোলার এট।, রিফ্যাক্টরিং: বিদ্যমান কোডের নকশা উন্নতি করা (নিউ ইয়র্ক: অ্যাডিসন-ওয়েসলি, 1999), 82।
প্রসঙ্গ
আমার দ্বিধাটির কারণটি একটি ট্রেডিং এপিআই। তারা আমাকে এই পদ্ধতিতে প্রেরণ করে টিক ডেটার একটি স্ট্রিম দেয়:
void TickPrice(TickType tickType, double value)
কোথায় enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
আমি এই এপিআইটির চারপাশে একটি মোড়ক তৈরি করার চেষ্টা করেছি কারণ পরিবর্তনগুলি ভাঙ্গা এই এপিআইয়ের জীবনযাত্রা। আমি আমার মোড়কের উপরে সর্বশেষ প্রাপ্ত প্রতিটি টিক টাইপের মান ট্র্যাক করে রাখতে চেয়েছিলাম এবং টিকটাইপের একটি অভিধান ব্যবহার করে এটি করেছি:
Dictionary<TickType,double> LastValues
আমার কাছে এটি এনামের কী হিসাবে ব্যবহার করা হলে এটি যথাযথ ব্যবহারের মতো বলে মনে হয়েছিল। তবে আমার দ্বিতীয় চিন্তা আছে কারণ আমার এই সংগ্রহের ভিত্তিতে সিদ্ধান্ত নেওয়ার মতো জায়গা আছে এবং আমি কীভাবে সুইচ স্টেটমেন্টটি সরিয়ে ফেলতে পারি তার কোনও উপায় আমি ভাবতে পারি না, আমি একটি কারখানা ব্যবহার করতে পারি তবে সেই কারখানার এখনও থাকবে কোথাও সুইচ স্টেটমেন্ট। আমার কাছে মনে হয়েছিল যে আমি কেবল জিনিসগুলি ঘুরিয়ে নিচ্ছি তবে এটি এখনও গন্ধ পাচ্ছে।
এনামগুলি না করা সহজ, তবে ডিওগুলি, এত সহজ নয় এবং আমি যদি লোকেরা তাদের দক্ষতা, উপকারিতা এবং স্বভাবগুলি ভাগ করে নিতে পারি তবে আমি এটির প্রশংসা করব।
দ্বিতীয় চিন্তা
কিছু সিদ্ধান্ত এবং ক্রিয়া এগুলির উপর ভিত্তি করে থাকে TickType
এবং আমি এনাম / স্যুইচ বিবৃতি অপসারণের কোনও উপায় মনে করতে পারি না। আমি যে পরিষ্কার সমাধানটি ভাবতে পারি তা হ'ল একটি কারখানা ব্যবহার করা এবং এর ভিত্তিতে একটি বাস্তবায়ন ফিরিয়ে আনা TickType
। তারপরেও আমার এখনও একটি সুইচ স্টেটমেন্ট থাকবে যা একটি ইন্টারফেসের প্রয়োগ বাস্তবায়ন করে।
নীচে তালিকাবদ্ধ এমন নমুনা শ্রেণীর একটি যেখানে আমার সন্দেহ রয়েছে যে আমি কোনও এনাম ভুল ব্যবহার করছিলাম:
public class ExecutionSimulator
{
Dictionary<TickType, double> LastReceived;
void ProcessTick(TickType tickType, double value)
{
//Store Last Received TickType value
LastReceived[tickType] = value;
//Perform Order matching only on specific TickTypes
switch(tickType)
{
case BidPrice:
case BidSize:
MatchSellOrders();
break;
case AskPrice:
case AskSize:
MatchBuyOrders();
break;
}
}
}
enums as switch statements might be a code smell ...