makala

Fungua / Imefungwa, kulingana na kanuni SOLID

Vyombo vya programu (madarasa, moduli, kazi, n.k.) vinapaswa kuwa wazi kwa upanuzi, lakini imefungwa kwa kuhariri.

Kubuni programu: moduli, madarasa na kazi kwa njia ambayo wakati utendaji mpya unahitajika, hatupaswi kurekebisha nambari iliyopo lakini badala ya kuandika nambari mpya ambayo itatumiwa na nambari iliyopo. Hii inaweza kuonekana kuwa ya kushangaza, haswa na lugha kama Java, C, C ++ au C # ambapo inatumika sio tu kwa nambari ya chanzo yenyewe lakini pia kwa binary. Tunataka kuunda huduma mpya kwa njia ambazo hazihitaji ugawaji wa binaries zilizopo, zinazoweza kutekelezwa, au DLL.
OCP katika muktadha SOLID

 

SRP inayosaidia na OCP

Tumeona tayari kanuni ya SRP ya Uwajibikaji Moja ambayo inasema kwamba moduli inapaswa kuwa na sababu moja tu ya kubadilika. Kanuni za OCP na SRP ni za ziada. Nambari iliyoundwa kulingana na kanuni ya SRP pia itaheshimu kanuni za OCP. Wakati tunayo nambari ambayo ina sababu moja tu ya kubadilisha, kuanzisha huduma mpya kutaunda sababu ya pili ya mabadiliko hayo. Kwa hivyo wote SRP na OCP wangevunjwa. Vivyo hivyo, ikiwa tunayo nambari ambayo inapaswa kubadilika tu wakati kazi yake kuu inabadilika na inapaswa kubaki bila kubadilika wakati utendaji mpya umeongezwa, na hivyo kuheshimu OCP, itaheshimu SRP pia.
Hii haimaanishi kuwa SRP kila wakati inaongoza kwa OCP au kinyume chake, lakini katika hali nyingi ikiwa mmoja wao anazingatiwa, kufikia ya pili ni rahisi sana.

 

Mfano wa ukiukaji wa kanuni ya OCP

Kwa mtazamo wa kiufundi, Kanuni ya Kufungua / Kufungwa ni rahisi sana. Urafiki rahisi kati ya madarasa mawili, kama hii hapa chini, unakiuka kanuni ya OCP.

Darasa la Mtumiaji hutumia darasa la Mantiki moja kwa moja. Ikiwa tunahitaji kutekeleza darasa la pili la Logic kwa njia ambayo inaruhusu sisi kutumia ya sasa na mpya, darasa la Logic lililopo litahitaji kubadilishwa. Mtumiaji amefungwa moja kwa moja na utekelezaji wa mantiki, hakuna njia kwetu kutoa mantiki mpya bila kuathiri ile ya sasa. Na tunapozungumza juu ya lugha zilizochapishwa kwa kitakwimu, darasa la Mtumiaji linaweza pia kuhitaji mabadiliko pia. Ikiwa tutazungumza juu ya lugha zilizokusanywa, hakika Mtumiaji anayetekelezwa na Logic inayoweza kutekelezwa au maktaba yenye nguvu itahitaji malipo na utoaji, ikiwezekana kuepusha inapowezekana.

Kwa kurejelea mpango uliopita, tunaweza kugundua kuwa darasa lolote ambalo hutumia darasa lingine moja kwa moja, linaweza kusababisha ukiukaji wa kanuni ya wazi / iliyofungwa. 
Wacha tufikirie tunataka kuandika darasa linaloweza kutoa maendeleo "kwa asilimia" ya faili iliyopakuliwa, kupitia programu yetu. Tutakuwa na darasa kuu mbili, Maendeleo na Faili, na nadhani tungependa kuzitumia kama ifuatavyo:

 

jaribio la kaziItCanGetTheProgressOfAFileAsAPercent () {
     $ file = faili mpya ();
     $ file-> urefu = 200;
     $ file-> imetumwa = 100;
     Maendeleo ya $ = Maendeleo mpya (faili ya $);
     $ this-> assertEquals (50, $ maendeleo-> getAsPercent ());
}

