বেশিরভাগ সময় যখন আমি এমন কিছু কোড লিখি যা নির্দিষ্ট ফাংশন কলটির প্রতিক্রিয়া পরিচালনা করে আমি নিম্নলিখিত কোড কাঠামোটি পাই:
উদাহরণ: এটি এমন একটি ফাংশন যা লগইন সিস্টেমের জন্য প্রমাণীকরণটি পরিচালনা করবে
class Authentication{
function login(){ //This function is called from my Controller
$result=$this->authenticate($username,$password);
if($result=='wrong password'){
//increase the login trials counter
//send mail to admin
//store visitor ip
}else if($result=='wrong username'){
//increase the login trials counter
//do other stuff
}else if($result=='login trials exceeded')
//do some stuff
}else if($result=='banned ip'){
//do some stuff
}else if...
function authenticate($username,$password){
//authenticate the user locally or remotely and return an error code in case a login in fails.
}
}
সমস্যা
- যেহেতু আপনি দেখতে পারেন কোড একটি মধ্যে build হয়
if/else
কাঠামো একটি নতুন ব্যর্থতা অবস্থা মানে হবে এই যে আমি একজন যোগ করতে হবে যার মানেelse if
মন্তব্যটির জন্য লঙ্ঘন খুলুন বন্ধ পুঁজি । - আমি একটি অনুভূতি পেয়েছি যে ফাংশনটির বিমূর্ততার বিভিন্ন স্তর রয়েছে কারণ আমি কেবলমাত্র একটি হ্যান্ডলারে লগইন ট্রায়ালগুলির কাউন্টারকে বাড়িয়ে তুলতে পারি, তবে অন্যটিতে আরও গুরুতর স্টাফ করি।
- কিছু ফাংশন
increase the login trials
উদাহরণস্বরূপ পুনরাবৃত্তি হয় ।
আমি একাধিককে if/else
কারখানার ধরণে রূপান্তর করার বিষয়ে চিন্তাভাবনা করেছি , তবে আমি কেবলমাত্র কারখানাটি ব্যবহার করে এমন আচরণ তৈরি না করে অবজেক্ট তৈরি করতে ব্যবহার করেছি। কারও কি এর জন্য আরও ভাল সমাধান আছে?
বিঃদ্রঃ:
এটি লগইন সিস্টেমটি ব্যবহার করে কেবল উদাহরণ। আমি ভালভাবে নির্মিত ও ও প্যাটার্ন ব্যবহার করে এই আচরণের একটি সাধারণ সমাধান চাইছি। এই ধরণের if/else
হ্যান্ডলারগুলি আমার কোডে অনেক জায়গায় উপস্থিত হয় এবং আমি উদাহরণটি ব্যাখ্যা করার জন্য একটি সহজ সহজ হিসাবে লগইন সিস্টেমটি ব্যবহার করি। আমার আসল ব্যবহারের কেসগুলি এখানে পোস্ট করা অনেক জটিল। : ডি
দয়া করে আপনার উত্তরটি পিএইচপি কোডে সীমাবদ্ধ করবেন না এবং আপনার পছন্দের ভাষাটি নির্দ্বিধায় ব্যবহার করবেন না।
হালনাগাদ
আমার প্রশ্নটি পরিষ্কার করার জন্য আরও একটি জটিল কোড উদাহরণ:
public function refundAcceptedDisputes() {
$this->getRequestedEbayOrdersFromDB(); //get all disputes requested on ebay
foreach ($this->orders as $order) { /* $order is a Doctrine Entity */
try {
if ($this->isDisputeAccepted($order)) { //returns true if dispute was accepted
$order->setStatus('accepted');
$order->refund(); //refunds the order on ebay and internally in my system
$this->insertRecordInOrderHistoryTable($order,'refunded');
} else if ($this->isDisputeCancelled($order)) { //returns true if dispute was cancelled
$order->setStatus('cancelled');
$this->insertRecordInOrderHistory($order,'cancelled');
$order->rollBackRefund(); //cancels the refund on ebay and internally in my system
} else if ($this->isDisputeOlderThan7Days($order)) { //returns true if 7 days elapsed since the dispute was opened
$order->closeDispute(); //closes the dispute on ebay
$this->insertRecordInOrderHistoryTable($order,'refunded');
$order->refund(); //refunds the order on ebay and internally in my system
}
} catch (Exception $e) {
$order->setStatus('failed');
$order->setErrorMessage($e->getMessage());
$this->addLog();//log error
}
$order->setUpdatedAt(time());
$order->save();
}
}
ফাংশন উদ্দেশ্য:
- আমি ইবে গেম বিক্রি করছি।
- যদি কোনও গ্রাহক তার অর্ডার বাতিল করতে চান এবং তার অর্থ ফেরত পান (অর্থাত্ ফেরত দেওয়া) আমাকে অবশ্যই ইবেতে প্রথমে একটি "বিতর্ক" খুলতে হবে।
- কোনও বিতর্ক খোলার পরে আমাকে অবশ্যই গ্রাহকের নিশ্চয়তার জন্য অপেক্ষা করতে হবে যে তিনি ফেরত দিতে সম্মত হয়েছেন (নির্বোধ তিনিই যে আমাকে ফেরত দিতে বলেছে, তবে এটি ইবেতে কাজ করে)।
- এই ফাংশনগুলি আমার দ্বারা খোলার সমস্ত বিরোধ পেয়ে যায় এবং গ্রাহক এই বিরোধের জবাব দিয়েছে কিনা তা পর্যায়ক্রমে তাদের স্ট্যাটাসগুলি পরীক্ষা করে।
- গ্রাহক রাজি হতে পারে (তারপরে আমি রিফান্ড) বা প্রত্যাখ্যান করতে পারি (তারপরে আমি রোলব্যাক করব) বা or দিনের জন্য প্রতিক্রিয়া জানাতে পারে না (আমি নিজেই বিতর্কটি বন্ধ করি তারপরে ফেরত দিতে পারি)।
getOrderStrategy
একটি ফ্যাক্টরি পদ্ধতি যাstrategy
ক্রম স্থিতির উপর নির্ভর করে কোনও বস্তু ফেরত দেয় তবে কীpreProcess()
এবং কী কী তা হয়preProcess()
। এছাড়াও আপনি কেন পাস$this
করেছেনupdateOrderHistory($this)
?