ട്യൂട്ടോറിയൽ

ലിസ്കോവ് സബ്സ്റ്റിറ്റ്യൂഷന്റെ തത്വം, മൂന്നാമത്തെ സോളിഡ് തത്വം

കുട്ടികളുടെ ക്ലാസുകൾ ഒരിക്കലും കുട്ടികളെ ബാധിക്കുകയോ പരിഷ്കരിക്കുകയോ ചെയ്യരുത് defiപാരന്റ് ക്ലാസ്സിന്റെ തരത്തിലുള്ള പ്രസ്താവനകൾ.

ഈ തത്ത്വത്തിന്റെ ആശയം ബാർബറ ലിസ്കോവ് 1987-ലെ കോൺഫറൻസ് മുഖ്യപ്രസംഗത്തിൽ അവതരിപ്പിക്കുകയും പിന്നീട് 1994-ൽ ജാനറ്റ് വിംഗുമായി ചേർന്ന് ഒരു പേപ്പറിൽ പ്രസിദ്ധീകരിക്കുകയും ചെയ്തു. defiയഥാർത്ഥ രൂപം ഇപ്രകാരമാണ്:

ടൈപ്പ് ടി യുടെ x ഒബ്ജക്റ്റുകളിൽ q (x) പ്രദർശിപ്പിക്കാവുന്ന ഒരു സ്വത്താകട്ടെ. എന്നിട്ട് S (T) ന്റെ ഉപവിഭാഗമായ S തരം Y ന്റെ ഒബ്ജക്റ്റുകൾക്ക് q (y) പ്രദർശിപ്പിക്കണം.

പിന്നീട്, റോബർട്ട് സി. മാർട്ടിന്റെ സോളിഡ് തത്ത്വങ്ങൾ അദ്ദേഹത്തിന്റെ എജൈൽ സോഫ്റ്റ്‌വെയർ ഡെവലപ്‌മെന്റ്, പ്രിൻസിപ്പിൾസ്, പാറ്റേണുകൾ, ആന്റ് പ്രാക്ടീസസ് എന്ന പുസ്‌തകത്തിൽ പ്രസിദ്ധീകരിക്കുകയും തുടർന്ന് എജൈൽ പ്രിൻസിപ്പിൾസ്, പാറ്റേൺസ്, ആന്റ് പ്രാക്ടീസസ് എന്ന പുസ്‌തകത്തിന്റെ സി# പതിപ്പിൽ പുനഃപ്രസിദ്ധീകരിക്കുകയും ചെയ്‌തു. defiലിസ്കോവ് സബ്സ്റ്റിറ്റ്യൂഷൻ തത്വം എന്നറിയപ്പെട്ടു.

ഇതിലേക്ക് നമ്മെ എത്തിക്കുന്നു defiറോബർട്ട് സി. മാർട്ടിൻ നൽകിയ വിവരങ്ങൾ: ഉപതരം അവയുടെ അടിസ്ഥാന തരങ്ങൾ ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കാവുന്നതായിരിക്കണം.

കൂടുതൽ ലളിതമായി പറഞ്ഞാൽ, ഒരു ഉപഭോക്താവിന്റെ കാഴ്ചപ്പാടിൽ നിന്ന് പ്രവർത്തനത്തെ തകർക്കാത്ത വിധത്തിൽ ഒരു ഉപവിഭാഗം പാരന്റ് ക്ലാസിന്റെ രീതികളെ അസാധുവാക്കണം. ആശയം പ്രകടിപ്പിക്കുന്നതിനുള്ള ലളിതമായ ഒരു ഉദാഹരണം ഇതാ.

ക്ലാസ് വാഹനം {

    startEngine () function

        // സ്ഥിരസ്ഥിതി എഞ്ചിൻ ആരംഭ പ്രവർത്തനം

    }

 

    പ്രവർത്തനം ത്വരിതപ്പെടുത്തുക () {

        // സ്ഥിരസ്ഥിതി ത്വരണം പ്രവർത്തനം

    }

}

