"ব্যবসায়ের যুক্তি কোনও পরিষেবাতে হওয়া উচিত, কোনও মডেলে নয়" কতটা সঠিক?


396

পরিস্থিতি

আজ সন্ধ্যায় আমি স্ট্যাকওভারফ্লোতে একটি প্রশ্নের উত্তর দিয়েছিলাম ।

প্রশ্নটি:

কোনও বিদ্যমান অবজেক্টের সম্পাদনা সংগ্রহস্থল স্তরে বা পরিষেবাতে করা উচিত?

উদাহরণস্বরূপ যদি আমার কোনও haveণ আছে এমন কোনও ব্যবহারকারী থাকে। আমি তার debtণ পরিবর্তন করতে চাই। আমি কি এটি ইউজাররপোসিটরিতে বা পরিষেবাতে করব যেমন উদাহরণস্বরূপ কোনও জিনিস পেয়ে, এডিট করে এবং এটি সংরক্ষণ করে কেনা সার্ভিস?

আমার উত্তর:

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

উদাহরণ পরিস্থিতি:

class User {
    private int debt; // debt in cents
    private string name;

    // getters

    public void makePayment(int cents){
        debt -= cents;
    }
}

class UserRepository {
    public User GetUserByName(string name){
        // Get appropriate user from database
    }
}

আমি একটি মন্তব্য পেয়েছি:

ব্যবসায়িক যুক্তি সত্যই কোনও পরিষেবায় হওয়া উচিত। কোনও মডেল নয়।

ইন্টারনেট কী বলে?

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

উদাহরণস্বরূপ, এনেমিক ডোমেন মডেলটির অ্যান্টি-প্যাটার্ন সম্পর্কিত মার্টিন ফাউলারের এই নিবন্ধটি দেখুন :

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

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

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

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

অ্যাপ্লিকেশন স্তর [পরিষেবা স্তরটির জন্য তার নাম]: সফ্টওয়্যারটি যে কাজগুলি করার কথা বলেছিল তা সংজ্ঞায়িত করে এবং সংবেদনশীল ডোমেন অবজেক্টগুলিকে সমস্যা সমাধানের নির্দেশ দেয়। এই স্তরটি যে সমস্ত কাজের জন্য দায়বদ্ধ তা ব্যবসায়ের পক্ষে অর্থপূর্ণ বা অন্যান্য সিস্টেমের অ্যাপ্লিকেশন স্তরগুলির সাথে মিথস্ক্রিয়া করার জন্য প্রয়োজনীয়। এই স্তরটি পাতলা রাখা হয়। এতে ব্যবসায়িক বিধি বা জ্ঞান নেই, তবে কেবল কার্যগুলি সমন্বয় করে এবং পরবর্তী স্তরটিতে ডোমেন অবজেক্টের সহযোগিতায় কাজ ডেলিগেট করে। এটিতে ব্যবসায়ের পরিস্থিতি প্রতিফলিত করার মতো রাষ্ট্র নেই, তবে এটিতে এমন অবস্থা থাকতে পারে যা ব্যবহারকারী বা প্রোগ্রামের জন্য কোনও কাজের অগ্রগতি প্রতিফলিত করে।

যা এখানে আরও শক্তিশালী করা হয়েছে :

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

এবং এখানে :

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

সার্ভিস লেয়ার সম্পর্কে কথা বলে এমন অন্যান্য সংস্থানগুলির সাথে এটি মারাত্মক বৈপরীত্য :

পরিষেবা স্তরটিতে এমন একাধিক পদ্ধতি রয়েছে যা একই লেনদেনের সাথে জড়িত ক্রিয়াগুলির সাথে কাজের একক classes

বা আমি ইতিমধ্যে সংযুক্ত একটি প্রশ্নের দ্বিতীয় উত্তর :

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

"সমাধান"?

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

class UserController : Controller {
    private UserService _userService;

    public UserController(UserService userService){
        _userService = userService;
    } 

    public ActionResult MakeHimPay(string username, int amount) {
        _userService.MakeHimPay(username, amount);
        return RedirectToAction("ShowUserOverview");
    }

