ডিডিডি - এই নিয়ম যে সত্তাগুলি সরাসরি সংগ্রহস্থলগুলি অ্যাক্সেস করতে পারে না


183

ডোমেন চালিত নকশা, সেখানে মনে করা হয় প্রচুর এর চুক্তি যে সংস্থাগুলো করা উচিত নয় এক্সেস সংগ্রহস্থল সরাসরি।

এটি কি এরিক ইভান্স ডোমেন চালিত ডিজাইনের বই থেকে এসেছে বা এটি অন্য কোথাও থেকে এসেছে?

এর পিছনে যুক্তির জন্য কিছু ভাল ব্যাখ্যা কোথায় আছে?

সম্পাদনা করুন: স্পষ্ট করার জন্য: আমি ব্যবসার যুক্তি থেকে ডেটা অ্যাক্সেসকে আলাদা স্তরে আলাদা করার ক্লাসিক ওও অনুশীলনের কথা বলছি না - আমি সুনির্দিষ্ট ব্যবস্থা সম্পর্কে বলছি যার মাধ্যমে ডিডিডি-তে, সংস্থাগুলি ডেটাতে কথা বলার কথা নয় অ্যাক্সেস লেয়ারটি একেবারেই (যেমন তারা রিপোজিটরি অবজেক্টের রেফারেন্স রাখার কথা নয়)

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

আপডেট: মার্চ ২০১৩, এই প্রশ্নের উপরোক্ত বিষয়গুলি বোঝায় যে এর মধ্যে অনেক আগ্রহ রয়েছে, এবং প্রচুর উত্তর পাওয়া সত্ত্বেও, আমি এখনও মনে করি লোকেরা সম্পর্কে ধারণা থাকলে আরও কিছু করার সুযোগ রয়েছে।


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

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

উত্তর:


47

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

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

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

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

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

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

ভান্ডারগুলি অ্যাক্সেস করতে পারে এমন পরিষেবা স্তরে বৈধতা অবজেক্ট তৈরি করতে ভয় পাবেন না । এটি কেবল ডোমেন স্তর থেকে দূরে রাখুন।


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

আমার প্রতিক্রিয়া মন্তব্য বাক্সের অনুমতি দেওয়ার চেয়ে বড় ছিল, সম্পাদনাটি দেখুন।
কেরটোসিস

6
কীভাবে নিজেকে ক্ষতির হাত থেকে রক্ষা করবেন তা আপনার সত্তার জানা উচিত। এটি কোনও অবৈধ অবস্থায় না যেতে পারে তা নিশ্চিত করা অন্তর্ভুক্ত। চ্যাট রুম ব্যবহারকারীর সাথে আপনি যা বর্ণনা করছেন তা হ'ল ব্যবসায়িক যুক্তি যা সত্তাকে নিজেকে বৈধ রাখতে যুক্তিযুক্ত যুক্তিতে যুক্ত হয়। ব্যবসায়িক যুক্তি যেমন আপনার চাওয়াটি চ্যাটরুম পরিষেবাতে অন্তর্ভুক্ত, চ্যাটউজার সত্তা নয় like
আলেক

9
ধন্যবাদ আলেক এটি প্রকাশের একটি সুস্পষ্ট উপায়। তবে আমার কাছে মনে হয় যে ইভান্সের 'সমস্ত ব্যবসায়িক যুক্তি ডোমেন স্তরে থাকা উচিত' এর ডোমেন-কেন্দ্রিক সুবর্ণ নিয়মটি 'সত্তাগুলি রিপোজিটরিগুলিতে অ্যাক্সেস করা উচিত নয়' এই নিয়মের সাথে সাংঘর্ষিক। আমি এটির সাথে বাঁচতে পারি যদি আমি বুঝতে পারি যে এটি কেন, তবে কেন সত্তাগুলি সংগ্রহস্থলগুলিতে অ্যাক্সেস করতে হবে সে সম্পর্কে কোনও ভাল ব্যাখ্যা আমি পাই না। ইভান্স এটি স্পষ্টভাবে উল্লেখ করেছে বলে মনে হয় না। এটা কোথা থেকে এসেছে? আপনি যদি কিছু ভাল সাহিত্যের দিকে ইঙ্গিত করে কোনও উত্তর পোস্ট করতে পারেন তবে আপনি নিজের জন্য একটি 50pt অনুগ্রহ অর্জন করতে সক্ষম হতে পারেন:)
কোডুলিকে

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