ഒരു വെഹിക്കിൾ ക്ലാസ് നൽകിയാൽ - അത് അമൂർത്തമാകാം - കൂടാതെ രണ്ട് നടപ്പാക്കലുകളും:

ക്ലാസ് കാർ വാഹനം വിപുലീകരിക്കുന്നു {

    startEngine () function

        $ this-> ഇടപഴകൽ ഇഗ്നിഷൻ ();

        പാരന്റ് :: startEngine ();

    }

 

    സ്വകാര്യ ഫംഗ്ഷൻ ഇടപഴകൽ ഇഗ്നിഷൻ () {

        // ഇഗ്നിഷൻ നടപടിക്രമം

    }

}

 

ക്ലാസ് ഇലക്ട്രിക്ബസ് വാഹനം വിപുലീകരിക്കുന്നു {

    പ്രവർത്തനം ത്വരിതപ്പെടുത്തുക () {

        $ this-> വർദ്ധന വോൾട്ടേജ് ();

        $ this-> connectIndividualEngines ();

    }

 

    സ്വകാര്യ ഫംഗ്ഷൻ വർദ്ധന വോൾട്ടേജ് () {

        // ഇലക്ട്രിക് ലോജിക്

    }

 

    പ്രൈവറ്റ് ഫംഗ്ഷൻ കണക്റ്റ് ഇൻഡിഡ്യുവൽ എഞ്ചിനുകൾ () {

        // കണക്ഷൻ ലോജിക്

    }

}

ക്ലാസ് ഡ്രൈവർ {

    പ്രവർത്തനം പോകുക (വാഹനം $ v) {

        $ v-> startEngine ();

        $ v-> ത്വരിതപ്പെടുത്തുക ();

    }

}

വാഹനം ഉപയോഗിക്കാൻ കഴിയുമെങ്കിൽ ഒരു ക്ലയന്റ് ക്ലാസിന് രണ്ടും ഉപയോഗിക്കാൻ കഴിയണം.

ഇത് ഒ‌സി‌പിയിൽ ഞങ്ങൾ ഉപയോഗിച്ചതുപോലെ ടെംപ്ലേറ്റ് രീതി ഡിസൈൻ പാറ്റേണിന്റെ ലളിതമായ നടപ്പാക്കലിലേക്ക് ഞങ്ങളെ കൊണ്ടുവരുന്നു.

രണ്ടാമത്തെ SOLID തത്വത്തിലും നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടാകാം: https: //bloginnovazione.en / open-closed-second-principle-solid / 3906 /

ഓപ്പൺ / ക്ലോസ്ഡ് തത്വവുമായുള്ള ഞങ്ങളുടെ മുൻ അനുഭവത്തെ അടിസ്ഥാനമാക്കി, ലിസ്കോവ് പകരക്കാരന്റെ തത്വം ഒസിപിയുമായി അടുത്ത ബന്ധമുണ്ടെന്ന് ഞങ്ങൾക്ക് നിഗമനം ചെയ്യാം. വാസ്തവത്തിൽ, "എൽ‌എസ്‌പിയുടെ ലംഘനം ഒ‌സി‌പിയുടെ ഒളിഞ്ഞിരിക്കുന്ന ലംഘനമാണ്" (റോബർട്ട് സി. മാർട്ടിൻ), എൽ‌എസ്‌പി പാലിക്കുന്നതിനും നടപ്പാക്കുന്നതിനുമുള്ള ഒരു മികച്ച ഉദാഹരണമാണ് ടെംപ്ലേറ്റ് രീതി ഡിസൈൻ പാറ്റേൺ, ഇത് പാലിക്കാനുള്ള പരിഹാരങ്ങളിലൊന്നാണ് OCP- യ്‌ക്കൊപ്പം.

എൽ‌എസ്‌പി ലംഘനത്തിന്റെ ഉദാഹരണം