    public ActionResult ShowUserOverview() {
        return View();
    }
}

class UserService {
    private IUserRepository _userRepository;

    public UserService(IUserRepository userRepository) {
        _userRepository = userRepository;
    }

    public void MakeHimPay(username, amount) {
        _userRepository.GetUserByName(username).makePayment(amount);
    }
}

class UserRepository {
    public User GetUserByName(string name){
        // Get appropriate user from database
    }
}

class User {
    private int debt; // debt in cents
    private string name;

    // getters

    public void makePayment(int cents){
        debt -= cents;
    }
}

উপসংহার

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

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

  • এটি কি নিয়ামকের কাছ থেকে কেবল যুক্তি বের করে তার পরিবর্তে কোনও পরিষেবার ভিতরে রেখে দেওয়ার উপায়?

  • এটি কি নিয়ামক এবং ডোমেনের মধ্যে একটি চুক্তি গঠনের কথা?

  • ডোমেন এবং পরিষেবা স্তরের মধ্যে একটি স্তর থাকা উচিত?

এবং, শেষ কিন্তু অন্তত নয়: মূল মন্তব্য অনুসরণ করে

ব্যবসায়িক যুক্তি সত্যই কোনও পরিষেবায় হওয়া উচিত। কোনও মডেল নয়।

  • এটা কি সঠিক?

    • আমি কীভাবে মডেলটির পরিবর্তে কোনও পরিষেবাতে আমার ব্যবসায়ের যুক্তি যুক্ত করব?

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

আমি ভেবেছিলাম পরিষেবাগুলি মডেল স্তরের অংশ ছিল। আমি কি ভেবে ভুল করছি?
ফ্লোরিয়ান মার্জাইন

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

1
অ্যাপ্লিকেশন প্রবাহ নিয়ন্ত্রণ যুক্তি একটি নিয়ামকের অন্তর্ভুক্ত। ডেটা অ্যাক্সেস যুক্তি একটি ভাণ্ডার অন্তর্গত। বৈধতা যুক্তি একটি পরিষেবা স্তর অন্তর্ভুক্ত। একটি এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে একটি পরিষেবা স্তর হ'ল একটি অতিরিক্ত স্তর যা একটি নিয়ামক এবং সংগ্রহস্থল স্তরের মধ্যে যোগাযোগের মধ্যস্থতা করে। পরিষেবা স্তরটিতে ব্যবসায়িক বৈধতা যুক্তি রয়েছে। সংগ্রহস্থল। asp.net/mvc/overview/older-versions-1/models-data/…
কেবিডাভিস07

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

উত্তর:


367

কোনও পরিষেবার দায়িত্বগুলি কী তা নির্ধারণ করার জন্য আপনাকে প্রথমে একটি পরিষেবা কী তা নির্ধারণ করতে হবে।

পরিষেবাটি কোনও ক্যানোনিকাল বা জেনেরিক সফ্টওয়্যার শব্দ নয়। আসলে, Serviceক্লাসের নামের প্রত্যয়টি অনেকটা ম্যালেন্ডেড ম্যানেজারের মতো : এটি আপনাকে বস্তুটি আসলে কী করে সে সম্পর্কে প্রায় কিছুই বলে না

