কীভাবে একটি সিকিউআরএস কমান্ডটি বৈধ হয়ে একটি ডোমেন অবজেক্টে রূপান্তরিত করা উচিত?


22

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

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

আমি যা বুঝি সেগুলি থেকে, একটি আদেশ হ'ল উদ্দেশ্য যোগাযোগ করার একটি মাধ্যম এবং নিজের দ্বারা কোনও ডোমেনের সাথে তার সম্পর্ক নেই। এগুলি মূলত ডেটা (বোবা - যদি আপনি চান) স্থানান্তর বস্তু objects এটি হ'ল কমান্ডগুলি বিভিন্ন প্রযুক্তির মধ্যে সহজেই স্থানান্তরযোগ্য। সফলভাবে সম্পন্ন ইভেন্টগুলির প্রতিক্রিয়া হিসাবে একই ইভেন্টগুলিতে প্রযোজ্য।

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

সুতরাং আসল প্রশ্নটি: যুক্তিটি ঠিক কোথায়?

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

ধরা যাক সামগ্রিকভাবে Carদুটি উপাদান ব্যবহার করা হয়েছে:

  • Transmission,
  • Engine

উভয় Transmissionএবং Engineমান বস্তু সুপার টাইপ হিসাবে উপস্থাপিত হয় এবং যথাক্রমে উপ প্রকার, Automaticএবং Manualসংক্রমণ, বা Petrolএবং Electricইঞ্জিন রয়েছে।

এই ডোমেনে, নিজেরাই বেঁচে থাকা একটি সফলভাবে তৈরি করা হোক Transmission, সে হোক Automaticবা Manual, অথবা যে কোনও একটি Engineসম্পূর্ণরূপে ভাল। তবে Carসমষ্টিগত কয়েকটি নতুন নিয়ম প্রবর্তন করে, কেবল তখনই প্রযোজ্য যখন Transmissionএবং Engineবস্তুগুলি একই প্রসঙ্গে ব্যবহৃত হবে। যথা:

  • যখন কোনও গাড়ি Electricইঞ্জিন ব্যবহার করে তবে কেবলমাত্র অনুমোদিত ট্রান্সমিশন টাইপ Automatic
  • যখন কোনও গাড়ি Petrolইঞ্জিন ব্যবহার করে তখন এটির মধ্যে উভয় প্রকারের থাকতে পারে Transmission

কমান্ড তৈরির স্তরে আমি এই উপাদান সংমিশ্রণ লঙ্ঘনটি ধরতে পারি, তবে আমি আগেই বলেছি যে, আমি যা বুঝতে পারি তা করা উচিত নয় কারণ কমান্ডটিতে তখন ব্যবসায়িক যুক্তি থাকতে পারে যা ডোমেন স্তরকে সীমাবদ্ধ করা উচিত।

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

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

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


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

কমান্ডটিতে এমন Idএকটি ব্যবহারকারী রয়েছে যা তৈরি করা হবে এবং তাদের Email

সিস্টেমটি ব্যবহারকারীর ইমেল ঠিকানার জন্য নিম্নলিখিত বিধিগুলি জানিয়েছে:

  • অবশ্যই অনন্য হবে,
  • খালি থাকতে হবে না,
  • সর্বাধিক 100 টি অক্ষর থাকতে হবে (একটি ডিবি কলামের সর্বাধিক দৈর্ঘ্য)।

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

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

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

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


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


আমি মনে করি কিছু উদাহরণ কোড প্রয়োজন। আপনার কমান্ডের অবজেক্টগুলি দেখতে কেমন এবং আপনি সেগুলি কোথায় তৈরি করেন?
ইভান

@ ইভান আমি আজ বা কাল আগে কোড নমুনাগুলি যুক্ত করব। কয়েক মিনিটের মধ্যে বেড়াতে যাচ্ছেন।
অ্যান্ডি

পিএইচপি প্রোগ্রামার হওয়ায় আমি আমার সিকিউআরএস + ইএস প্রয়োগের দিকে একবার নজর দেওয়ার পরামর্শ দিই: github.com/xprt64/cqrs-es
কনস্ট্যান্টিন

@ কনস্ট্যান্টিনগালবেনুউ কি সিগ্রিআরএস সম্পর্কে গ্রেগ ইয়ংয়ের ব্যাখ্যাটি সঠিকভাবে বিবেচনা করা উচিত (যা আমাদের সম্ভবত হওয়া উচিত) তাহলে সিকিউআরএস সম্পর্কে আপনার বোঝা ভুল - বা কমপক্ষে আপনার পিএইচপি বাস্তবায়ন হয়। কমান্ডগুলি সরাসরি সমষ্টি দ্বারা পরিচালিত হয় না। কমান্ডগুলি কমান্ড হ্যান্ডলারদের দ্বারা পরিচালনা করা হয় যা সমষ্টিগুলিতে পরিবর্তন আনতে পারে যা পরে রাষ্ট্রের প্রতিরূপে ব্যবহারের জন্য ইভেন্টগুলি তৈরি করে।
অ্যান্ডি

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

