পুষ্পিত ডোমেন অবজেক্টগুলি এড়ানো


12

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

আমাদের একটি কেন্দ্রীয় ডোমেন ক্লাস রয়েছে যা আমাদের বেশিরভাগ কাজের ফোকাস - একটি বাণিজ্য। ট্রেড অবজেক্টটি কীভাবে নিজের দাম নির্ধারণ করতে হবে, ঝুঁকি কীভাবে নির্ধারণ করতে হবে, নিজেকে বৈধতা দেবে ইত্যাদি জানবে then আমরা তারপরে পলিমারফিজমের সাথে শর্তাবলিকে প্রতিস্থাপন করতে পারি। উদাহরণস্বরূপ: সিম্পলট্রেড নিজেই এক উপায়ে দাম নির্ধারণ করবে, তবে কমপ্লেক্সট্রেড নিজেই অন্য একটি দাম নির্ধারণ করবে।

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

সুতরাং আমাদের পছন্দ আছে:

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

প্রস্তাবিত পদ্ধতির কী হবে?


কোনও সমস্যা নেই - আমি স্থানান্তর গ্রহণ করে খুশি!

1
বিপরীত থেকে সাবধান থাকুন: মার্টিনফাউলর
অ্যানিমিকডোমেনমডেল

1
"আরও বৈশিষ্ট্য যুক্ত হওয়ার সাথে সাথে শ্রেণীর আকার তাত্পর্যপূর্ণভাবে বাড়তে চলেছে" - যে কোনও প্রোগ্রামারকে "তাত্পর্যপূর্ণ" শব্দটির মতো অপব্যবহার করার চেয়ে আরও ভালভাবে জানা উচিত।
মাইকেল বর্গওয়ার্ট

@ পিসকভর যা স্রেফ বোকা
অ্যারিস ল্যাপসা

@ অরণিস এল: আপনার চিন্তাশীল মন্তব্যের জন্য আপনাকে ধন্যবাদ। মনে রাখবেন যে এটি ছিল "উদ্ধৃতি 22 নভেম্বর 22: 22 এ stackoverflow.com থেকে স্থানান্তরিত", আমার মন্তব্যটি সহ সেখানে। আমি এখন আমার মন্তব্যটি সরিয়ে দিয়েছি যে "এটি প্রোগ্রামারগুলিতে আরও ভাল হবে SEএসই"; এখন, আপনার যুক্ত করার মতো কিছু আছে, বা আপনি যে ভাবনাটি প্রকাশ করতে চেয়েছিলেন কেবল এটিই ছিল?
পিসকভোর

উত্তর:


8

আপনি যদি ডোমেন চালিত হয়ে যান তবে আপনার ট্রেড ক্লাসটিকে সামগ্রিক মূল হিসাবে বিবেচনা করুন এবং এর দায়বদ্ধতাগুলি অন্য শ্রেণিতে বিভক্ত করুন।

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

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


আমি রাজী. আচরণের ক্ষেত্রে পদার্থের চিন্তাভাবনা যা সমস্যার সমাধান করে (প্রাইসিং, রিস্কএ্যাসেসমেন্ট) সমস্যাটি মডেল করার চেষ্টা করার পরিবর্তে এই একচেটিয়া শ্রেণিকে এড়িয়ে চলে।
গ্যারেট হল

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

4

আপনার প্রশ্নটি অবশ্যই আমাকে কৌশল প্যাটার্ন সম্পর্কে ভাবতে বাধ্য করে । তারপরে আপনি বিভিন্ন ট্রেডিং / মূল্যের কৌশলগুলিতে অদলবদল করতে পারেন, আপনি যা বলছেন তার অনুরূপ TradePricingService

আমি অবশ্যই মনে করি আপনি যে পরামর্শটি পাবেন তা হ'ল উত্তরাধিকারের পরিবর্তে রচনা ব্যবহার করা।


2

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

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

interface IPriceCalculator {
  double getPrice(ITrader t);
}
interface ITrader {
  IPriceCalculator getPriceCalculator();
}
class Tracer implements ITrader {
  private IPriceCalculator myPriceCalculator = null;
  IPriceCalculator getPriceCalculator() {
    if (myPriceCalculator == null)
      myPriceCalculator = PriceCalculatorFactory.get(this);
    return myPriceCalculator;
  }
}

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

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


2

আপনার ডোমেন সম্পর্কে অনেক কিছুই বলতে পারে না, কিন্তু

আমাদের একটি কেন্দ্রীয় ডোমেন ক্লাস রয়েছে যা আমাদের বেশিরভাগ কাজের ফোকাস - একটি বাণিজ্য।

... এটা আমার গন্ধ। আমি সম্ভবত ক্লাসের বিভিন্ন দায়িত্ব স্কেচ করার চেষ্টা করতাম এবং শেষ পর্যন্ত এটি বিভিন্ন সংস্থায় বিভক্ত করতাম। সমষ্টিগুলি তখন ভূমিকা এবং / অথবা জড়িত স্টেকহোল্ডার / ডোমেন বিশেষজ্ঞদের দৃষ্টিভঙ্গিগুলির আশেপাশে নকশা করা হবে। যদি দাম এবং ঝুঁকি একই আচরণ / ব্যবহারের ক্ষেত্রে জড়িত থাকে তবে তারা সম্ভবত একই সমষ্টিতে অন্তর্ভুক্ত। তবে যদি তারা ডিকপলড হয় তবে তারা পৃথক সংস্থার অন্তর্ভুক্ত।

সম্ভবত ঝুঁকি মূল্যায়ন আপনার ডোমেনের একটি পৃথক সত্তা হতে পারে, শেষ পর্যন্ত একটি নির্দিষ্ট জীবনচক্র সহ (আমি সত্যিই বলতে পারি না, আমি কেবল অনুমান করছি ... আপনি আপনার ডোমেন জানেন, আমি জানি না) তবে মূল বিষয়টি অন্তর্নিহিত ধারণা তৈরি করা সুস্পষ্ট এবং সংযোজন এড়ানোর জন্য যা আচরণ দ্বারা চালিত নয়, কেবলমাত্র উত্তরাধিকারের ডেটা কাপলিংয়ের মাধ্যমে।

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

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