35

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

  1. একটি অনুরোধে এবং আমাদের ডোমেন থেকে আমরা কী চাই তা আমাদের উদ্দেশ্য জানতে হবে, সুতরাং আমরা সমষ্টিগত আচরণ নির্মাণ বা আহ্বান করার আগে সংগ্রহস্থল কল করতে পারি। এটি মেমরির অসামঞ্জস্যের সমস্যা এবং অলস লোডিংয়ের প্রয়োজনীয়তা এড়াতে সহায়তা করে (এই নিবন্ধটি দেখুন )। গন্ধটি হ'ল ডেটা অ্যাক্সেস সম্পর্কে চিন্তা না করে আপনি আর আপনার সত্তার স্মৃতি উদাহরণ তৈরি করতে পারবেন না।
  2. সিকিউএস (কমান্ড ক্যোয়ারী বিচ্ছেদ) আমাদের সত্তাগুলির জিনিসগুলির জন্য সংগ্রহস্থলটি কল করার প্রয়োজনটিকে হ্রাস করতে সহায়তা করতে পারে।
  3. আমরা ডোমেন লজিকের প্রয়োজনগুলি সজ্জিত করতে এবং যোগাযোগের জন্য একটি স্পেসিফিকেশন ব্যবহার করতে পারি এবং পরিবর্তে এটি সংগ্রহস্থলে পাস করতে পারি (কোনও পরিষেবা আমাদের জন্য এই জিনিসগুলি অর্কেস্টেট করতে পারে)। স্পষ্টতা সেই সত্তা থেকে আসতে পারে যা সেই আক্রমণকারী রক্ষণাবেক্ষণের দায়িত্বে থাকে। সংগ্রহশালা স্পেসিফিকেশনটির অংশগুলিকে তার নিজস্ব ক্যোয়ারী বাস্তবায়নে ব্যাখ্যা করবে এবং ক্যোয়ারির ফলাফলগুলিতে স্পেসিফিকেশন থেকে নিয়ম প্রয়োগ করবে। এর লক্ষ্যটি ডোমেন স্তরে ডোমেন যুক্তি রাখা। এটি সর্বব্যাপী ভাষা এবং কথোপকথনের আরও ভাল কাজ করে। "ওভারডু অর্ডার স্পেসিফিকেশন" বলার বিপরীতে "টিবিএল_র্ডার থেকে ফিল্টার অর্ডার যেখানে বলা_ সিসডেটের 30 মিনিটেরও কম" (এই উত্তরটি দেখুন ) বলার কল্পনা করুন ।
  4. একক-দায়িত্বশীলতার নীতি লঙ্ঘন করার কারণে এটি সত্তাগুলির আচরণ সম্পর্কে যুক্তি আরও জটিল করে তোলে। আপনার যদি স্টোরেজ / জেদীকরণের বিষয়ে কাজ করতে হয় তবে আপনি কোথায় যেতে হবে এবং কোথায় যাবেন না তা আপনি জানেন।
  5. এটি কোনও সত্তাকে বৈশ্বিক রাজ্যে দ্বি-দিকনির্দেশক অ্যাক্সেস দেওয়ার বিপদ এড়ায় (সংগ্রহস্থল এবং ডোমেন পরিষেবাদির মাধ্যমে)। আপনি আপনার লেনদেনের সীমানাও ভাঙতে চান না।

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

থাম্বের নিয়ম হিসাবে, আমাদের যদি সম্ভব হয় তবে অ্যাগ্রিগেটের অভ্যন্তর থেকে সংগ্রহস্থল (12) ব্যবহার এড়াতে চেষ্টা করা উচিত।

ভার্নন, ভন (2013-02-06)। ডোমেন-চালিত ডিজাইন প্রয়োগ করা হচ্ছে (কিন্ডল অবস্থান 6089)। পিয়ারসন শিক্ষা. কিন্ডলে সংস্করণ.

