ক্লাস সদৃশ প্যাটার্ন?


11

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

public class Order{
    int ID{get;set;}
    String Customer{get;set;}
    DateTime DeliveryDate{get;set;}
    String Description{get;set;}
}

এবং

public class OrderModel{
    String Customer{get;set;}
    DateTime DeliveryDate{get;set;}
    String Description{get;set;}
    public OrderModel( Order from){
        this.Customer= from.Customer;
        // copy all the properties over individually
    }
    public Order ToOrder(){
        Order result =new Order();
        result.Customer = this.Customer;
        // copy all the properties over individually
    }

}

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

হালনাগাদ

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

public class EditOrderPagelModel
{
    public OrderModel Order{get;set;}
    public DateTime EarliestDeliveryDate{get;set;}
    public DateTime LatestAllowedDeliveryDate{get;set;}
}

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

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

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


1
"আমি এই প্রকল্পটি অন্য বিকাশকারীর কাছ থেকে উত্তরাধিকার সূত্রে পেয়েছি, যিনি তখন থেকে সংস্থাটি ছেড়ে চলে এসেছেন" গল্পের প্রতি উত্সর্গীকৃত একটি সাইট রয়েছে যা এইভাবে শুরু হয়

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

@ রবার্টহার্ভে আপনি অত্যধিক ইন্ডিरेশন বলে কি উল্লেখ করছেন?
রবার্ট রিকিটস

1
অর্ডারমোডেল। অর্ডারভিউমোডেল (আপনার সম্ভবত সম্ভবত editOrderPageModel হিসাবে উল্লেখ করা হচ্ছে) যথেষ্ট ইন্ডিয়ারেশন; নীচে আমার উত্তর দেখুন।
রবার্ট হার্ভে

@ রবার্টহারভে এটি আসলে যে প্রশ্নটি আমি জিজ্ঞাসা করতে চেয়েছিলাম তার উত্তরের মতো মনে হচ্ছে
রবার্ট রিকিটস

উত্তর:


16

তাহলে আমি কি এখানে গুরুত্বপূর্ণ কিছু মিস করছি?

হ্যাঁ

যদিও এগুলি একই জিনিসটির মতো দেখায় এবং ডোমেনে একই জিনিস উপস্থাপন করে, তারা একই (ওওপি) অবজেক্ট নয়।

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

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

উভয় কাঠামোর সাথে আপনার সত্ত্বা বেঁধে , আপনি এটিকে আরও খারাপ করে তুলছেন।


7

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

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

অন্যদিকে একটি ভিউ মডেল Nameআইডি নয়, গ্রাহকের দিকে বেশি আগ্রহী হতে পারে । মডেলটিতে গ্রাহক আপডেট না করা থাকলে এর আইডির কোনও প্রয়োজন নেই।

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

অন্য কথায়, চালানগুলি সাধারণত প্রদর্শিত হয় ঠিক তেমনভাবে সংরক্ষণ করা হয় না।


3

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

একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে - আপনি এটি করতে চাওয়ার প্রধান কারণগুলি এখানে:

1) এনক্যাপসুলেশন - আপনার অ্যাপ্লিকেশনটির তথ্য গোপন করা

2) ছোট মডেলগুলি সিরিয়ালাইজ করার জন্য দ্রুত এবং প্রেরণে সহজ

3) তারা বিভিন্ন উদ্দেশ্যে পরিবেশন করে, যদিও ওভারল্যাপিং হয়, এবং সেইজন্য সেখানে বিভিন্ন বস্তু থাকা উচিত।

4) কখনও কখনও এটি বিভিন্ন প্রশ্নের বিভিন্ন মান-অবজেক্টের জন্য বোধগম্য হয় । এটি সি # তে কীভাবে আছে তা আমি জানি না, তবে জাভাতে ফলাফল সংগ্রহের জন্য কোনও পজো ব্যবহার করা সম্ভব । আমার যদি একটি একক প্রয়োজন হয় তবে আমি অর্ডার- এন্টিটি orderব্যবহার করি তবে আমার যদি কেবলমাত্র কিছু পরিমাণ কলামের ডেটা পরিমাণে পূর্ণ হয় তবে ছোট ছোট অবজেক্ট ব্যবহার করা আরও কার্যকর।


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

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

0

(অস্বীকৃতি: আমি কেবল এটি দেখছিলাম যে এটি এইভাবে ব্যবহৃত হচ্ছে I আমি এটি করার আসল উদ্দেশ্যটি ভুল বুঝেছি this এই উত্তরটিকে সন্দেহের সাথে আচরণ করুন))

মধ্যে রূপান্তর: এখানে আরেকটি অনুপস্থিত বিট Orderএবং OrderModel

Orderবর্গ আপনার ORM আবদ্ধ থাকে, যখন OrderModelআপনার দেখুন মডেল নকশা সাথে আবদ্ধ আছে।

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

public class OrderModel {
    ...
    public OrderModel(Order from) { ... }
    public Order ToOrder() { ... }
}

এই কাজ করার কারণ যখনই সেখান থেকে একটি ক্রসিং হল OrderModelথেকে Orderবা তদ্বিপরীত, আপনি কি জানেন যে কিছু ডেটা থেকে লোড হয় নি হবে অথবা ORM মধ্যে সংরক্ষণ করা হয়েছে।


যদি আমি উভয়কেই রাখি তবে আমি অবশ্যই তাদের রূপান্তরটি আরও স্বয়ংক্রিয় করার জন্য সেট আপ করতে চাই
রবার্ট রিকিটস

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