लिस्कोव्ह सबस्टिट्यूशनचे तत्व, तिसरे सोलिड तत्व
- द्वाराः एर्कोले पाल्मेरी
- वर्ग: प्रशिक्षण, प्रशिक्षण

बाल वर्गाने कधीही पालक वर्गाच्या प्रकार परिभाषांवर परिणाम करु नये किंवा बदलू नये.
या तत्त्वाची संकल्पना बार्बरा लिस्कोव्ह यांनी १ 1987 1994 च्या परिषदेत दिली होती आणि नंतर १ XNUMX XNUMX in मध्ये जेनेट विंग यांच्या लेखात प्रकाशित केली होती. त्यांची मूळ व्याख्या खालीलप्रमाणे आहेः
टाइप टी च्या ऑब्जेक्ट्स x वर एक्स (एक्स) गुणधर्म गुणधर्म असू द्या. मग क्यू (वाय) एस प्रकाराच्या ऑब्जेक्ट्ससाठी प्रात्यक्षिक असावे जेथे एस टीचा उपप्रकार आहे.
नंतर, रॉबर्ट सी. मार्टिन यांच्या एगिल सॉफ्टवेयर डेव्हलपमेंट, प्रिन्सिपल्स, पॅटर्न्स, आणि प्रॅक्टिसिस या पुस्तकातील सोडियम तत्त्वांच्या प्रकाशनासह आणि नंतर अॅगिल प्रिन्सिपल्स, पॅटर्न्स, आणि प्रॅक्टिस इन सी # या पुस्तकाच्या सी # आवृत्तीत पुन्हा प्रकाशित केले गेले तर ही व्याख्या बनली. लिस्कोव्हच्या प्रतिस्थानाचे तत्व म्हणून ओळखले जाते.
रॉबर्ट सी. मार्टिन यांनी दिलेली व्याख्या ही आपल्यापर्यंत पोचवते: उपप्रकार त्यांच्या बेस प्रकारांसह बदलण्यायोग्य असणे आवश्यक आहे.
अधिक सोप्या भाषेत सांगायचे तर, उपवर्गाला अशा प्रकारे पालक वर्गाच्या पद्धती अधिलिखित कराव्या लागतील ज्यामुळे ग्राहकाच्या दृष्टिकोनातून कार्यक्षमता खंडित होणार नाही. संकल्पना प्रात्यक्षिक करण्यासाठी येथे एक साधे उदाहरण आहे.
वर्ग वाहन {
फंक्शन स्टार्टइंजिन () {
// डीफॉल्ट इंजिन प्रारंभ कार्यक्षमता
}
कार्य प्रवेग () {
// डीफॉल्ट प्रवेग कार्यक्षमता
}
}
एक वाहन वर्ग दिला - तो अमूर्त असू शकतो - आणि दोन अंमलबजावणीः
वर्ग कारने वाहन वाढविले {
फंक्शन स्टार्टइंजिन () {
$ हे-> मग्नता ();
पालक :: प्रारंभइंजिन ();
}
खाजगी कार्य गुंतवणे () {
// प्रज्वलन प्रक्रिया
}
}
वर्ग इलेक्ट्रिकबसने वाहनांचा विस्तार केला {
कार्य प्रवेग () {
$ हे-> वाढ व्होल्टेज ();
$ हे-> कनेक्टइंटिव्हिज्युअलइंजिन्स ();
}
खाजगी कार्य वाढ व्होल्टेज () {
// इलेक्ट्रिक लॉजिक
}
खासगी फंक्शन कनेक्टइंटिव्हिज्युअलइंजिन्स () {
// कनेक्शन लॉजिक
}
}
वर्ग चालक {
फंक्शन गो (वाहन $ v) {
$ v-> प्रारंभइंजिन ();
$ v-> गती ();
}
}
क्लायंट क्लास जर वाहन वापरु शकत असेल तर दोघांचा वापर करण्यास सक्षम असेल.
ज्याचा वापर आपण ओसीपीमध्ये केला म्हणून टेम्पलेट पद्धत डिझाइन पॅटर्नची साधी अंमलबजावणी करते.
आपणास दुसर्या सोलिड तत्त्वामध्ये देखील स्वारस्य असू शकतेः https: // ब्लगिन टेक्नोलॉजीया.आयटी / ओपन -क्लॉस्ड- सेकंडो- प्रिंसिओ- सॉलिड / 3906 XNUMX XNUMX / /
ओपन / क्लोज्ड तत्वानुसार आमच्या मागील अनुभवाच्या आधारे, आम्ही असा निष्कर्ष काढू शकतो की लिस्कोव्हच्या प्रतिस्थापनाचे तत्व ओसीपीशी जवळचे संबंधित आहे. खरं तर, "एलएसपीचे उल्लंघन हे ओसीपीचे सुप्त उल्लंघन आहे" (रॉबर्ट सी. मार्टिन), आणि टेम्पलेट मेथड डिझाइन पॅटर्न हे एलएसपीच्या आदर आणि अंमलबजावणीचे उत्कृष्ट उदाहरण आहे, जे पालन करण्याच्या निराकरणांपैकी एक आहे. ओसीपी सह.
एलएसपी उल्लंघनाचे उदाहरण
वर्ग आयत {
खाजगी-टॉपलिफ्ट;
खाजगी-रुंदी;
खाजगी-उंची
सार्वजनिक कार्यसमूह सेट (उंची) {
$ या-> उंची = $ उंची;
}
सार्वजनिक कार्ये गेटहाइट () {
परतावा $ या-> उंची;
}
पब्लिक फंक्शन सेटविड्थ ($ रुंदी) {
$ या-> रुंदी = $ रुंदी;
}
सार्वजनिक कार्य getWidth () {
परतावा $ या-> रुंदी;
}
}
मूलभूत भूमिती आकार, आयत सह प्रारंभ करू या. रुंदी आणि उंचीसाठी सेटर आणि गेटर्ससह हा फक्त एक साधा डेटा ऑब्जेक्ट आहे. अशी कल्पना करा की आमचा अनुप्रयोग कार्य करीत आहे आणि आधीच अनेक ग्राहकांवर तैनात आहे. आता त्यांना एक नवीन वैशिष्ट्य आवश्यक आहे. ते चौरसांमध्ये फेरफार करण्यात सक्षम असणे आवश्यक आहे.
वास्तविक जीवनात भूमितीमध्ये चौरस आयताचा विशिष्ट आकार असतो. म्हणून आम्ही चौरस वर्ग लागू करण्याचा प्रयत्न करू शकतो जो आयताचा वर्ग वाढवितो. असे अनेकदा म्हटले जाते की बाल वर्ग हा एक पालक वर्ग आहे आणि ही अभिव्यक्ती देखील एलएसपीशी संबंधित आहे, कमीतकमी पहिल्या दृष्टीक्षेपात.
वर्ग चौरस आयत वाढविते {
पब्लिक फंक्शन सेटहाईट ($ मूल्य) {
$ या-> रुंदी = $ मूल्य;
$ हे-> उंची = $ मूल्य;
}
पब्लिक फंक्शन सेटविड्थ ($ मूल्य) {
$ या-> रुंदी = $ मूल्य;
$ हे-> उंची = $ मूल्य;
}
}
चौरस समान रुंदी आणि उंची असलेला आयत आहे आणि आम्ही मागील उदाहरणाप्रमाणेच एक विचित्र अंमलबजावणी करू शकतो. आम्ही उंची आणि रुंदी दोन्ही सेट करण्यासाठी दोन्ही सेट्टर अधिलिखित करू शकतो. परंतु क्लायंट कोडवर याचा कसा परिणाम होईल?
वर्ग क्लायंट {
कार्य क्षेत्रफळ (आयत $ r) $
$ आर-> सेटविड्थ (5);
$ आर-> सेटहाइट (4);
जर ($ r-> क्षेत्र ()! = 20)
नवीन अपवाद ('खराब क्षेत्र!') फेकून द्या;
}
खरे परत येणे;
}
}
आयताचे क्षेत्र तपासणारे क्लायंट वर्ग असणे चुकीचे असल्यास त्यास अपवाद ठोकणे शक्य आहे.
कार्य क्षेत्र () {
रिटर्न $ या-> रुंदी * $ या-> उंची;
}
हे क्षेत्र प्रदान करण्यासाठी आम्ही वरील रीती आमच्या आयत वर्गात स्पष्टपणे जोडली.
वर्ग एलएसपीटेस्टने PHPUnit_Framework_TestCase वाढविला extend
फंक्शन चाचणीआरेखाआरिया () {
$ r = नवीन आयत ();
$ c = नवीन ग्राहक ();
$ हे-> assertTrue ($ c-> एरियावेरीफायर ($ r));
}
}
आम्ही एरिया व्हेरिफायरला रिक्त आयत ऑब्जेक्ट पाठवून एक सोपी चाचणी तयार केली आणि परीक्षा उत्तीर्ण झाली. जर आमचा स्क्वेअर वर्ग अचूकपणे परिभाषित केला असेल तर तो क्लायंटच्या एरियाव्हीरिफायर () वर सबमिट केल्यास त्याची कार्यक्षमता खंडित होऊ नये. तथापि, चौरस कोणत्याही गणिताच्या अर्थाने एक आयत आहे. पण हा आमचा वर्ग आहे का?
फंक्शन टेस्टस्क्वेरिया () {
$ r = नवीन स्क्वेअर ();
$ c = नवीन ग्राहक ();
$ हे-> assertTrue ($ c-> एरियावेरीफायर ($ r));
}
तर आपला स्क्वेअर वर्ग सर्व काही आयत नाही. हे भूमितीचे नियम तोडते. हे अयशस्वी होते आणि लिस्कोव्हच्या बदली तत्त्वाचे उल्लंघन करते.
एर्कोले पाल्मेरी

कोणतीही टिप्पणी नाही