এবং সমষ্টি সম্পর্কিত 10 অধ্যায়ে, "মডেল নেভিগেশন" শিরোনাম বিভাগে তিনি বলেছেন (অন্যান্য সমষ্টিগত শিকড়গুলির উল্লেখ করার জন্য তিনি বৈশ্বিক অনন্য আইডি ব্যবহারের পরামর্শ দেওয়ার পরে):

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

তিনি কোডে এর একটি উদাহরণ দেখিয়ে যান:

public class ProductBacklogItemService ... { 

   ... 
   @Transactional 
   public void assignTeamMemberToTask( 
        String aTenantId, 
        String aBacklogItemId, 
        String aTaskId, 
        String aTeamMemberId) { 

        BacklogItem backlogItem = backlogItemRepository.backlogItemOfId( 
                                        new TenantId( aTenantId), 
                                        new BacklogItemId( aBacklogItemId)); 

        Team ofTeam = teamRepository.teamOfId( 
                                  backlogItem.tenantId(), 
                                  backlogItem.teamId());

        backlogItem.assignTeamMemberToTask( 
                  new TeamMemberId( aTeamMemberId), 
                  ofTeam,
                  new TaskId( aTaskId));
   } 
   ...
}     

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

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

1) এটি সুপারিশ করা হয় না:

$user->mountFriends(); // <-- has a repository call inside that loads friends? 

2) একটি ডোমেন পরিষেবাতে, এটি ভাল:

public function mountYourFriends(MountFriendsCommand $mount) { /* see http://store.steampowered.com/app/296470/ */ 
    $user = $this->users->get($mount->userId()); 
    $friends = $this->users->findBySpecification($user->getFriendsSpecification()); 
    array_map([$user, 'mount'], $friends); 
}

1
প্রশ্ন: আমাদের সর্বদা একটি অবৈধ বা বেমানান অবস্থায় কোনও বিষয় তৈরি না করতে শেখানো হয়। আপনি যখন ব্যবহারকারীদের সংগ্রহস্থল থেকে লোড করবেন এবং তারপরে আপনি getFriends()অন্য কোনও কিছু করার আগে কল করবেন, এটি খালি বা অলস লোড হবে। যদি খালি থাকে, তবে এই বস্তুটি মিথ্যা এবং একটি অবৈধ অবস্থায় রয়েছে। এই সম্পর্কে কোন চিন্তা?
জিম্বো

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

27

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

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

যেমন আপনি দেখতে পাচ্ছেন সত্তা A সত্তা বি এর জীবনচক্রের সাথে আরও জড়িত হতে পারে এবং এটি মডেলের আরও জটিলতা যুক্ত করতে পারে।

আমার ধারণা (কোনও উদাহরণ ছাড়াই) ইউনিট-পরীক্ষা আরও জটিল হবে।

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


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

আমি বইটি বেশ কয়েক বছর আগে পড়েছি (ভাল 3 ...) এবং আমার স্মৃতি আমাকে ব্যর্থ করে। তিনি যদি ঠিক এটি বাক্যাংশ করেন তবে আমি মনে করতে পারি না তবে তবে আমি বিশ্বাস করি তিনি উদাহরণের মাধ্যমে এটি চিত্রিত করেছেন। আপনি তার কার্গো উদাহরণ (তার বই থেকে) এর একটি সম্প্রদায় ব্যাখ্যা dddsamplenet.codeplex.com এও পেতে পারেন । কোড প্রকল্পটি ডাউনলোড করুন (ভ্যানিলা প্রকল্পটি দেখুন - এটি বইয়ের উদাহরণ)। আপনি দেখতে পাবেন যে ডোমেইন সত্তাগুলি অ্যাক্সেসের জন্য কেবল অ্যাপ্লিকেশন স্তরে ভান্ডারগুলি ব্যবহৃত হয়।
ম্যাগনাস ব্যাকিয়াস