বাস্তবে, একটি পরিষেবা যা করণীয় তা হ'ল উচ্চ আর্কিটেকচার-নির্দিষ্ট:

  1. একটি traditionalতিহ্যবাহী স্তরযুক্ত আর্কিটেকচারে পরিষেবাটি আক্ষরিক অর্থে ব্যবসায়ের লজিক স্তরের সমার্থক । এটি ইউআই এবং ডেটার মধ্যে স্তর। অতএব, সমস্ত ব্যবসায়িক বিধি পরিষেবাগুলিতে যায়। ডেটা স্তরটি কেবলমাত্র বেসিক সিআরইউডি অপারেশনগুলি বোঝে এবং ইউআই স্তরটি কেবলমাত্র ব্যবসায়িক সামগ্রীতে এবং উপস্থাপনা ডিটিওগুলির ম্যাপিংয়ের সাথে কাজ করে।

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

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

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

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

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

  4. ডিডিডিতে পরিষেবাদিগুলি বিশেষত সেই পরিস্থিতির জন্য বোঝানো হয় যখন আপনার কোনও অপারেশন থাকে যা সঠিকভাবে কোনও সামগ্রিক মূলের সাথে সম্পর্কিত নয় । আপনাকে এখানে সতর্কতা অবলম্বন করতে হবে, কারণ প্রায়শই কোনও পরিষেবার প্রয়োজন বোঝাতে পারে যে আপনি সঠিক শিকড় ব্যবহার করেন নি। তবে ধরে নিলাম, আপনি একটি পরিষেবা একাধিক শিকড় জুড়ে অপারেশন সমন্বয় করতে বা কখনও কখনও ডোমেন মডেলকে জড়িত না এমন উদ্বেগ সামলানোর জন্য ব্যবহৃত হয় (যেমন, সম্ভবত, কোনও বিআই / ওএলএপি ডাটাবেসে তথ্য লেখার জন্য)।

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

    পরিষেবাগুলির স্তরযুক্ত-আর্কিটেকচার সংজ্ঞা থেকে এটি একটি মৌলিক প্রস্থান। একটি পরিষেবা স্তর ডোমেন অবজেক্টগুলিকে আবদ্ধ করে; একটি ডিডিডি পরিষেবা ডোমেন অবজেক্টে যা নেই তা এনক্যাপুলেট করে এবং তা বোঝায় না।

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

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

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

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

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

কোন সঠিক বা ভুল উত্তর নেই, কেবলমাত্র আপনার পরিস্থিতিতে প্রযোজ্য।


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

2
আমি এই সত্যের সাথে একমত নই যে একটি traditionalতিহ্যবাহী স্তরযুক্ত আর্কিটেকচারে, পরিষেবা ব্যবসায়ের যুক্তি স্তরটির প্রতিশব্দ।
কোডার্ট

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

1
তবে যদি আমরা ১০০+ লাইন নিয়ামক গ্রহণ করি (উদাহরণস্বরূপ যে নিয়ামক বার্তা গ্রহণ করে - তবে JSON অবজেক্টটি ডিসরিয়ালাইজ করুন, বৈধতা তৈরি করুন, ব্যবসায়িক বিধি প্রয়োগ করুন, ডিবিতে সংরক্ষণ করুন, ফলাফলের বস্তুটি ফেরান) এবং সেই পরিষেবা পদ্ধতির কোনওটিতে যুক্তি কিছুটা সরানো হয় না service t যা আমাদের আলাদাভাবে ইউনিটটির প্রতিটি অংশ বেদাহীনভাবে পরীক্ষা করতে সহায়তা করে?
আর্টজম

2
@ অ্যারোনট আমি কী একটি বিষয় স্পষ্ট করে বলতে চেয়েছিলাম যদি আমাদের কাছে ওআরএম এর মাধ্যমে ডিবি করার জন্য ডোমেন অবজেক্ট থাকে এবং তাদের মধ্যে কোনও ব্যবসায়িক যুক্তি না থাকে তবে এই রক্তাল্পিক ডোমেন মডেল বা না?
আর্টজম

40

আপনার শিরোনাম হিসাবে , আমি মনে করি না যে প্রশ্নটি বোঝায়। এমভিসি মডেল ডেটা এবং ব্যবসায়িক যুক্তি নিয়ে গঠিত। যুক্তিটি পরিষেবাতে হওয়া উচিত এবং মডেলটি নয় এমনটি বলার মতো, "গাড়ীতে যাত্রী সিটে বসতে হবে"।

তারপরে আবার "মডেল" শব্দটি একটি ওভারলোডেড শব্দ। সম্ভবত আপনি এমভিসি মডেল বোঝেন নি তবে আপনি ডেটা ট্রান্সফার অবজেক্ট (ডিটিও) অর্থে মডেলটিকে বোঝাতে চেয়েছিলেন। একেএ একটি সত্তা। মার্টিন ফোলার এই সম্পর্কেই কথা বলছেন।

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

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

