मुझे हाल ही में एक कोडबेस विरासत में मिला है जिसमें कुछ प्रमुख लिस्कोव उल्लंघनकर्ता हैं। महत्वपूर्ण वर्गों में। इससे मुझे भारी मात्रा में दर्द हुआ है। मुझे क्यों समझाते हैं।
मेरे पास है Class A
, जो इससे प्राप्त होता है Class B
। Class A
और Class B
गुणों का एक समूह साझा करें जो Class A
अपने स्वयं के कार्यान्वयन के साथ ओवरराइड करता है। Class A
प्रॉपर्टी सेट करना या प्राप्त करना एक ही प्रॉपर्टी को सेट करने या प्राप्त करने का एक अलग प्रभाव है Class B
।
public Class A
{
public virtual string Name
{
get; set;
}
}
Class B : A
{
public override string Name
{
get
{
return TranslateName(base.Name);
}
set
{
base.Name = value;
FunctionWithSideEffects();
}
}
}
इस तथ्य को एक तरफ रखते हुए कि यह .NET में अनुवाद करने के लिए पूरी तरह से भयानक तरीका है, इस कोड के साथ कई अन्य मुद्दे हैं।
इस मामले Name
में एक सूचकांक और एक प्रवाह नियंत्रण चर के रूप में कई स्थानों पर उपयोग किया जाता है। उपरोक्त वर्गों को उनके कच्चे और व्युत्पन्न दोनों रूपों में पूरे कोडबेस में रखा गया है। इस मामले में लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन करने का मतलब है कि मुझे प्रत्येक एकल कॉल के संदर्भ को जानने की जरूरत है जो बेस क्लास लेते हैं।
कोड दोनों की वस्तुओं का उपयोग करता है Class A
और Class B
इसलिए, मैं बस Class A
लोगों को उपयोग करने के लिए मजबूर करने के लिए सार नहीं बना सकता Class B
।
कुछ बहुत ही उपयोगी उपयोगिता फ़ंक्शंस हैं जो काम करते हैं Class A
और अन्य बहुत ही उपयोगी यूटिलिटी फ़ंक्शंस संचालित होते हैं Class B
। आदर्श रूप से मैं किसी भी उपयोगिता फ़ंक्शन का उपयोग करने में सक्षम होना चाहूंगा जो Class A
चालू हो सकता है Class B
। कई कार्य जो Class B
आसानी से कर सकते हैं, Class A
यदि वे एलएसपी के उल्लंघन के लिए नहीं थे, तो वे ले सकते हैं ।
इसके बारे में सबसे बुरी बात यह है कि यह विशेष मामला रिफ्लैक्टर के लिए वास्तव में कठिन है क्योंकि पूरा आवेदन इन दो वर्गों पर टिका होता है, हर समय दोनों वर्गों पर काम करता है और अगर मैं इसे बदल देता हूं तो सौ तरीकों से टूट जाएगा। वैसे भी)।
मुझे इसे ठीक करने के लिए क्या करना होगा एक NameTranslated
संपत्ति बनाना है , जो संपत्ति का Class B
संस्करण होगा Name
और बहुत, बहुत सावधानी से Name
मेरी नई NameTranslated
संपत्ति का उपयोग करने के लिए व्युत्पन्न संपत्ति के हर संदर्भ को बदल दें । हालाँकि, इन संदर्भों में से एक भी गलत हो जाने से संपूर्ण एप्लिकेशन को उड़ा दिया जा सकता है।
यह देखते हुए कि कोडबेस के आसपास इकाई परीक्षण नहीं हैं, यह सबसे खतरनाक परिदृश्य होने के करीब है जो एक डेवलपर सामना कर सकता है। यदि मैंने उल्लंघन को नहीं बदला है तो मुझे मानसिक ऊर्जा का भारी मात्रा में खर्च करना होगा, इस बात का ध्यान रखें कि प्रत्येक विधि में किस प्रकार की वस्तु का संचालन किया जा रहा है और यदि मैं उल्लंघन को ठीक करता हूं तो मैं पूरे उत्पाद को निष्क्रिय समय पर विस्फोट कर सकता हूं।