1
বই থেকে DDD SmartCA উদাহরণ ডাউনলোড হচ্ছে p2p.wrox.com/... আপনি অন্য পদ্ধতির দেখতে পাবেন (যদিও এই একটি রিপোর্ট Ria জানালা ক্লায়েন্ট) যেখানে ভান্ডার সেবা ব্যবহার করা হয় (এখানে অদ্ভুত কিছুই) কিন্তু সেবা entites ভিতরে ব্যবহার রয়েছে। এটি এমন একটি জিনিস যা আমি করব না তবে আমি একটি ওয়েব অ্যাপ লোক। স্মার্টসিএ অ্যাপ্লিকেশনটির জন্য দৃশ্যের ভিত্তিতে আপনাকে অবশ্যই অফলাইনে কাজ করতে সক্ষম হতে হবে, সম্ভবত ডিডি ডিজাইনটি অন্যরকম দেখাবে look
ম্যাগনাস ব্যাকিয়াস

স্মার্টকাএ উদাহরণটি আকর্ষণীয় মনে হচ্ছে, এটি কোন অধ্যায়ে রয়েছে? (কোড ডাউনলোডগুলি অধ্যায় অনুসারে সাজানো হয়েছে)
কোডুলাইক

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

13

কেন ডেটা অ্যাক্সেস আলাদা?

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

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

সিস্টেমের আসল বাস্তবায়ন থেকে তালাকপ্রাপ্ত হয়ে পৃথক "বিশ্লেষণ মডেল" এড়ানোর উদ্দেশ্যেই এটি সমস্ত কিছু মনে হয়।

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

অন্যদিকে, বিকাশকারীরা ডোমেন মডেলটিতে অনেকগুলি প্রযুক্তিগত উদ্বেগ প্রবর্তনকারীরাও এই বিভাজন ঘটায়।

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

বরাত দিয়ে:

"একক মডেল ত্রুটি হওয়ার সম্ভাবনা হ্রাস করে, কারণ নকশাটি এখন সাবধানতার সাথে বিবেচিত মডেলটির প্রত্যক্ষ প্রবৃদ্ধি design

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

যদি কোনও ডাটাবেস অ্যাক্সেসের প্রয়োজনীয়তা স্বতন্ত্রতা পরীক্ষা করার মতো জিনিসগুলির জন্য হয় তবে একবার দেখুন:

উদি দহন: ডিডিডি প্রয়োগ করার সময় দলগুলি সবচেয়ে বেশি ভুল করে

http://gojko.net/2010/06/11/udi-dahan-the-biggest-mistakes-teams-make-when-applying-ddd/

"সমস্ত নিয়ম সমানভাবে তৈরি হয় না" এর অধীনে

এবং

ডোমেন মডেল প্যাটার্ন নিয়োগ

http://msdn.microsoft.com/en-us/magazine/ee236415.aspx#id0400119

"ডোমেন মডেল ব্যবহার না করার জন্য পরিস্থিতি" এর অধীনে, যা একই বিষয়ে স্পর্শ করে।

কীভাবে ডেটা অ্যাক্সেস আলাদা করতে হবে

একটি ইন্টারফেসের মাধ্যমে ডেটা লোড হচ্ছে

"ডেটা অ্যাক্সেস স্তর" একটি ইন্টারফেসের মাধ্যমে বিমূর্ত করা হয়েছে, যা আপনি প্রয়োজনীয় ডেটা পুনরুদ্ধারের জন্য কল করেছেন:

var orderLines = OrderRepository.GetOrderLines(orderId);

foreach (var line in orderLines)
{
     total += line.Price;
}

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

কনস: কলিং কোডটি অবশ্যই ধরে নিতে হবে যে কী লোড হয়েছে এবং কী নেই।

বলুন যে গোটোর্ডারলাইনস কর্মক্ষমতা কারণে অর্ডারলাইন অবজেক্টগুলিকে নাল প্রোডাক্ট ইনফোর সম্পত্তি প্রদান করে। বিকাশকারীদের অবশ্যই ইন্টারফেসের পিছনে কোডের অন্তরঙ্গ জ্ঞান থাকতে হবে।

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

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

উপসংহার: মোটামুটি কম বিচ্ছেদ!

অলস লোড হচ্ছে

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