Katika nambari hii sisi ni watumiaji wa Maendeleo. Tunataka kupata thamani kama asilimia, bila kujali saizi halisi ya faili. Tunatumia Faili kama chanzo cha habari. Faili ina urefu wa ka na uwanja unaoitwa umetumwa ambao unawakilisha kiwango cha data iliyotumwa kwa kipakua. Hatujali jinsi maadili haya yanasasishwa katika programu. Tunaweza kudhani kuna mantiki ya kichawi ambayo hutufanyia hivyo, kwa hivyo katika mtihani tunaweza kuiweka wazi.

 

Faili ya darasa {
     urefu wa $ umma;
     $ ya umma imetumwa;
}

 

Darasa la Faili ni kitu rahisi tu cha data kilicho na sehemu mbili. Kwa kweli inapaswa pia kuwa na habari na tabia zingine, kama jina la faili, njia, njia ya jamaa, saraka ya sasa, aina, ruhusa, na kadhalika.

 

Maendeleo ya darasa {

     faili ya faragha ya $;

     kazi __construct (Faili $ file) {
          $ hii-> faili = $ file;
     }

     kazi GetAsPercent () {
          kurudi $ this-> file-> sent * 100 / $ this-> file-> length;
     }

}

Maendeleo ni darasa tu linalokubali faili katika mjenzi wake. Kwa uwazi, tumetaja aina inayobadilika katika vigezo vya wajenzi. Kuna njia moja muhimu kwenye Progress, getAsPercent (), ambayo itachukua maadili na urefu uliotumwa kutoka kwa Faili na kuzigeuza kuwa asilimia. Rahisi na inafanya kazi.

Nambari hii inaonekana kuwa sahihi, hata hivyo inakiuka kanuni ya Kufungua / Kufungwa.

Lakini kwanini?

Na jinsi gani?

 

Wacha tujaribu kubadilisha mahitaji

Kila programu ya kubadilika kwa muda itahitaji huduma mpya. Kipengele kipya cha programu yetu inaweza kuwa kuruhusu utiririshaji wa muziki badala ya kupakua faili tu. Urefu wa faili unawakilishwa kwa ka, muda wa muziki kwa sekunde. Tunataka kutoa mwambaa wa maendeleo kwa wasikilizaji wetu, lakini tunaweza kutumia tena darasa lililoandikwa hapo juu?

Hapana hatuwezi. Maendeleo yetu yamefungwa kwenye Faili. Inaweza kusimamia tu habari ya faili, ingawa inaweza pia kutumika kwa yaliyomo kwenye muziki. Lakini ili kufanya hivyo lazima tuirekebishe, tunapaswa kufanya Maendeleo kujua muziki na faili. Ikiwa muundo wetu ulizingatia OCP, hatutahitaji kugusa Faili au Maendeleo. Tunaweza tu kutumia maendeleo yaliyopo na kuitumia kwenye muziki.

 

Jarida la uvumbuzi
Usikose habari muhimu zaidi kuhusu uvumbuzi. Jisajili ili kuzipokea kwa barua pepe.

Suluhisho linalowezekana

Lugha zilizochapishwa kwa nguvu zina faida ya kusimamia aina za vitu kwa wakati wa kukimbia. Hii inatuwezesha kuondoa aina ya kidokezo kutoka kwa mjenzi wa Maendeleo na nambari itaendelea kufanya kazi.

Maendeleo ya darasa {

     faili ya faragha ya $;

     fanya kazi __construct ($ file) {
         $ hii-> faili = $ file;
     }

    kazi GetAsPercent () {
         kurudi $ this-> file-> sent * 100 / $ this-> file-> length;
     }

}

Sasa tunaweza kuzindua chochote katika Maendeleo. Na kwa chochote, ninamaanisha kitu chochote halisi:

Muziki wa darasa {

urefu wa $ umma;
$ ya umma imetumwa;

msanii $ umma;
albamu ya umma;
kutolewa $ ummaTarehe;

kazi pataAlbumCoverFile () {
rudisha 'Picha / Vifuniko /'. $ this-> msanii. '/'. $ hii-> albamu. '.png';
}
}

Na darasa la Muziki kama hili hapo juu litafanya kazi kikamilifu. Tunaweza kuijaribu kwa urahisi na mtihani sawa na Faili.
jaribio la kaziItCanGetTheProgressOfAMusicStreamAsAPercent () {
$ muziki = Muziki mpya ();
$ muziki-> urefu = 200;
$ muziki-> imetumwa = 100;

Maendeleo ya $ = Maendeleo mpya ($ muziki);

$ this-> assertEquals (50, $ maendeleo-> getAsPercent ());
}