এই বিচ্ছেদটির উপকারিতা হ'ল এটি দৃ the়তা স্তরটিকে বিমূর্ত করে তোলে। আপনি জেপিএ থেকে জেডিবিসিতে পরিবর্তন করতে পারেন (বা বিপরীতে) এবং ব্যবসায়ের যুক্তিগুলির কোনওটিরই পরিবর্তন করতে হবে না। এটি কেবল ডিটিওগুলির উপর নির্ভর করে, কীভাবে those ডিটিওগুলি জনবহুল হয় তার কোনও যত্ন নেই ।

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

" একটি পরিষেবা" হিসাবে, বব মার্টিন একটি ক্লাস নামকরণ বিরুদ্ধে হবে FooBarService। এটা উদ্দেশ্য ভিত্তিক নয়। একটি পরিষেবা কি করে? সম্পর্কিত কিছুFooBars । এটি পাশাপাশি লেবেলযুক্ত হতে পারে FooBarUtils। আমি মনে করি তিনি কোনও পরিষেবা স্তরের পক্ষে (আরও ভাল নামটি ব্যবসায় যুক্তিযুক্ত স্তর হবে) তবে সেই স্তরের প্রতিটি শ্রেণীর একটি অর্থপূর্ণ নাম থাকবে।


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

@ ড্যানিয়েল কাপলান আপনি কি জানেন যে বব মার্টিন ভিডিওর জন্য আপডেট হওয়া লিঙ্কটি কী?
ব্রায়ান মোরেয়ার্তি

25

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

এটিই আমরা নিয়ে এসেছি:

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

আমরা নিম্নলিখিত দিয়ে শেষ:

ক্লায়েন্ট -> পরিষেবা -> ডোমেন -> ডেটা

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

এই সব বলার পরে, আমি মনে করি এটি মার্টিন ফোলার বলতে যা বোঝাতে চেয়েছিল তার খুব কাছেই is

এই পরিষেবাগুলি ডোমেন মডেলের শীর্ষে থাকে এবং ডেটার জন্য ডোমেন মডেলটি ব্যবহার করে।

নীচের চিত্রটি এটি বেশ সুন্দরভাবে বর্ণনা করেছে:

http://martinfowler.com/eaaCatalog/serviceLayer.html

http://martinfowler.com/eaaCatalog/ServiceLayerSketch.gif


2
আপনি ঠিক গতকালই এসওএপি-র সিদ্ধান্ত নিয়েছেন? এটি কি একটি প্রয়োজনীয়তা বা আপনার আরও ভাল ধারণা নেই?
জেনসজি

1
REST আমাদের প্রয়োজনীয়তার জন্য এটি কাটবে না। সোপ বা রেস্ট করুন, উত্তরের সাথে কোনও পার্থক্য নেই। আমার বুঝতে থেকে, পরিষেবাটি ডোমেন লজিকের একটি প্রবেশদ্বার।
কোডার্ট

গেটওয়ের সাথে একেবারে একমত। এসওএপি (মানকৃত) ব্লাটওয়্যার, তাই আমাকে জিজ্ঞাসা করতে হয়েছিল। এবং হ্যাঁ, প্রশ্ন / উত্তরের উপর কোনও প্রভাব নেই।
জেনসজি

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

: যাদের স্লাইড সেবা লেয়ার এবং বেশ ঝরঝরে উপরে এই গ্রাফিক সংক্রান্ত ব্যাখ্যা আবরণ slideshare.net/ShwetaGhate2/...
মার্ক Juchli

9

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

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


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

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

8

প্রোগ্রামাররা কেন ডোমেন অবজেক্টগুলিতে ডোমেন লজিক স্থাপন থেকে বিরত থাকেন তা বোঝানোর সহজতম উপায় হ'ল তারা সাধারণত "আমি বৈধতা যুক্তি কোথায় রাখি?" উদাহরণস্বরূপ এই ডোমেন অবজেক্টটি নিন:

public class MyEntity
{
    private int someProperty = 0;