foreach (var line in order.OrderLines)
{
    total += line.Price;
}

পেশাদাররা: ডেটা অ্যাক্সেসের 'WHEN, WHERE, এবং HOW' ডোমেন লজিকের দিকে ফোকাস করে বিকাশকারী থেকে লুকানো। সামগ্রীতে এমন কোনও কোড নেই যা ডেটা লোড করে। লোড হওয়া ডেটার পরিমাণটি কোডের দ্বারা প্রয়োজনীয় সঠিক পরিমাণ হতে পারে।

কনস: আপনি যখন কোনও পারফরম্যান্স সমস্যার সম্মুখীন হন, তখন আপনার যখন জেনেরিক "এক আকারের সমস্ত মানায়" সমাধান সমাধান করা শক্ত হয়। অলস লোডিং সামগ্রিকভাবে খারাপ কার্যকারিতা তৈরি করতে পারে এবং অলস লোডিং বাস্তবায়ন করা জটিল।

ভূমিকা ইন্টারফেস / উত্সাহী আনয়ন

প্রতিটি ব্যবহারের ক্ষেত্রে সামগ্রিক শ্রেণীর দ্বারা প্রয়োগ করা রোল ইন্টারফেসের মাধ্যমে স্পষ্ট করে তৈরি করা হয়, যাতে ডেটা লোডিং কৌশলগুলি ব্যবহারের ক্ষেত্রে প্রতি পরিচালনা করা যায়।

আনার কৌশলটি এর মতো দেখতে পারে:

public class BillOrderFetchingStrategy : ILoadDataFor<IBillOrder, Order>
{
    Order Load(string aggregateId)
    {
        var order = new Order();

        order.Data = GetOrderLinesWithPrice(aggregateId);
    
        return order;
    }

}
   

তারপরে আপনার সমষ্টিটি দেখতে পাওয়া যাবে:

public class Order : IBillOrder
{
    void BillOrder(BillOrderCommand command)
    {
        foreach (var line in this.Data.OrderLines)
        {
            total += line.Price;
        }

        etc...
    }
}

বিলিআর্ডারফেচিংস্ট্রেজি সমষ্টিটি তৈরি করতে ব্যবহার করা হয় এবং তারপরে সমষ্টিটি তার কাজ করে।

পেশাদাররা: সর্বোত্তম পারফরম্যান্সের জন্য মঞ্জুরি দিয়ে ব্যবহারের ক্ষেত্রে কাস্টম কোডের জন্য মঞ্জুরি দেয়। ইন্টারফেস বিভাজন নীতি সঙ্গে ইনলাইন । জটিল কোডের প্রয়োজনীয়তা নেই। সমষ্টি ইউনিট পরীক্ষাগুলি লোডিং কৌশল নকল করতে হবে না। জেনেরিক লোডিং কৌশলটি বেশিরভাগ ক্ষেত্রে ব্যবহার করা যেতে পারে (উদাঃ একটি "সমস্ত লোড" কৌশল) এবং প্রয়োজনে বিশেষ লোডিং কৌশল প্রয়োগ করা যেতে পারে।

কনস: বিকাশকারীকে এখনও ডোমেন কোড পরিবর্তন করার পরে আনার কৌশলটি সামঞ্জস্য / পর্যালোচনা করতে হবে।

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


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

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

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

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

12

আমি এই ব্লগটি সত্ত্বার ভিতরে থাকা এনপ্যাপুলেটিং রিপোজিটারিগুলির বিরুদ্ধে যথেষ্ট ভাল যুক্তি পেয়েছি:

http://thinkbeforecoding.com/post/2009/03/04/How-not-to-inject-services-in-entities


হ্যাঁ, সেই ব্লগটি হ'ল সঠিক বিষয়ে আমি আগ্রহী, ধন্যবাদ।
কোডুলিকে

12

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

সুতরাং (এমন কিছু লেখার ঝুঁকিতে যা এখন থেকে এক বছরের সাথে আমি একমত নই) এখানে এখন পর্যন্ত আমার আবিষ্কার রয়েছে।

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

