ഈ തത്ത്വത്തിന്റെ ആശയം ബാർബറ ലിസ്കോവ് 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
വീമിൻ്റെ Coveware സൈബർ കൊള്ളയടിക്കൽ സംഭവ പ്രതികരണ സേവനങ്ങൾ നൽകുന്നത് തുടരും. Coveware ഫോറൻസിക്സും പ്രതിവിധി കഴിവുകളും വാഗ്ദാനം ചെയ്യും…
പ്ലാൻ്റ് മാനേജ്മെൻ്റിന് നൂതനവും സജീവവുമായ സമീപനത്തിലൂടെ പ്രവചനാത്മക പരിപാലനം എണ്ണ, വാതക മേഖലയിൽ വിപ്ലവം സൃഷ്ടിക്കുന്നു.
ആർട്ടിഫിഷ്യൽ ഇൻ്റലിജൻസ് വിപണിയിൽ ബിഗ് ടെക്കിൻ്റെ പെരുമാറ്റത്തെക്കുറിച്ച് യുകെ സിഎംഎ മുന്നറിയിപ്പ് നൽകിയിട്ടുണ്ട്. അവിടെ…
കെട്ടിടങ്ങളുടെ ഊർജ്ജ കാര്യക്ഷമത വർദ്ധിപ്പിക്കുന്നതിനായി യൂറോപ്യൻ യൂണിയൻ രൂപീകരിച്ച "ഗ്രീൻ ഹൗസ്" ഡിക്രി അതിൻ്റെ നിയമനിർമ്മാണ പ്രക്രിയ അവസാനിപ്പിച്ചു...