সমষ্টিগত রুটে কখন অন্য আর এ থাকা উচিত (এবং কখন তা হওয়া উচিত নয়)


15

আমাকে পোস্টটির দৈর্ঘ্যের জন্য প্রথমে ক্ষমা চেয়ে শুরু করা যাক, তবে আমি সত্যিই যতটা বিশদ আপ-ফ্রন্টটি জানাতে চাইছিলাম তাই মন্তব্যে আপনার সময়টি পিছনে পিছনে না নিয়ে আমি নিই।

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

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

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

http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout

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

সার্ভারে, আমার কাছে একটি অ্যাপ্লিকেশন পরিষেবা রয়েছে যা এপিআই সরবরাহ করে। ক্লকআইন পদ্ধতির জন্য আমার প্রাথমিক ধারণাটি হ'ল:

public void ClockIn(String id)
{
    var employee = EmployeeRepository.FindById(id);

    if (employee == null) throw SomeException();

    employee.ClockIn();

    EmployeeRepository.Save();
}

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

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

অন্যদিকে (এবং এখানে পোস্টের চূড়ান্ত প্রশ্নটি রয়েছে), টাইমশিটটি মনে হয় এটি একটি সমষ্টিগত রুট এবং পাশাপাশি এটির পরিচয় (কর্মচারী আইডি এবং সময়কাল) রয়েছে এবং আমি টাইমশিট.ক্লকআইনের মতো একই যুক্তিটি সহজেই প্রয়োগ করতে পারি could (কর্মচারী আইডি).

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


আমি পোস্টটি সম্পাদনা / আপডেট করেছি যাতে প্রশ্নটি পরিষ্কার হয় এবং আরও ভাল পরিস্থিতি ব্যবহার করে (আশা করি)।
SonOfPirate

উত্তর:


4

আমি সময় ট্র্যাকিংয়ের জন্য একটি পরিষেবা বাস্তবায়নের দিকে ঝুঁকতে চাই:

public interface ITimeSheetTrackingService
{
   void TrackClockIn(Employee employee, Timesheet timesheet);

   void TrackClockOut(Employee employee, Timesheet timesheet);

}

আমি মনে করি না যে ঘড়িঘড়ি করা বা ঘড়ি আউট করা টাইমশিটের দায়িত্ব, তাও নয় এটি কর্মচারীরই দায়িত্ব।


3

সমষ্টিগত শিকড়গুলিতে একে অপরকে থাকা উচিত নয় (যদিও এগুলিতে অন্যের আইডি থাকতে পারে)।

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

Root Entities have global identity.  Entities inside the boundary have local 
identity, unique only within the Aggregate.

আপনি কর্মচারী আইডি এবং সময়কাল হিসাবে টাইমশিটের পরিচয়টি সংজ্ঞায়িত করেন, যা পরামর্শ দেয় যে সময়পত্রকটি স্থানীয় পরিচয় হিসাবে সময়ের সাথে কর্মচারীর একটি অংশ of যেহেতু এটি একটি টাইম ক্লক অ্যাপ্লিকেশন, তাই কর্মচারীর মূল উদ্দেশ্য কি টাইমশিটের জন্য ধারক হওয়া?

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

public void ClockIn(String employeeId)
{
    var timeSheet = TimeSheetRepository.FindByEmployeeAndTime(employeeId, DateTime.Now);    
    timeSheet.ClockIn();    
    TimeSheetRepository.Save();
}

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


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

3

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

একটি সামগ্রিক রুটে আর কোনও সমষ্টিগত রুট থাকা উচিত নয়।

আপনার বিবরণে, আপনার একটি কর্মচারী সত্তা এবং একইভাবে একটি টাইমশিট সত্তা রয়েছে। এই দুটি সত্তা স্বতন্ত্র, তবে একে অপরের উল্লেখ অন্তর্ভুক্ত করতে পারে (উদা: এটি বব'র টাইমশিট)।

এটি অনেকটাই বেসিক মডেলিং।

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

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

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

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

পরিচয়ের অর্থ কেবল এটি একটি সত্তা - এটি এমন ব্যবসায়িক আগ্রাসন যা এটি পৃথক সামগ্রিক মূল হিসাবে বিবেচনা করা উচিত কিনা তা চালিত করে।

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

হতে পারে - সামগ্রিক উচিত। এর অর্থ অগত্যা টাইমসীটের হওয়া উচিত নয়।

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

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

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

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

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