मुझे हाल ही में एक कोडबेस विरासत में मिला है जिसमें कुछ प्रमुख लिस्कोव उल्लंघनकर्ता हैं। महत्वपूर्ण वर्गों में। इससे मुझे भारी मात्रा में दर्द हुआ है। मुझे क्यों समझाते हैं।
मेरे पास है 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संपत्ति का उपयोग करने के लिए व्युत्पन्न संपत्ति के हर संदर्भ को बदल दें । हालाँकि, इन संदर्भों में से एक भी गलत हो जाने से संपूर्ण एप्लिकेशन को उड़ा दिया जा सकता है।
यह देखते हुए कि कोडबेस के आसपास इकाई परीक्षण नहीं हैं, यह सबसे खतरनाक परिदृश्य होने के करीब है जो एक डेवलपर सामना कर सकता है। यदि मैंने उल्लंघन को नहीं बदला है तो मुझे मानसिक ऊर्जा का भारी मात्रा में खर्च करना होगा, इस बात का ध्यान रखें कि प्रत्येक विधि में किस प्रकार की वस्तु का संचालन किया जा रहा है और यदि मैं उल्लंघन को ठीक करता हूं तो मैं पूरे उत्पाद को निष्क्रिय समय पर विस्फोट कर सकता हूं।