উত্তর:


22

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

সুতরাং আসল প্রশ্নটি: যুক্তিটি ঠিক কোথায়?

একাধিক ধরণের (বৈধতা) যুক্তি রয়েছে। সাধারণ ধারণাটি যত তাড়াতাড়ি সম্ভব যুক্তি সম্পাদন করা - আপনি চাইলে দ্রুত ব্যর্থ হন। সুতরাং, পরিস্থিতি নিম্নরূপ:

  • কমান্ডের অবজেক্টের কাঠামো নিজেই; কমান্ডের কনস্ট্রাক্টরের কিছু প্রয়োজনীয় ক্ষেত্র রয়েছে যা অবশ্যই কমান্ড তৈরির জন্য উপস্থিত থাকতে হবে; এটি প্রথম এবং দ্রুত বৈধতা; এটি স্পষ্টতই কমান্ডের মধ্যে রয়েছে।
  • নিম্ন স্তরের ক্ষেত্র বৈধতা, যেমন কিছু ক্ষেত্রের শূন্যতা (যেমন ব্যবহারকারীর নাম) বা ফর্ম্যাট (একটি বৈধ ইমেল ঠিকানা)। এই ধরণের বৈধতা কমান্ডারের ভিতরেই, কনস্ট্রাক্টরে থাকা উচিত। একটি isValidপদ্ধতি থাকার অন্য স্টাইল রয়েছে তবে এটি আমার কাছে অর্থহীন বলে মনে হচ্ছে কারণ সত্যিকার অর্থে সফল কমান্ড ইনস্ট্যান্টেশন পর্যাপ্ত হওয়া উচিত এমন কাউকে এই পদ্ধতিটি কল করতে হবে।
  • পৃথক command validators, একটি কমান্ড যাচাই করার দায়িত্ব রয়েছে এমন ক্লাসগুলি। যখন আমাকে একাধিক সমষ্টি বা বাহ্যিক উত্স থেকে তথ্য পরীক্ষা করা প্রয়োজন তখন আমি এই জাতীয় বৈধতা ব্যবহার করি। আপনি এটি ব্যবহারকারীর স্বতন্ত্রতা পরীক্ষা করতে ব্যবহার করতে পারেন। Command validatorsসংগ্রহস্থলগুলির মতো কোনও নির্ভরতা ইনজেকশন থাকতে পারে। মনে রাখবেন যে এই বৈধতাটি শেষ পর্যন্ত সমষ্টিগুলির সাথে সামঞ্জস্যপূর্ণ (অর্থাত্ ব্যবহারকারী যখন তৈরি হবে, একই ব্যবহারকারীর সাথে অন্য ব্যবহারকারী তৈরি করা যেতে পারে)! এছাড়াও, এখানে যুক্তি যুক্ত করার চেষ্টা করবেন না যা সামগ্রীর ভিতরে থাকা উচিত! কমান্ড ভ্যালিডিটারগুলি সাগা / প্রক্রিয়া পরিচালকদের থেকে পৃথক যা ইভেন্টগুলির উপর ভিত্তি করে আদেশ উত্পন্ন করে।
  • সামগ্রিক পদ্ধতি যা আদেশগুলি গ্রহণ করে এবং প্রক্রিয়া করে। এটি সর্বশেষ (ধরণের) বৈধতা যা ঘটে। সমষ্টিগতভাবে আদেশটি থেকে ডেটা বের করে এবং এটি গ্রহণ করে এমন কিছু মূল ব্যবসায়িক যুক্তি ব্যবহার করে (এটি তার রাজ্যে পরিবর্তন সম্পাদন করে) বা এটি প্রত্যাখ্যান করে। এই যুক্তি একটি শক্তিশালী ধারাবাহিক ভাবে পরীক্ষা করা হয়। এটি প্রতিরক্ষা শেষ লাইন। আপনার উদাহরণে, নিয়মটি When a car uses Electric engine the only allowed transmission type is Automaticএখানে চেক করা উচিত।

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

উপরের কৌশলগুলি ব্যবহার করে কেউই অবৈধ কমান্ড তৈরি করতে বা সমষ্টিগুলির মধ্যে যুক্তিকে বাইপাস করতে পারে না । কমান্ড ভ্যালিডিটারগুলি স্বয়ংক্রিয়ভাবে লোড হয়ে থাকে + CommandDispatcherযাতে কল করে কেউ সরাসরি কোনও গোষ্ঠীতে কোনও আদেশ পাঠাতে পারে না। সামগ্রিকভাবে কমান্ডটি পাস করার ক্ষেত্রে কেউ একটি পদ্ধতিতে কল করতে পারে তবে পরিবর্তনগুলি অবিরাম রাখতে পারে না তাই এটি করা অর্থহীন / নিরীহ হবে।

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