// Entity
public class Invoice
{
    ...
    public void SetStatus(StatusCode statusCode, DateTime dateTime) { ... }
    public void CreateCreditNote(decimal amount) { ... }
    ...
}

সত্তার নির্মাতার কোনও পরিষেবা ইনজেকশন না দিয়ে আমরা এটি অর্জন করতে চাই, কারণ:

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

তাহলে, আমরা কীভাবে এটি করতে পারি? আমার উপসংহার এ পর্যন্ত যে পদ্ধতি নির্ভরতা এবং ডাবল প্রেরণ একটি শালীন সমাধান সরবরাহ করে।

public class Invoice
{
    ...

    // Simple method injection
    public void SetStatus(IInvoiceLogger logger, StatusCode statusCode, DateTime dateTime)
    { ... }

    // Double dispatch
    public void CreateCreditNote(ICreditNoteService creditNoteService, decimal amount)
    {
        creditNoteService.CreateCreditNote(this, amount);
    }

    ...
}

CreateCreditNote()এখন এমন একটি পরিষেবা প্রয়োজন যা ক্রেডিট নোট তৈরি করার জন্য দায়বদ্ধ। সত্তা থেকে আবিষ্কারযোগ্যতা বজায় রাখার সময় এটি দ্বিগুণ প্রেরণ ব্যবহার করে দায়বদ্ধ পরিষেবায় কাজটিকে পুরোপুরি অফলোড করেInvoice

SetStatus()এখন একটি আছে সহজ নির্ভরতা একটি এটির, যা স্পষ্টত সঞ্চালন হবে অংশ কাজের

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

আমাদের অভিপ্রায়টি প্রকাশের আশায় আমরা এখনও প্যারামিটারটির নাম 'লগার' রাখতে পারি। যদিও কিছুটা দুর্বল মনে হচ্ছে।

পরিবর্তে, আমি একটি জিজ্ঞাসা করতে বেছে নেব IInvoiceLogger(যেমন আমরা ইতিমধ্যে কোড নমুনায় করি) এবং IInvoiceServiceসেই ইন্টারফেসটি প্রয়োগ করেছি। ক্লায়েন্ট কোডটি এমন IInvoiceServiceসমস্ত Invoiceপদ্ধতির জন্য কেবল তার এককটি ব্যবহার করতে পারে যা এই জাতীয় কোনও নির্দিষ্ট, চালান-অন্তর্নিহিত 'মিনি সার্ভিস' চাইবে, যখন পদ্ধতিটির স্বাক্ষরগুলি তারা কী জিজ্ঞাসা করছে তা স্পষ্ট করে দেয়।

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

public class Invoice
{
    public IEnumerable<CreditNote> GetCreditNotes(ICreditNoteRepository repository)
    { ... }
}

প্রকৃতপক্ষে, এটি চিরকালীন ঝামেলার অলস বোঝার একটি বিকল্প সরবরাহ করে ।

আপডেট: আমি নীচের পাঠ্যটি historicalতিহাসিক উদ্দেশ্যে রেখেছি, তবে আমি অলস লোডগুলি 100% স্টিয়ারিং সাফ করার পরামর্শ দিচ্ছি।

সত্য, সম্পত্তি-ভিত্তিক অলস লোড জন্য, আমি না বর্তমানে কন্সট্রাকটর ইনজেকশন ব্যবহার করেন, কিন্তু একটি অধ্যবসায়-অজ্ঞ উপায়।

public class Invoice
{
    // Lazy could use an interface (for contravariance if nothing else), but I digress
    public Lazy<IEnumerable<CreditNote>> CreditNotes { get; }

    // Give me something that will provide my credit notes
    public Invoice(Func<Invoice, IEnumerable<CreditNote>> lazyCreditNotes)
    {
        this.CreditNotes = new Lazy<IEnumerable<CreditNotes>>() => lazyCreditNotes(this));
    }
}

একদিকে, একটি সংগ্রহশালা যা Invoiceডাটাবেস থেকে লোড করে তাতে কোনও ফাংশনে অ্যাক্সেস থাকতে পারে যা সংশ্লিষ্ট ক্রেডিট নোটগুলি লোড করতে পারে এবং সেই ফাংশনটি ইন-তে ইনজেক্ট করে Invoice