ക്ലാസ് ദീർഘചതുരം {

    സ്വകാര്യ $ ടോപ്പ് ലെഫ്റ്റ്;

    സ്വകാര്യ $ വീതി;

    സ്വകാര്യ $ ഉയരം;

 

    പബ്ലിക് ഫംഗ്ഷൻ സെറ്റ്ഹൈറ്റ് ($ ഉയരം) {

        $ this-> ഉയരം = $ ഉയരം;

    }

 

ഇന്നൊവേഷൻ വാർത്താക്കുറിപ്പ്
നവീകരണത്തെക്കുറിച്ചുള്ള ഏറ്റവും പ്രധാനപ്പെട്ട വാർത്തകൾ നഷ്ടപ്പെടുത്തരുത്. ഇമെയിൽ വഴി അവ സ്വീകരിക്കുന്നതിന് സൈൻ അപ്പ് ചെയ്യുക.

    പബ്ലിക് ഫംഗ്ഷൻ getHeight () {

        മടങ്ങുക $ this-> ഉയരം;

    }

 

    പബ്ലിക് ഫംഗ്ഷൻ സെറ്റ്വിഡ്ത്ത് ($ വീതി) {

        $ this-> വീതി = $ വീതി;

    }

 

    പബ്ലിക് ഫംഗ്ഷൻ getWidth () {

        മടങ്ങുക $ this-> വീതി;

    }

}

ഒരു അടിസ്ഥാന ജ്യാമിതീയ ആകൃതി, ഒരു ദീർഘചതുരം ഉപയോഗിച്ച് നമുക്ക് ആരംഭിക്കാം. വീതിക്കും ഉയരത്തിനും സെറ്ററുകളും ഗെറ്ററുകളും ഉള്ള ഒരു ലളിതമായ ഡാറ്റ ഒബ്‌ജക്റ്റ് മാത്രമാണ് ഇത്. ഞങ്ങളുടെ ആപ്ലിക്കേഷൻ പ്രവർത്തിക്കുന്നുവെന്നും ഇതിനകം തന്നെ നിരവധി ക്ലയന്റുകളിൽ വിന്യസിച്ചിട്ടുണ്ടെന്നും സങ്കൽപ്പിക്കുക. ഇപ്പോൾ അവർക്ക് ഒരു പുതിയ സവിശേഷത ആവശ്യമാണ്. സ്ക്വയറുകളിൽ കൃത്രിമം കാണിക്കാൻ അവർക്ക് കഴിയണം.

യഥാർത്ഥ ജീവിതത്തിൽ, ജ്യാമിതിയിൽ, ഒരു ചതുരം ഒരു ദീർഘചതുരത്തിന്റെ പ്രത്യേക ആകൃതിയാണ്. അതിനാൽ ഒരു ചതുര ക്ലാസ് വിപുലീകരിക്കുന്ന ഒരു സ്ക്വയർ ക്ലാസ് നടപ്പിലാക്കാൻ ഞങ്ങൾക്ക് ശ്രമിക്കാം. ഒരു ചൈൽഡ് ക്ലാസ് ഒരു രക്ഷാകർതൃ ക്ലാസാണെന്ന് പലപ്പോഴും പറയാറുണ്ട്, മാത്രമല്ല ഈ പദപ്രയോഗം എൽ‌എസ്‌പിയുമായി യോജിക്കുന്നു, കുറഞ്ഞത് ഒറ്റനോട്ടത്തിൽ.

ക്ലാസ് സ്ക്വയർ ദീർഘചതുരം വിപുലീകരിക്കുന്നു {

    പബ്ലിക് ഫംഗ്ഷൻ സെറ്റ്ഹൈറ്റ് ($ മൂല്യം) {

        $ this-> വീതി = $ മൂല്യം;

        $ this-> ഉയരം = $ മൂല്യം;

    }

 

    പബ്ലിക് ഫംഗ്ഷൻ സെറ്റ്വിഡ്ത്ത് ($ മൂല്യം) {

        $ this-> വീതി = $ മൂല്യം;

        $ this-> ഉയരം = $ മൂല്യം;

    }

}

