अधिकांश समय जब मैं कुछ कोड लिख रहा होता हूं जो एक निश्चित फ़ंक्शन कॉल के लिए प्रतिक्रिया को हैंडल करता है मुझे निम्नलिखित कोड संरचना मिलती है:
उदाहरण: यह एक फ़ंक्शन है जो एक लॉगिन सिस्टम के लिए प्रमाणीकरण को संभाल लेगा
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.
}
}
मुसीबत
- जैसा कि आप देख सकते हैं कि कोड एक
if/else
संरचना पर बना हुआ है जिसका मतलब है कि एक नई विफलता की स्थिति का मतलब होगा कि मुझे एकelse if
बयान जोड़ने की आवश्यकता है जो ओपन बंद सिद्धांत के लिए उल्लंघन है । - मुझे लगता है कि फ़ंक्शन में अमूर्तता की अलग-अलग परतें हैं क्योंकि मैं सिर्फ एक हैंडलर में लॉगिन परीक्षण काउंटर बढ़ा सकता हूं, लेकिन दूसरे में अधिक गंभीर सामान कर सकता हूं।
- कुछ कार्यों को
increase the login trials
उदाहरण के लिए दोहराया जाता है।
मैंने एकाधिक if/else
को फ़ैक्टरी पैटर्न में परिवर्तित करने के बारे में सोचा , लेकिन मैंने केवल वस्तुओं को बदलने के लिए फ़ैक्टरी का उपयोग किया, जो व्यवहार में परिवर्तन न करें। क्या किसी के पास इसके लिए कोई बेहतर उपाय है?
ध्यान दें:
यह एक लॉगिन सिस्टम का उपयोग करने के लिए सिर्फ एक उदाहरण है। मैं एक अच्छी तरह से निर्मित ओओ पैटर्न का उपयोग करके इस व्यवहार के लिए एक सामान्य समाधान के लिए पूछ रहा हूं। इस तरह के if/else
हैंडलर मेरे कोड में बहुत सी जगहों पर दिखाई देते हैं और मैंने उदाहरण के लिए एक सरल आसान के रूप में लॉगिन सिस्टम का उपयोग किया। मेरे वास्तविक उपयोग के मामले यहां पोस्ट करने के लिए बहुत जटिल हैं। : डी
कृपया अपने उत्तर को PHP कोड तक सीमित न रखें और अपनी पसंद की भाषा का उपयोग करने के लिए स्वतंत्र महसूस करें।
अपडेट करें
मेरे प्रश्न को स्पष्ट करने के लिए एक और अधिक जटिल कोड उदाहरण:
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();
}
}
समारोह का उद्देश्य:
- मैं ईबे पर गेम बेच रहा हूं।
- अगर कोई ग्राहक अपने ऑर्डर को रद्द करना चाहता है और अपने पैसे वापस करता है (यानी रिफंड) तो मुझे पहले eBay पर "विवाद" खोलना होगा।
- एक बार विवाद खुलने के बाद, मुझे ग्राहक की पुष्टि करने के लिए प्रतीक्षा करनी चाहिए कि वह धनवापसी के लिए सहमत हो (मूर्खतापूर्ण रूप से वह वही है जिसने मुझे धनवापसी करने के लिए कहा था, लेकिन यह कैसे eBay पर काम करता है)।
- यह कार्य मेरे द्वारा खोले गए सभी विवादों को प्राप्त करता है और समय-समय पर उनकी स्थिति की जांच करता है कि ग्राहक ने विवाद का जवाब दिया है या नहीं।
- ग्राहक सहमत हो सकता है (तब मैं धनवापसी करता हूं) या फिर मना कर देता हूं (तब मैं रोलबैक करता हूं) या 7 दिनों तक जवाब नहीं दे सकता (मैं खुद को फिर विवाद वापस करता हूं)।
getOrderStrategy
एक फ़ैक्टरी विधि है जोstrategy
ऑर्डर की स्थिति के आधार पर एक वस्तु लौटाती है , लेकिन कार्यpreProcess()
औरpreProcess()
कार्य क्या हैं । आप भी क्यों पास$this
हुएupdateOrderHistory($this)
?