ডিডিডিতে ব্যতিক্রম


11

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

public function doIt(UserData $userData)
{
    $user = $this->userRepository->byEmail($userData->email());
    if ($user) {
        throw new UserAlreadyExistsException();
    }

    $this->userRepository->add(
        new User(
            $userData->email(),
            $userData->password()
        )
    );
}

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

এটির জন্য কীভাবে সেরা উপায়?


1
ডোমেন পরিষেবা (হ্যান্ডলার) ছোঁড়া ব্যতিক্রম ঠিক আছে।
অ্যান্ডি

উত্তর:


20

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

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

এখন আপনার সুনির্দিষ্ট প্রশ্নে: ফেলে Service/ CommandHandlerফেলে দেওয়ার Exceptionবিষয়টি হ'ল আপনার ব্যবসায়িক যুক্তিটি আপনার ডোমেনের বাইরে ("উপরের দিকে") ফাঁস হতে শুরু করেছে। আপনার Service/ CommandHandlerইমেলটি কেন অনন্য হতে হবে তা জানতে হবে? অ্যাপ্লিকেশন পরিষেবা স্তরটি সাধারণত প্রয়োগের পরিবর্তে সমন্বয়ের জন্য ব্যবহৃত হয়। যদি আমরা ChangeEmailআপনার সিস্টেমে কোনও পদ্ধতি / কমান্ড যুক্ত করি তবে এর কারণটি চিত্রিত করা যেতে পারে । এখন দুটি পদ্ধতি / কমান্ড হ্যান্ডলারদের আপনার অনন্য চেক অন্তর্ভুক্ত করতে হবে। এখানেই কোনও বিকাশকারীকে "এক্সট্রাক্ট" করার জন্য প্রলুব্ধ করা যেতে পারে EmailMustBeUniqueRule। উপরে বর্ণিত হিসাবে, আমরা সেই পথে যেতে চাই না।

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

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


আমি জিজ্ঞাসা করতে পারি আপনি কি বলতে চাইছেন Moving rules "upwards" is generally a sign of an anemic model? উপরের মানে অ্যাপ্লিকেশন স্তরটির? না ডোমেইন মডেল?
কোনও নাম ডোনটকেয়ার

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

2
ডোমেন লজিককে রিপোজিটরিতে সরানো ভুল। আপনার ডোমেন স্তরে সামগ্রিক মূল দ্বারা ডোমেন বিধি প্রয়োগ করা উচিত।
আরশ

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

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

0

আপনি আপনার অ্যাপ্লিকেশনের প্রতিটি স্তরে বৈধতা চাপিয়ে দিতে পারেন। আপনার প্রয়োগের উপর নির্ভর করে কোন বিধি চাপিয়ে দেওয়া যায়।

উদাহরণস্বরূপ, সত্তাগুলি এমন পদ্ধতিগুলি প্রয়োগ করে যা ব্যবসায়ের নিয়মকে প্রতিনিধিত্ব করে যখন ব্যবহারের ক্ষেত্রে আপনার অ্যাপ্লিকেশন সম্পর্কিত নির্দিষ্ট বিধি প্রয়োগ করে।

আপনার জিমেইলের মতো কোনও ইমেল পরিষেবাটি যদি যুক্তি করতে পারে যে "ব্যবহারকারীদের একটি অনন্য ই-মাইলড্রেস থাকা উচিত" নিয়মটি একটি ব্যবসার নিয়ম।

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

প্রশাসনিক সুরক্ষার জন্য, আপনি এই নিয়মটি আপনার ভাণ্ডারেও প্রয়োগ করতে পারেন।

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