ഒരു ചതുരം തുല്യ വീതിയും ഉയരവുമുള്ള ഒരു ദീർഘചതുരമാണ്, മുമ്പത്തെ ഉദാഹരണത്തിലെന്നപോലെ വിചിത്രമായ ഒരു നടപ്പാക്കൽ ഞങ്ങൾക്ക് ചെയ്യാനാകും. ഉയരവും വീതിയും സജ്ജീകരിക്കുന്നതിന് ഞങ്ങൾക്ക് രണ്ട് സെറ്ററുകളെയും അസാധുവാക്കാം. എന്നാൽ ഇത് ക്ലയന്റ് കോഡിനെ എങ്ങനെ ബാധിക്കും?

ക്ലാസ് ക്ലയൻറ് {

    ഫംഗ്ഷൻ ഏരിയ വെരിഫയർ (ദീർഘചതുരം $ r) {

        $ r-> സെറ്റ്വിഡ്ത്ത് (5);

        $ r-> setHeight (4);

        if ($ r-> ഏരിയ ()! = 20) {

            പുതിയ ഒഴിവാക്കൽ എറിയുക ('മോശം പ്രദേശം!');

        }

        സത്യമായി മടങ്ങുക;

    }

}

ദീർഘചതുരത്തിന്റെ വിസ്തീർണ്ണം പരിശോധിച്ച് തെറ്റാണെങ്കിൽ ഒരു ഒഴിവാക്കൽ എറിയുന്ന ഒരു ക്ലയന്റ് ക്ലാസ് ഉണ്ടായിരിക്കുന്നത് സങ്കൽപ്പിക്കാവുന്ന കാര്യമാണ്.

ഫംഗ്ഷൻ ഏരിയ () {

    return $ this-> വീതി * $ this-> ഉയരം;

}

പ്രദേശം നൽകുന്നതിന് മുകളിലുള്ള രീതി ഞങ്ങളുടെ ദീർഘചതുരം ക്ലാസിലേക്ക് ഞങ്ങൾ ചേർത്തു.

ക്ലാസ് LspTest PHPUnit_Framework_TestCase s വിപുലീകരിക്കുന്നു

    ടെസ്റ്റ് ടെസ്റ്റ് ദീർഘചതുരം ഏരിയ () {

        $ r = പുതിയ ദീർഘചതുരം ();

        $ c = പുതിയ ക്ലയൻറ് ();

        $ this-> assertTrue ($ c-> ഏരിയ വെരിഫയർ ($ r));

    }

}

ഏരിയ ചെക്കറിലേക്കും ടെസ്റ്റ് പാസുകളിലേക്കും ഒരു ശൂന്യമായ ദീർഘചതുരം ഒബ്‌ജക്റ്റ് അയച്ചുകൊണ്ട് ഞങ്ങൾ ഒരു ലളിതമായ ടെസ്റ്റ് സൃഷ്‌ടിച്ചു. നമ്മുടെ ക്ലാസ് സ്ക്വയർ ആണെങ്കിൽ defiശരിയായി നിരത്തി, അത് ക്ലയന്റ് ഏരിയയിലേക്ക് അയയ്‌ക്കുന്നത് വെരിഫയർ() അതിന്റെ പ്രവർത്തനക്ഷമതയെ തകർക്കരുത്. എല്ലാത്തിനുമുപരി, എല്ലാ ഗണിതശാസ്ത്ര അർത്ഥത്തിലും ഒരു ചതുരം ഒരു ദീർഘചതുരമാണ്. പക്ഷെ അത് നമ്മുടെ ക്ലാസ്സാണോ?

testSquareArea () function

    $ r = പുതിയ സ്ക്വയർ ();

    $ c = പുതിയ ക്ലയൻറ് ();

    $ this-> assertTrue ($ c-> ഏരിയ വെരിഫയർ ($ r));

}

അതിനാൽ, ഞങ്ങളുടെ സ്ക്വയർ ക്ലാസ് ഒരു ദീർഘചതുരം അല്ല. ഇത് ജ്യാമിതിയുടെ നിയമങ്ങളെ ലംഘിക്കുന്നു. ഇത് പരാജയപ്പെടുകയും ലിസ്കോവ് സബ്സ്റ്റിറ്റ്യൂഷൻ തത്വം ലംഘിക്കുകയും ചെയ്യുന്നു.

