এসআরপি অনুসরণ করার সময়, কীভাবে সত্তাগুলি বৈধকরণ এবং সংরক্ষণের সাথে আমার আচরণ করা উচিত?


10

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

ধরা যাক আমি এএসপি.নেট এমভিসি 3 ব্যবহার করে একটি ওয়েব অ্যাপ্লিকেশন তৈরি করছি Let's বলুন যে আমার কাছে এর মতো UsersControllerএকটি Createক্রিয়া রয়েছে:

public class UsersController : Controller
{
    public ActionResult Create(CreateUserViewModel viewModel)
    {

    }
}

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

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

public class UsersController : Controller
{
    private ICreateUserValidator validator;
    private IUserService service;

    public UsersController(ICreateUserValidator validator, IUserService service)
    {
        this.validator = validator;
        this.service= service;
    }

    public ActionResult Create(CreateUserViewModel viewModel)
    {
        ValidationResult result = validator.IsValid(viewModel);

        if (result.IsValid)
        {
            service.CreateUser(viewModel);
            return RedirectToAction("Index");
        }
        else
        {
            foreach (var errorMessage in result.ErrorMessages)
            {
                ModelState.AddModelError(String.Empty, errorMessage);
            }
            return View(viewModel);
        }
    }
}

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

অন্য বিকল্পটি হ'ল IUserServiceবৈধতাটির যত্ন নেওয়ার জন্য এটি করা:

public class UserService : IUserService
{
    private ICreateUserValidator validator;

    public UserService(ICreateUserValidator validator)
    {
        this.validator = validator;
    }

    public ValidationResult CreateUser(CreateUserViewModel viewModel)
    {
        var result = validator.IsValid(viewModel);

        if (result.IsValid)
        {
            // Save the user
        }

        return result;
    }
}

তবে আমি অনুভব করছি যে আমি এখানে একক দায়িত্বের নীতি লঙ্ঘন করছি।

এই জাতীয় কিছু নিয়ে আমার কীভাবে আচরণ করা উচিত?


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

উত্তর:


4

আমি সত্যিই ভাবি না যে আপনি আপনার দ্বিতীয় উদাহরণে একক-দায়বদ্ধতা-নীতি লঙ্ঘন করছেন।

  • UserServiceশ্রেণী পরিবর্তনের শুধুমাত্র এক কারণে রয়েছে: যদি সেখানে আপনি একটি ব্যবহারকারী রক্ষা পরিবর্তন করার জন্য একটি প্রয়োজন নেই।

  • ICreateUserValidatorযদি আপনি একটি ব্যবহারকারী যাচাই পরিবর্তন করার জন্য একটি প্রয়োজন: শ্রেণি শুধুমাত্র এক কারণে পরিবর্তন করতে হয়েছে।

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


1
একক-দায়িত্ব-প্যাটার্ন? মূলনীতি, সম্ভবত?
ইয়ানিস

হ্যাঁ, অবশ্যই :) সংশোধন করেছেন!
গুভেন

0

আমার কাছে মনে হয় প্রথম উদাহরণটি সত্য এসআরপির "কাছাকাছি"; কীভাবে জিনিসগুলি তারে রাখবেন এবং কীভাবে ভিউমোডেলটি পার করবেন তা আপনার ক্ষেত্রে নিয়ন্ত্রকের দায়িত্ব the

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


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

আমার ধারণা এটি আপনার বৈধতা যা প্রবিষ্ট করে তার উপর নির্ভর করে; যদি ভিউমোডেল কেবলমাত্র IsValidবুলিয়ান এবং ValidationMessagesঅ্যারেটি প্রকাশ করে তবে এটি এখনও একটি বৈধদাতা শ্রেণিতে কল করতে পারে এবং কীভাবে বৈধতা কার্যকর হচ্ছে তা নিয়ে চিন্তা করার দরকার নেই । কন্ট্রোলার এটি প্রথম যাচাই করতে পারে যেমন if (userViewModel.IsValid) { userService.Create(userViewModel); }মূলত ভিউমোডেলটি বৈধ কিনা তা জানা উচিত , তবে এটি কীভাবে এটি বৈধ তা জানে না।
ওয়েইন মোলিনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.