ক্রিয়াকলাপের সিকোয়েন্সের জন্য সেরা ওওপি ডিজাইনের প্যাটার্ন


11

আমি একটি অ্যাপ্লিকেশনটিতে কাজ করছি, যার একটি মডিউল নিম্নলিখিত আর্থিক ক্রিয়াকলাপগুলি ক্রমিকভাবে করে:

যখন কোনও ব্যবহারকারী তার ব্যাংক অ্যাকাউন্টে নির্দিষ্ট পরিমাণে স্থানান্তরিত করার জন্য অনুরোধ করে:

  1. এখন কোন লেনদেন ঘটতে পারে কিনা তা পরীক্ষা করে দেখুন? (লেনদেন শুধুমাত্র একটি নির্দিষ্ট সময়ের মধ্যে সম্পন্ন করা যেতে পারে)
  2. ব্যবহারকারী ন্যূনতম পরিমাণ প্রত্যাহারের জন্য অনুরোধ করেছেন কিনা তা পরীক্ষা করে দেখুন
  3. ব্যবহারকারীর কোনও ডিফল্ট অ্যাকাউন্ট আছে কিনা তা পরীক্ষা করে দেখুন

উপরের সমস্ত কর্মের ফলাফলটি লগ করা উচিত।

উপরের সমস্ত শর্ত যদি সন্তুষ্ট হয় তবে লেনদেন সম্পন্ন হয়। ভবিষ্যতে, কিছু অতিরিক্ত চেক থাকতে পারে।

উপরের ক্ষেত্রে কোন অবজেক্ট অরিয়েন্টেড ডিজাইনের প্যাটার্নটি সবচেয়ে উপযুক্ত হতে হবে?


3
কোনও সমস্যা সমাধানের জন্য কখনই ডিজাইনের প্যাটার্নটি অনুসন্ধান করবেন না। সঠিক সমাধানটি যোগাযোগের জন্য ডিজাইন নিদর্শনগুলি ব্যবহার করুন। প্রোগ্রামার.সটাকেক্সচেঞ্জ / প্রশ্নগুলি / 70877/… সলাইড নীতিগুলি অনুসরণ করুন এবং আপনি কোনও ভুল হতে পারবেন না।
পিডিআর

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

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

3
আপনি সরল পুরানো পদ্ধতিগত প্রোগ্রামিং বর্ণনা করার জন্য কোনও অবজেক্ট ভিত্তিক নির্মাণের জন্য জিজ্ঞাসা করছেন?
mouviciel

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

উত্তর:


13

এটা তোলে শোনাচ্ছে কি আপনি খুঁজছেন একটি মত দায়িত্ব চেইন অব । এক্ষেত্রে আপনার নিম্নলিখিত ক্লাসগুলি থাকতে পারে:

  • TransactionValidatorBase বিমূর্ত বেস বর্গ
  • TransactionTimeValidator
  • TransactionAmountValidator
  • TransactionAccountValidator

এগুলি একসাথে বেঁধে রাখা হয়েছে তবে আপনি নির্দিষ্ট কিছু বিধি প্রয়োগ করতে পারেন।

ফুর্টার রিডিং


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

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

3

যদি আপনার পদক্ষেপগুলির ক্রমটি ইনপুটগুলিকে পরিবর্তন না করে বেশিরভাগ বৈধতা শুল্ক (যেমন মনে হয় আপনি) করছেন তবে আমি @pswg এর উত্তরে ব্যাখ্যা হিসাবে, "দায়বদ্ধতার চেইন" প্যাটার্নটি সম্পর্কে সত্যই মনে করব

তবে আপনার প্রশ্নটি যেহেতু খানিকটা জেনেরিক, তাই আমি "পাইপলাইন প্রসেসিং" যুক্ত করতে চাই, যেহেতু এই একটিটির সাথে একটি পদক্ষেপ একটি আউটপুট তৈরি করবে যা পরবর্তী পদক্ষেপের জন্য ইনপুট হয়ে উঠবে (এইভাবে আসল ইনপুটটিকে পরিবর্তিত করবে) ।

এটি সম্পর্কে দুটি নিবন্ধ এখানে:
মার্টিন ফওলারের পাইপলাইন সংগ্রহ
প্যাটার্ন সম্পর্কে আরও তাত্ত্বিক আলোচনা


2

এখানে সঠিক প্যাটার্নটি আসলেই একটি প্রসঙ্গে নির্ভর করে। আটকে যাওয়ার জন্য কোনও নির্দিষ্ট প্যাটার্ন তুলে নেওয়ার আগে, আমি এই প্রশ্নের উত্তরগুলি খুঁজে বের করার চেষ্টা করব:

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

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

public void DoTransaction(IErrorAgregator error, TransactionRequest request)
{
    if(!IsTransactionInCertainTimePeriod(request, error)) return;
    if(!IsTransactionAmountInUserBounds(request, error)) return;
    if(!UserHaveDefaultAccount(request, error)) return;
    bankingTransactor.PerformTransaction(request);
}

"আইটিআরসিএকভিলেশন স্ট্রাজজি" ইন্টারফেসে ডো ট্রান্সজিশন স্থাপন করা এবং একটি স্তর সুপার-টাইপ তৈরি করা যা বৈধতা বয়লারপ্লিট কোড ধারণ করবে এটি ভাল ধারণা হতে পারে।

তবে, এই নকশায় আমি ধরে নিচ্ছি যে সংকলনের সময়টিতে বৈধতা যুক্তি নির্ধারিত হয়।


0

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

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

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


-2

আমার বোঝাপড়া অনুসারে যা প্রয়োজন তা নীচের মত কমান্ড প্যাটার্নে লাগানো যেতে পারে। ক্লাস ডিজাইন নীচে অনুযায়ী করা যেতে পারে।

interface Transaction{
void performAction();
}

class Banking{

void moneyValidation(){
//Validate Here
}

void timeValidation(){
//validate Here
}
}

class TimeValidation implements Transaction{

public Banking bank;

public TimeValidation (Banking bnk){
bank=bnk;
}

void performAction(){
bnk.timeValidation();
}


class MoneyValidation Implements Transaction{

public Banking bank;

public MoneyValidation(Banking bnk;){
bank=bnk;
}

void performAction(){
bnk.moneyValidation();
}
}


class Control{

private List val_list=new ArrayList();

void storeValidation(Transaction trans){
val_list.add(trans);
trans.performAction(val_list.getFirstAndRemove());
}
}

//Same for other validation classes

আপনার ক্লায়েন্ট ক্লাসে নিম্নলিখিত কোড স্নিপেট থাকবে:

Banking bnk = new Banking();
MoneyValidation m_val = new MoneyValidation (bnk);
TimeValidation t_val = new TimeValidation (bnk);
Control ctrl = new Control();
ctrl.storeValidation(m_val);
ctrl.storeValidation(t_val);

এটি আমার বোঝাপড়া অনুসারে, উপরে যে দৃশ্যটি দেওয়া হয়েছে with


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