অন্যদিকে, কোড যা একটি আসল নতুন তৈরি করে Invoiceতা কেবল একটি ফাংশন পাস করবে যা একটি খালি তালিকা দেয়:

new Invoice(inv => new List<CreditNote>() as IEnumerable<CreditNote>)

(একটি রীতি ILazy<out T>আমাদের কুৎসিত অভিনেত্রী থেকে মুক্তি দিতে পারে IEnumerable, তবে এটি আলোচনাকে জটিল করে দেবে))

// Or just an empty IEnumerable
new Invoice(inv => IEnumerable.Empty<CreditNote>())

আমি আপনার মতামত, পছন্দ এবং উন্নতি শুনে খুশি!


3

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

যে কারণগুলি সম্পর্কে আমি ভাবতে পারি সেগুলি হ'ল:

  • উদ্বেগের পৃথকীকরণ (সত্তাগুলি যেভাবে বজায় রয়েছে সেভাবে তাদের পৃথক করা উচিত as কারণ একাধিক কৌশল থাকতে পারে যাতে ব্যবহারের দৃশ্যের উপর নির্ভর করে একই সত্তাটি বহাল থাকবে)
  • যৌক্তিকভাবে, সত্ত্বাগুলি স্তরের নীচের স্তরে দেখা যেতে পারে যেখানে ভাণ্ডারগুলি কাজ করে। নিম্ন স্তরের উপাদানগুলির উচ্চ স্তরের উপাদানগুলির জ্ঞান থাকা উচিত নয়। অতএব এন্ট্রিগুলিতে স্টোরগুলিতে জ্ঞান থাকা উচিত নয়।

2

কেবল ভার্নন ভন একটি সমাধান দেয়:

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


কিন্তু কোনও সত্তা থেকে নয়।
স্মিথ