আমিও একজন পিএইচপি প্রোগ্রামার এবং আমি আমার কমান্ড হ্যান্ডলারের (ফর্মের সামগ্রিক পদ্ধতি handleSomeCommand) থেকে কোনও কিছুই ফিরিয়ে দিই না । তবে আমি প্রায়শই ক্লায়েন্ট / ব্রাউজারে তথ্যগুলি ক্লায়েন্ট / ব্রাউজারে ফিরিয়ে দিই, HTTP responseউদাহরণস্বরূপ সদ্য তৈরি হওয়া সামগ্রিক মূলের আইডি বা কোনও পঠন-মডেল থেকে কিছু না কিন্তু আমি আমার সামগ্রিক কমান্ড পদ্ধতিগুলি থেকে কখনই কিছুই ফিরে আসি না (সত্যিই কখনই না )। কমান্ডটি গ্রহণ করা হয়েছে (এবং প্রক্রিয়াজাতকরণ - আমরা সিঙ্ক্রোনাস পিএইচপি প্রক্রিয়াজাতকরণের কথা বলছি, তাই না?) সরল সত্যটি যথেষ্ট।

আমরা ব্রাউজারে কিছু ফিরিয়ে দিই (এবং এখনও বইটি দিয়ে সিকিউআরএস করছি ) কারণ সিকিউআরএস কোনও উচ্চ স্তরের আর্কিটেকচার নয়

কমান্ড ভ্যালিডিটাররা কীভাবে কাজ করে তার একটি উদাহরণ:

সমষ্টিতে যাওয়ার পথে কমান্ড যাচাইকারীদের মাধ্যমে কমান্ডের পথ


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

@ কিং-সাইড-স্লাইডটি যদি আপনার কোনও EmailAddressমান অবজেক্ট থাকে যা নিজেই বৈধ হয়ে যায়।
কনস্টান্টিন গালবেনু

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

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

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

6

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

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

ChangeEmailকমান্ড অন্তর্ভুক্ত করার জন্য কেবল আপনার উদাহরণকে প্রসারিত করে , আমরা পুরোপুরি চিত্রিত করতে পারি যে আপনি আপনার আদেশের অবকাঠামোতে কেন আপনার ব্যবসায়িক যুক্তি চান না কারণ আপনার বিধিগুলির নকল করতে হবে:

  • ইমেল খালি থাকতে পারে না
  • ইমেল 100 টি অক্ষরের বেশি হতে পারে না
  • ইমেল অবশ্যই অনন্য হতে হবে

সুতরাং এখন আমরা নিশ্চিত হতে পারি যে আমাদের যুক্তিটি আমাদের ডোমেইনে থাকা দরকার, আসুন "কোথায়" ইস্যুটি মোকাবেলা করুন। প্রথম দুটি নিয়ম আমাদের Userসামগ্রীতে সহজেই প্রয়োগ করা যেতে পারে , তবে সেই শেষ নিয়মটি আরও কিছুটা উপদ্রবযুক্ত; আরও গভীর জ্ঞান অর্জনের জন্য ক্র্যাঞ্চিংয়ের জন্য আরও কিছু জ্ঞানের প্রয়োজন। পৃষ্ঠতলে, এটি দেখে মনে হতে পারে যে এই নিয়মটি কোনও ক্ষেত্রে প্রযোজ্য User, তবে এটি সত্যিই তা হয় না। কোনও ইমেলের "স্বাতন্ত্র্য" কোনও সংকলনের ক্ষেত্রে প্রযোজ্য Users(কিছু স্কোপ অনুসারে)।

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

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


2
আমি এটার সাথে একমত. এখন অবধি আমার পড়া (সিকিউআরএস ব্যতীত) আমাকে বলেছে যে আক্রমণকারীদের সুরক্ষার জন্য সর্বদা ডোমেন মডেলটিতে বৈধতা থাকা উচিত। এখন আমি সিকিউআরএস পড়ছি এটি কমান্ড অবজেক্টগুলিতে বৈধতা স্থাপন করতে বলছে। এটি পাল্টা স্বজ্ঞাত বলে মনে হচ্ছে। আপনি কি গীটহাবের কোনও উদাহরণের কথা জানেন যেখানে কমান্ডের পরিবর্তে ডোমেন মডেলটিতে বৈধতা দেওয়া আছে? +1 টি।
w0051977
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.