    public int SomeProperty
    {
        get { return this.someProperty; }
        set
        {
            if(value < 0) throw new ArgumentOutOfRangeException("value");
            this.someProperty = value;
        }
    }
}

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

এই কারণেই লোকেরা বৈধতা যুক্তিকে কোনও ধরণের পরিষেবা যেমন সরিয়ে দেয় MyEntityValidator। তারপরে সত্তা এবং কলিং যুক্তি উভয়ই বৈধতা পরিষেবাটির জন্য একটি রেফারেন্স পেতে এবং এটি পুনরায় ব্যবহার করতে পারে।

যদি আপনি এটি না করেন এবং আপনি এখনও বৈধতা যুক্তি পুনরায় ব্যবহার করতে চান তবে আপনি এটিকে সত্তা শ্রেণীর স্থির পদ্ধতিতে রেখেছেন:

public class MyEntity
{
    private int someProperty = 0;

    public int SomeProperty
    {
        get { return this.someProperty; }
        set
        {
            string message;
            if(!TryValidateSomeProperty(value, out message)) 
            {
                throw new ArgumentOutOfRangeException("value", message);
            }
            this.someProperty = value;
        }
    }

    public static bool TryValidateSomeProperty(int value, out string message)
    {
        if(value < 0)
        {
            message = "Some Property cannot be negative.";
            return false;
        }
        message = string.Empty;
        return true;
    }
}

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


1
তাহলে আপনার মতে বৈধতার জন্য সর্বোত্তম সমাধান কী?
ফ্ল্যাশরনার

3
@ ফ্ল্যাশরুনার - আমার বৈধতা যুক্তিটি ব্যবসায়িক লজিক স্তরে অবশ্যই রয়েছে তবে কিছু ক্ষেত্রে সত্তা এবং ডাটাবেস স্তরগুলিতেও এটি নকল করা আছে uplic ব্যবসায়ের স্তরটি ব্যবহারকারীকে ইত্যাদি অবহিত করে এটিকে সুন্দরভাবে পরিচালনা করে তবে অন্যান্য স্তরগুলি কেবল ত্রুটি / ব্যতিক্রমগুলি ফেলে দেয় এবং প্রোগ্রামারকে (নিজেকে) ভুল করে তোলে যা ডেটা দূষিত করে।
স্কট হুইটলক

6

আমি মনে করি আপনি মার্টিন ফোলারের অ্যানেমিক ডোমেন মডেল নিবন্ধটি পড়লে উত্তরটি পরিষ্কার হয়ে গেছে ।

ডোমেন মডেল থেকে ব্যবসায়ের যুক্তি, যা ডোমেনটিকে অপসারণ করা মূলত অবজেক্ট ওরিয়েন্টেড নকশাকে ভঙ্গ করে।

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

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


1
সম্পাদনা করা হয়েছে। আমি আসলে এটি বেশ সহায়ক ব্যাখ্যা খুঁজে পেয়েছি এবং মনে করি না যে এটি ডাউনভোটের প্রাপ্য।
BadHorsie

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

4

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

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


2

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

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

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

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

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

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


1

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

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

আপনি আদর্শভাবে যা করতে পারেন তা হ'ল মডেল পরিষেবাদি যা স্থিতিশীলতা অব্যাহত রাখতে ডোমেন মডেলগুলিতে কাজ করার ব্যবসায়ের যুক্তি অন্তর্ভুক্ত । আপনার যতটা সম্ভব সেবা ডিকুয়াল করার চেষ্টা করা উচিত।


0

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

মডেলটিতে অ্যাপ্লিকেশন ডেটা, ব্যবসায়ের নিয়ম, যুক্তি এবং কার্যাদি রয়েছে। http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller


0

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

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

class WebBroserController
{
    public function purchaseOrder()
    {
        $data = $_POST;

        $responseData =
            new PurchaseOrderApplicationService(
                new PayPalClient(),
                new OrderRepository()
            )
        ;

        $response = new HtmlView($responseData);
    }
}

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

class FunctionalTestController
{
    public function purchaseOrder()
    {
        $data = $_POST;

        $responseData =
            new PurchaseOrderApplicationService(
                new FakePayPalClient(),
                new OrderRepository(),
                $data
            )
        ;

        return new JsonData($responseData);
    }
}