Kwa hivyo kimsingi yaliyomo ya kupimika yanaweza kutumiwa na darasa la Maendeleo. Labda tunapaswa kuelezea kwa nambari kwa kubadilisha pia jina linalobadilika:

Maendeleo ya darasa {

$ binafsi inayoweza kupimika;

fanya kazi __construct ($ measurableContent) {
$ hii-> kupimikaContent = $ kupimikaContent;
}

kazi GetAsPercent () {
rudisha $ hii-> kupimikaContent-> imetumwa * 100 / $ hii-> kipimo kinachoweza kupimwa-> urefu;
}

}

Wakati tunabainisha faili kama dokezo, tulikuwa na matumaini juu ya kile darasa letu linaweza kushughulikia. Ilikuwa wazi na ikiwa kitu kingine chochote kilikuja, kosa kubwa lingetuambia.

Una ambayo inapita njia ya darasa la msingi ili mkataba wa darasa la msingi usiheshimiwe na darasa linalotokana. 

Hatutaki kuishia kujaribu kujaribu kupiga simu au kufikia uwanja kwenye vitu ambavyo haviendani na mkataba wetu. Wakati tulikuwa na alama ya kuchapisha, mkataba ulibainishwa na hiyo. Mashamba na mbinu za darasa la Faili. Sasa kwa kuwa hatuna chochote, tunaweza kutuma chochote, hata kamba na itasababisha kosa mbaya.

Wakati matokeo ya mwisho ni sawa katika visa vyote viwili, ikimaanisha kuwa nambari huvunjika, ya kwanza ilitoa ujumbe mzuri. Hii, hata hivyo, ni giza sana. Hakuna njia ya kujua kutofautisha ni nini - kamba kwa upande wetu - na ni mali gani zilitafutwa na hazikupatikana. Ni vigumu kurekebisha na kurekebisha tatizo. Mpangaji programu lazima afungue darasa la Maendeleo, asome na aelewe. Mkataba, katika kesi hii, wakati huna kutaja kwa uwazi typehint, ni defikuharibiwa na tabia ya Maendeleo. Ni mkataba wa maana unaojulikana kwa Maendeleo pekee. Katika mfano wetu, ni defikukamilika kwa kupata sehemu hizo mbili, zilizotumwa na urefu, katika njia ya getAsPercent(). Katika maisha halisi mkataba unaodokezwa unaweza kuwa mgumu sana na mgumu kugundua kwa kutafuta tu sekunde chache darasani.

Suluhisho hili linapendekezwa tu ikiwa hakuna vidokezo vingine hapa chini vinavyoweza kutekelezwa kwa urahisi au ikiwa vingeleta mabadiliko makubwa ya usanifu ambayo hayana dhamana ya juhudi.

Ercole Palmeri

Jarida la uvumbuzi
Usikose habari muhimu zaidi kuhusu uvumbuzi. Jisajili ili kuzipokea kwa barua pepe.

Makala ya hivi karibuni

Kidhibiti cha kutokuaminika cha Uingereza kinainua kengele ya BigTech kupitia GenAI

CMA ya Uingereza imetoa onyo kuhusu tabia ya Big Tech katika soko la kijasusi bandia. Hapo...

Aprili 18 2024

Casa Green: mapinduzi ya nishati kwa mustakabali endelevu nchini Italia

Amri ya "Nyumba za Kijani", iliyoundwa na Umoja wa Ulaya ili kuongeza ufanisi wa nishati ya majengo, imehitimisha mchakato wake wa kutunga sheria na…

Aprili 18 2024

Biashara ya mtandaoni nchini Italia kwa +27% kulingana na Ripoti mpya ya Casaleggio Associati

Ripoti ya kila mwaka ya Casaleggio Associati kuhusu Biashara ya Biashara nchini Italia iliwasilishwa. Ripoti yenye kichwa "AI-Commerce: mipaka ya Biashara ya Kielektroniki yenye Akili Bandia".…

Aprili 17 2024

Wazo Bora: Bandalux inatoa Airpure®, pazia linalosafisha hewa

Matokeo ya uvumbuzi wa mara kwa mara wa kiteknolojia na kujitolea kwa mazingira na ustawi wa watu. Bandalux inatoa Airpure®, hema…

Aprili 12 2024