ভারনন ভন IDDD উৎস থেকে: পাবলিক ক্লাস ক্যালেন্ডার প্রসারিত EventSourcedRootEntity {... পাবলিক CalendarEntry scheduleCalendarEntry (CalendarIdentityService aCalendarIdentityService,
Teimuraz

তার কাগজ @ টিমুরাজটি দেখুন
আলিরেজা রহমানি খলিলি

1

এই সমস্ত পৃথক স্তর বাজ আসার আগে আমি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কোড করতে শিখেছি এবং আমার প্রথম অবজেক্ট / ক্লাসগুলি সরাসরি ডাটাবেসে ম্যাপ করে।

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

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

অনেক বিকাশকারীর মতো আমি বর্তমানে 3 স্তর (জিইউআই, লজিক, ডেটা অ্যাক্সেস) ব্যবহার করি কারণ এটি একটি ভাল কৌশল।

তথ্যটিকে একটি Repositoryস্তরে (ওরফে Data Accessস্তর) পৃথক করা, অনুসরণ করতে কোনও নিয়ম নয়, একটি ভাল প্রোগ্রামিং প্রযুক্তির মতো দেখা যেতে পারে।

অনেক পদ্ধতির মত, আপনি প্রয়োগ করতে না পেরে শুরু করতে এবং শেষ পর্যন্ত, আপনার প্রোগ্রামটি একবার বুঝতে পারলে, আপডেট করতে পারেন।

উদ্ধৃতি: ইলিয়াড সম্পূর্ণভাবে হোমারের দ্বারা উদ্ভাবিত হয়নি, কারমিনা বুরানা সম্পূর্ণরূপে কার্ল অরফ দ্বারা আবিষ্কার করেননি, এবং উভয় ক্ষেত্রেই, যে ব্যক্তি অন্যকে কাজ দেয়, সমস্ত টগিটার, তার কৃতিত্ব পেয়েছিল ;-)


1
ধন্যবাদ, তবে আমি ব্যবসায়ের যুক্তি থেকে ডেটা অ্যাক্সেস পৃথক করার বিষয়ে জিজ্ঞাসা করছি না - এটি একটি খুব স্পষ্ট বিষয় যা সম্পর্কে খুব বিস্তৃত চুক্তি রয়েছে। আমি কেন ডিডিডি আর্কিটেকচারে যেমন এস # আরপ হিসাবে জিজ্ঞাসা করছি, সত্তাগুলি ডেটা অ্যাক্সেস স্তরটিতে এমনকি 'কথা বলার' অনুমতি নেই। এটির একটি আকর্ষণীয় বিন্যাস যা আমি খুব বেশি আলোচনা করতে পেরেছি।
কোডুলিকে

0

এটি কি এরিক ইভান্স ডোমেন চালিত ডিজাইনের বই থেকে এসেছে বা এটি অন্য কোথাও থেকে এসেছে?

এটি পুরানো জিনিস। এরিকস বইটি এটিকে আরও কিছুটা গুঞ্জন দিয়েছে।

এর পিছনে যুক্তির জন্য কিছু ভাল ব্যাখ্যা কোথায় আছে?

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

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

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

সম্পাদনা করুন: স্পষ্ট করার জন্য: আমি ব্যবসার যুক্তি থেকে ডেটা অ্যাক্সেসকে আলাদা স্তরে আলাদা করার ক্লাসিক ওও অনুশীলনের কথা বলছি না - আমি সুনির্দিষ্ট ব্যবস্থা সম্পর্কে বলছি যার মাধ্যমে ডিডিডি-তে, সংস্থাগুলি ডেটাতে কথা বলার কথা নয় অ্যাক্সেস লেয়ারটি একেবারেই (যেমন তারা রিপোজিটরি অবজেক্টের রেফারেন্স রাখার কথা নয়)

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


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

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

0

ক্যারোলিনা লিলিয়েনটাহলের উদ্ধৃতি দেওয়ার জন্য, "প্যাটার্নগুলির চক্র রোধ করা উচিত" https://www.youtube.com/watch?v=eJjadzMRQAk , যেখানে সে ক্লাসগুলির মধ্যে চক্র নির্ভরতা বোঝায়। সংস্থাগুলির অভ্যন্তরে সংগ্রহস্থলের ক্ষেত্রে অবজেক্ট নেভিগেশনের একমাত্র কারণ হিসাবে চক্রীয় নির্ভরতা তৈরি করার প্রলোভন রয়েছে। উপরে অগ্রগতিবিদ দ্বারা উল্লিখিত প্যাটার্নটি ভার্নন ভন দ্বারা সুপারিশ করা হয়েছিল, যেখানে অন্যান্য সংস্থাগুলি মূল উদাহরণগুলির পরিবর্তে আইডির সাহায্যে উল্লেখ করা হয়, (এই প্যাটার্নটির কোনও নাম আছে?) এমন একটি বিকল্প প্রস্তাব দেয় যা অন্যান্য সমাধানগুলিতে যেতে পারে।

ক্লাসের মধ্যে চক্রীয় নির্ভরতার উদাহরণ (স্বীকৃতি):

(সময়0): দুটি শ্রেণি, নমুনা এবং ওয়েল, একে অপরকে নির্দেশ করে (চক্র নির্ভরতা)। ওয়েল নমুনা বোঝায়, এবং নমুনা ফিরে ওয়েল, সুবিধার বাইরে বোঝায় (কখনও কখনও নমুনাগুলি লুপিং, কখনও কখনও একটি প্লেটের সমস্ত কূপ লুপিং)। নমুনাগুলি যেখানে ওয়েল স্থাপন করেছে সেখানে পুনরায় উল্লেখ না করে এমন ঘটনাগুলি আমি কল্পনাও করতে পারি না।

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

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


-1

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


না, এটি সত্তাগুলির সাথে অপ্রয়োজনীয় মিলন পরিচয় করিয়ে দেয়, এসআরপি লঙ্ঘন করে এবং উদ্বেগগুলি পৃথক করে তোলে এবং অস্তিত্বকে অবিচল থেকে ডিসরিয়ালাইজেশন করা কঠিন করে তোলে (যেহেতু deserialization প্রক্রিয়াটি এখন সত্তা ঘন ঘন সেবা / সংগ্রহস্থলগুলিও ইনজেক্ট করতে হবে)।
স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.