Ercole Palmeri

ഇന്നൊവേഷൻ വാർത്താക്കുറിപ്പ്
നവീകരണത്തെക്കുറിച്ചുള്ള ഏറ്റവും പ്രധാനപ്പെട്ട വാർത്തകൾ നഷ്ടപ്പെടുത്തരുത്. ഇമെയിൽ വഴി അവ സ്വീകരിക്കുന്നതിന് സൈൻ അപ്പ് ചെയ്യുക.

സമീപകാല ലേഖനങ്ങൾ

സംരക്ഷണം മുതൽ പ്രതികരണം, വീണ്ടെടുക്കൽ വരെ ransomware-നുള്ള ഏറ്റവും സമഗ്രമായ പിന്തുണ വീം അവതരിപ്പിക്കുന്നു

വീമിൻ്റെ Coveware സൈബർ കൊള്ളയടിക്കൽ സംഭവ പ്രതികരണ സേവനങ്ങൾ നൽകുന്നത് തുടരും. Coveware ഫോറൻസിക്‌സും പ്രതിവിധി കഴിവുകളും വാഗ്ദാനം ചെയ്യും…

ഏപ്രിൽ 29 ഏപ്രിൽ

ഹരിതവും ഡിജിറ്റൽ വിപ്ലവവും: എങ്ങനെ പ്രവചനാത്മകമായ പരിപാലനം എണ്ണ, വാതക വ്യവസായത്തെ പരിവർത്തനം ചെയ്യുന്നു

പ്ലാൻ്റ് മാനേജ്‌മെൻ്റിന് നൂതനവും സജീവവുമായ സമീപനത്തിലൂടെ പ്രവചനാത്മക പരിപാലനം എണ്ണ, വാതക മേഖലയിൽ വിപ്ലവം സൃഷ്ടിക്കുന്നു.

ഏപ്രിൽ 29 ഏപ്രിൽ

യുകെ ആൻ്റിട്രസ്റ്റ് റെഗുലേറ്റർ GenAI-യെ കുറിച്ച് ബിഗ്‌ടെക് അലാറം ഉയർത്തുന്നു

ആർട്ടിഫിഷ്യൽ ഇൻ്റലിജൻസ് വിപണിയിൽ ബിഗ് ടെക്കിൻ്റെ പെരുമാറ്റത്തെക്കുറിച്ച് യുകെ സിഎംഎ മുന്നറിയിപ്പ് നൽകിയിട്ടുണ്ട്. അവിടെ…

ഏപ്രിൽ 29 ഏപ്രിൽ

കാസ ഗ്രീൻ: ഇറ്റലിയിൽ സുസ്ഥിരമായ ഭാവിക്കായി ഊർജ്ജ വിപ്ലവം

കെട്ടിടങ്ങളുടെ ഊർജ്ജ കാര്യക്ഷമത വർദ്ധിപ്പിക്കുന്നതിനായി യൂറോപ്യൻ യൂണിയൻ രൂപീകരിച്ച "ഗ്രീൻ ഹൗസ്" ഡിക്രി അതിൻ്റെ നിയമനിർമ്മാണ പ്രക്രിയ അവസാനിപ്പിച്ചു...

ഏപ്രിൽ 29 ഏപ്രിൽ

നിങ്ങളുടെ ഭാഷയിൽ ഇന്നൊവേഷൻ വായിക്കുക

ഇന്നൊവേഷൻ വാർത്താക്കുറിപ്പ്
നവീകരണത്തെക്കുറിച്ചുള്ള ഏറ്റവും പ്രധാനപ്പെട്ട വാർത്തകൾ നഷ്ടപ്പെടുത്തരുത്. ഇമെയിൽ വഴി അവ സ്വീകരിക്കുന്നതിന് സൈൻ അപ്പ് ചെയ്യുക.

പിന്തുടരുക ഞങ്ങളെ

ടാഗ്