সুতরাং অ্যাপ্লিকেশন পরিষেবাটি এমন একটি পরিবেশ যা আমি ব্যবসা-যুক্তি চালানোর জন্য সেট আপ করেছি। এটি যেখানে মডেল ক্লাসগুলি বলা হয় - একটি অবকাঠামোগত বাস্তবায়নের অজ্ঞায়িতভাবে।

সুতরাং, এই দৃষ্টিকোণ থেকে আপনার প্রশ্নের উত্তর:

এটি কি নিয়ামকের কাছ থেকে কেবল যুক্তি বের করে তার পরিবর্তে কোনও পরিষেবার ভিতরে রেখে দেওয়ার উপায়?

না।

এটি কি নিয়ামক এবং ডোমেনের মধ্যে একটি চুক্তি গঠনের কথা?

ভাল, কেউ এটি কল করতে পারেন।

ডোমেন এবং পরিষেবা স্তরের মধ্যে একটি স্তর থাকা উচিত?

নাঃ।


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


-2

রেকর্ড এর জন্য.

SRP:

  1. মডেল = ডেটা, এখানে সেটার এবং গিটারগুলি যায়।
  2. যুক্তি / পরিষেবাদি = এখানে সিদ্ধান্ত নেয়।
  3. সংগ্রহস্থল / ডিএও = এখানে আমরা স্থায়ীভাবে তথ্য সঞ্চয় করি বা পুনরুদ্ধার করি।

এই ক্ষেত্রে, পরবর্তী পদক্ষেপগুলি করা ঠিক আছে:

Theণটি যদি কিছু গণনার প্রয়োজন হয় না:

userObject.Debt = 9999;

তবে এর জন্য যদি কিছু গণনার প্রয়োজন হয় তবে:

userObject.Debt= UserService.CalculateDebt(userObject)

বা এছাড়াও

UserService.UpdateDebt(userObject)

তবে, যদি গণনাটি যদি অধ্যবসায় স্তরতে করা হয়, তবে স্টোর পদ্ধতিটি

UserRepository.UpdateDebt(userObject)

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

User userObject=UserRepository.GetUserByName(somename);
UserService.UpdateDebt(userObject)

এবং যদি এটির পরে এটি সঞ্চয় করতে হয় তবে আমরা একটি তৃতীয় পদক্ষেপ যুক্ত করতে পারি

User userObject=UserRepository.GetUserByName(somename);
UserService.UpdateDebt(userObject)
UserRepository.Save(userobject);

প্রস্তাবিত সমাধান সম্পর্কে

ক) আমাদের শেষ-বিকাশকারীকে কোনও ফাংশনটিতে এটি encapsulate না করে কয়েকটি লিখতে ভয় করতে হবে না।

খ) এবং ইন্টারফেস সম্পর্কে, কিছু বিকাশকারী ইন্টারফেস পছন্দ করে এবং তারা ঠিক আছে তবে বেশ কয়েকটি ক্ষেত্রে তাদের মোটেই প্রয়োজন হয় না।

গ) কোনও পরিষেবার লক্ষ্য হ'ল বৈশিষ্ট্য ব্যতীত একটি তৈরি করা, মূলত কারণ আমরা ভাগ / স্থির ফাংশন ব্যবহার করতে পারি। এটি ইউনিট পরীক্ষা করাও সহজ।


এই প্রশ্নের এই প্রশ্নের উত্তর কীভাবে পাওয়া যায়: "ব্যবসায়ের যুক্তি কোনও পরিষেবাতে হওয়া উচিত, কোনও মডেল নয়"?
gnat

3
"কী ধরণের বাক্য "We shouldn't be afraid to left the end-developer to write a couple of instead of encapsulate it in a function.?" আমি কেবল লুইস ব্ল্যাককে উদ্ধৃত করতে পারি "যদি এটি আমার ঘোড়ার না হত তবে আমি সেই বছর কলেজে কাটাতে পারতাম না।"
মালাচি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.