কেন ডেটা অ্যাক্সেস আলাদা?
বইটি থেকে, আমি মনে করি মডেল ড্রাইভড ডিজাইনের অধ্যায়টির প্রথম দুটি পৃষ্ঠাগুলি আপনি কেন ডোমেন মডেলটি বাস্তবায়ন থেকে প্রযুক্তিগত বাস্তবায়নের বিশদটি বাতিল করতে চান তার কিছুটা ন্যায়সঙ্গততা দেয়।
- আপনি ডোমেন মডেল এবং কোডের মধ্যে একটি শক্ত সংযোগ রাখতে চান
- প্রযুক্তিগত উদ্বেগগুলি পৃথক করা মডেলটিকে বাস্তবায়নের জন্য কার্যকর প্রমাণ করতে সহায়তা করে
- আপনি সর্বব্যাপী ভাষাটি সিস্টেমের ডিজাইনের মাধ্যমে প্রসারিত করতে চান
সিস্টেমের আসল বাস্তবায়ন থেকে তালাকপ্রাপ্ত হয়ে পৃথক "বিশ্লেষণ মডেল" এড়ানোর উদ্দেশ্যেই এটি সমস্ত কিছু মনে হয়।
আমি বইটি যা বুঝতে পারি তা থেকে এটি বলে যে এই "বিশ্লেষণ মডেল" সফ্টওয়্যার বাস্তবায়ন বিবেচনা না করে ডিজাইন করা শেষ হতে পারে। একবার বিকাশকারীরা ব্যবসায়ের দিক দিয়ে বোঝা মডেলটি প্রয়োগ করার চেষ্টা করার পরে তারা প্রয়োজনীয়তার কারণে তাদের নিজস্ব বিমূর্ততা তৈরি করে, যোগাযোগ ও বোঝার প্রাচীর তৈরি করে।
অন্যদিকে, বিকাশকারীরা ডোমেন মডেলটিতে অনেকগুলি প্রযুক্তিগত উদ্বেগ প্রবর্তনকারীরাও এই বিভাজন ঘটায়।
সুতরাং আপনি বিবেচনা করতে পারেন যে অধ্যবসায়ের মতো উদ্বেগের পৃথকীকরণ অনুশীলন করা এই বিশ্লেষণের মডেলগুলি ডাইভারিংয়ের বিরুদ্ধে এই নকশাগুলির বিরুদ্ধে সুরক্ষায় সহায়তা করতে পারে। যদি মডেলটিতে দৃ 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 এক আকারের মতো নমনীয়তা হারাতে না পারায় উদ্বেগের আরও ভাল বিভাজন রয়েছে যা সমস্ত অলস লোডিং পদ্ধতির সাথে খাপ খায়।