Erthyglau

Ar agor / Ar gau, yn unol ag egwyddor SOLID

Dylai endidau meddalwedd (dosbarthiadau, modiwlau, swyddogaethau, ac ati) fod ar agor i'w hymestyn, ond ar gau i'w golygu.

Dylunio'r feddalwedd: modiwlau, dosbarthiadau a swyddogaethau yn y fath fodd fel na ddylem addasu'r cod presennol pan fydd angen ymarferoldeb newydd ond yn hytrach ysgrifennu cod newydd a fydd yn cael ei ddefnyddio gan y cod presennol. Gallai hyn swnio'n rhyfedd, yn enwedig gydag ieithoedd fel Java, C, C ++ neu C # lle mae'n berthnasol nid yn unig i'r cod ffynhonnell ei hun ond hefyd i'r deuaidd. Rydym am greu nodweddion newydd mewn ffyrdd nad oes angen ailddosbarthu binaries, gweithredadwy neu DLLs presennol.
OCP yng nghyd-destun SOLID

 

SRP cyflenwol ac OCP

Rydym eisoes wedi gweld egwyddor SRP o Gyfrifoldeb Sengl sy'n nodi y dylai modiwl fod ag un rheswm yn unig i newid. Mae egwyddorion OCP a SRP yn ategu ei gilydd. Bydd y cod a ddyluniwyd yn unol ag egwyddor SRP hefyd yn parchu egwyddorion OCP. Pan fydd gennym god sydd ag un rheswm yn unig i newid, bydd cyflwyno nodwedd newydd yn creu rheswm eilaidd dros y newid hwnnw. Felly byddai SRP ac OCP yn cael eu torri. Yn yr un modd, os oes gennym god a ddylai newid dim ond pan fydd ei brif swyddogaeth yn newid a dylai aros yn ddigyfnewid pan ychwanegir ymarferoldeb newydd, a thrwy hynny barchu'r OCP, bydd hefyd yn parchu SRP yn bennaf.
Nid yw hyn yn golygu bod SRP bob amser yn arwain at OCP neu i'r gwrthwyneb, ond yn y rhan fwyaf o achosion os glynir wrth un ohonynt, mae cyflawni'r ail yn eithaf syml.

 

Enghraifft o dorri egwyddor OCP

O safbwynt technegol yn unig, mae'r Egwyddor Agored / Caeedig yn syml iawn. Mae perthynas syml rhwng dau ddosbarth, fel yr un isod, yn torri egwyddor OCP.

Mae'r dosbarth Defnyddiwr yn defnyddio'r dosbarth Rhesymeg yn uniongyrchol. Os bydd angen i ni weithredu ail ddosbarth Rhesymeg mewn ffordd sy'n caniatáu inni ddefnyddio'r un cyfredol a'r un newydd, bydd angen newid y dosbarth Rhesymeg presennol. Mae'r defnyddiwr wedi'i glymu'n uniongyrchol â gweithrediad y rhesymeg, nid oes unrhyw ffordd inni ddarparu rhesymeg newydd heb effeithio ar yr un gyfredol. A phan fyddwn yn siarad am ieithoedd wedi'u teipio'n statig, mae'r dosbarth Defnyddiwr yn debygol iawn o fod angen addasiadau hefyd. Os ydym yn siarad am ieithoedd a luniwyd, siawns na fydd angen ailgyfuno a chyflwyno'r gweithredadwy Defnyddiwr a'r gweithredadwy Logic neu'r llyfrgell ddeinamig, er mwyn osgoi hynny pan fydd hynny'n bosibl.

Gan gyfeirio at y cynllun blaenorol, gallwn ddyfalu y gallai unrhyw ddosbarth sy'n defnyddio dosbarth arall yn uniongyrchol, arwain at dorri'r egwyddor Agored / Caeedig. 
Gadewch i ni dybio ein bod ni eisiau ysgrifennu dosbarth sy'n gallu darparu cynnydd "mewn canran" o ffeil wedi'i lawrlwytho, trwy ein cais. Bydd gennym ddau brif ddosbarth, Cynnydd a Ffeil, a thybiaf yr hoffem eu defnyddio fel a ganlyn:

 

testItCanGetTheProgressOfAFileAsAPercent () {
     $ file = Ffeil newydd ();
     $ ffeil-> hyd = 200;
     $ ffeil-> anfon = 100;
     $ progress = Cynnydd newydd ($ ffeil);
     $ this-> assertEquals (50, $ progress-> getAsPercent ());
}

Yn y cod hwn rydym yn ddefnyddwyr Cynnydd. Rydym am gael gwerth fel canran, waeth beth yw maint gwirioneddol y ffeil. Rydym yn defnyddio Ffeil fel ffynhonnell wybodaeth. Mae gan ffeil hyd mewn beitiau a maes o'r enw anfon sy'n cynrychioli faint o ddata a anfonir at y lawrlwythwr. Nid ydym yn poeni sut mae'r gwerthoedd hyn yn cael eu diweddaru yn y cais. Gallwn dybio bod rhywfaint o resymeg hudol yn gwneud hyn i ni, felly mewn prawf gallwn eu gosod yn benodol.

 

Ffeil dosbarth {
     hyd cyhoeddus $;
     anfon $ cyhoeddus;
}

 

Dim ond gwrthrych data syml sy'n cynnwys y ddau faes yw'r dosbarth Ffeil. Wrth gwrs dylai hefyd gynnwys gwybodaeth ac ymddygiadau eraill, fel enw ffeil, llwybr, llwybr cymharol, cyfeiriadur cyfredol, math, caniatâd, ac ati.

 

Cynnydd dosbarth {

     ffeil $ preifat;

     swyddogaeth __construct (Ffeil $ ffeil) {
          $ this-> file = $ ffeil;
     }

     swyddogaeth getAsPercent () {
          dychwelwch $ this-> ffeil-> anfonwyd * 100 / $ hwn-> ffeil-> hyd;
     }

}

Dosbarth yn syml sy'n derbyn ffeil yn ei lluniwr yw cynnydd. Er eglurder, rydym wedi nodi'r math newidiol ym mharamedrau'r adeiladwr. Mae un dull defnyddiol ar Gynnydd, getAsPercent (), a fydd yn cymryd y gwerthoedd a'r hyd a anfonwyd o File ac yn eu troi'n ganran. Syml ac mae'n gweithio.

Mae'n ymddangos bod y cod hwn yn gywir, ond mae'n torri'r egwyddor Agored / Caeedig.

Ond pam?

A sut?

 

Gadewch i ni geisio newid y gofynion

Bydd angen nodweddion newydd ar bob cais i esblygu dros amser. Nodwedd newydd ar gyfer ein cais fyddai caniatáu ffrydio cerddoriaeth yn lle lawrlwytho ffeiliau yn unig. Cynrychiolir hyd y ffeil mewn beitiau, hyd y gerddoriaeth mewn eiliadau. Rydym am gynnig bar cynnydd i'n gwrandawyr, ond a allwn ailddefnyddio'r dosbarth a ysgrifennwyd uchod?

Na allwn ni ddim. Mae ein dilyniant yn rhwym i Ffeil. Dim ond gwybodaeth ffeil y gall ei reoli, er y gellir ei chymhwyso i gynnwys cerddoriaeth hefyd. Ond i wneud hynny mae'n rhaid i ni ei addasu, mae'n rhaid i ni wneud Cynnydd yn gyfarwydd â'r gerddoriaeth a'r ffeiliau. Pe bai ein dyluniad yn cydymffurfio ag OCP, ni fyddai angen i ni gyffwrdd â Ffeil na Chynnydd. Gallem ailddefnyddio'r cynnydd presennol a'i gymhwyso i gerddoriaeth.

 

Cylchlythyr arloesi
Peidiwch â cholli'r newyddion pwysicaf am arloesi. Cofrestrwch i'w derbyn trwy e-bost.

Datrysiad posib

Mae gan ieithoedd wedi'u teipio'n ddeinamig y fantais o drin mathau o wrthrychau ar amser rhedeg. Mae hyn yn caniatáu inni dynnu'r argraffnod o'r adeiladwr Cynnydd a bydd y cod yn parhau i weithio.

Cynnydd dosbarth {

     ffeil $ preifat;

     swyddogaeth __construct ($ ffeil) {
         $ this-> file = $ ffeil;
     }

    swyddogaeth getAsPercent () {
         dychwelwch $ this-> ffeil-> anfonwyd * 100 / $ hwn-> ffeil-> hyd;
     }

}

Bellach gallwn lansio unrhyw beth yn Progress. A chan unrhyw beth, rwy'n golygu unrhyw beth yn llythrennol:

Cerddoriaeth dosbarth {

hyd cyhoeddus $;
anfon $ cyhoeddus;

artist $ cyhoeddus;
albwm $ cyhoeddus;
$ rhyddhau cyhoeddus;

swyddogaeth getAlbumCoverFile () {
dychwelyd 'Delweddau / Gorchuddion /'. $ hwn-> arlunydd. '/'. $ hwn-> albwm. '.png';
}
}

A bydd y dosbarth Cerdd fel yr un uchod yn gweithio'n berffaith. Gallwn ei brofi yn hawdd gyda phrawf tebyg iawn i File.
testItCanGetTheProgressOfAMusicStreamAsAPercent () {
$ cerddoriaeth = Cerddoriaeth newydd ();
$ cerddoriaeth-> hyd = 200;
$ cerddoriaeth-> anfon = 100;

$ cynnydd = Cynnydd newydd ($ cerddoriaeth);

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

Felly yn y bôn gellir defnyddio unrhyw gynnwys mesuradwy gyda'r dosbarth Cynnydd. Efallai y dylem ei fynegi mewn cod trwy newid yr enw newidyn hefyd:

Cynnydd dosbarth {

preifat $ mesuradwyContent;

swyddogaeth __construct ($ mesuradwyContent) {
$ this-> mesuradwyContent = $ mesuradwyContent;
}

swyddogaeth getAsPercent () {
dychwelyd $ hwn-> mesuradwyContent-> anfon * 100 / $ hwn-> mesuradwyContent-> hyd;
}

}

Pan wnaethom nodi Ffeil fel y mathdeip, roeddem yn optimistaidd ynghylch yr hyn y gall ein dosbarth ei drin. Roedd yn eglur ac os deuai unrhyw beth arall, byddai camgymeriad mawr yn dweud wrthym.

Una dosbarth sy'n diystyru dull dosbarth sylfaenol fel nad yw'r contract dosbarth sylfaenol yn cael ei anrhydeddu gan y dosbarth deilliedig. 

Nid ydym am geisio galw dulliau na chael mynediad at feysydd ar wrthrychau nad ydynt yn cydymffurfio â'n contract. Pan gawsom ffurfdeip, nodwyd y contract ganddo. Meysydd a dulliau'r dosbarth Ffeiliau. Nawr nad oes gennym unrhyw beth, gallwn anfon unrhyw beth, hyd yn oed llinyn a byddai'n arwain at wall gwael.

Er bod y canlyniad terfynol yr un peth yn y ddau achos, sy'n golygu bod y cod yn torri, cynhyrchodd y cyntaf neges braf. Mae hyn, fodd bynnag, yn dywyll iawn. Nid oes unrhyw ffordd i wybod beth yw'r newidyn - llinyn yn ein hachos ni - a pha eiddo y chwiliwyd amdanynt ac na ddaethpwyd o hyd iddynt. Mae'n anodd dadfygio a thrwsio'r broblem. Rhaid i raglennydd agor y dosbarth Cynnydd, ei ddarllen a'i ddeall. Mae'r contract, yn yr achos hwn, pan na fyddwch yn nodi'r math-hint yn benodol, yw definychu gan ymddygiad Cynnydd. Mae'n gontract ymhlyg sy'n hysbys i Progress yn unig. Yn ein hesiampl ni, y mae defiwedi'i gyrchu trwy gyrchu'r ddau faes, anfonwyd a hyd, yn y dull getAsPercent(). Mewn bywyd go iawn gall y contract ymhlyg fod yn gymhleth iawn ac yn anodd ei ddarganfod trwy chwilio am ychydig eiliadau yn y dosbarth.

Argymhellir yr ateb hwn dim ond os na ellir gweithredu unrhyw un o'r awgrymiadau eraill isod yn hawdd neu pe byddent yn achosi newidiadau pensaernïol difrifol nad ydynt yn gwarantu'r ymdrech.

Ercole Palmeri

Cylchlythyr arloesi
Peidiwch â cholli'r newyddion pwysicaf am arloesi. Cofrestrwch i'w derbyn trwy e-bost.

Erthyglau Diweddar

Mae Veeam yn cynnwys y gefnogaeth fwyaf cynhwysfawr ar gyfer ransomware, o amddiffyniad i ymateb ac adferiad

Bydd Coveware gan Veeam yn parhau i ddarparu gwasanaethau ymateb i ddigwyddiadau cribddeiliaeth seiber. Bydd Coveware yn cynnig galluoedd fforensig ac adfer…

23 2024 Ebrill

Chwyldro Gwyrdd a Digidol: Sut Mae Cynnal a Chadw Rhagfynegol yn Trawsnewid y Diwydiant Olew a Nwy

Mae gwaith cynnal a chadw rhagfynegol yn chwyldroi'r sector olew a nwy, gyda dull arloesol a rhagweithiol o reoli planhigion.…

22 2024 Ebrill

Rheoleiddiwr antitrust y DU yn codi larwm BigTech dros GenAI

Mae CMA y DU wedi cyhoeddi rhybudd am ymddygiad Big Tech yn y farchnad deallusrwydd artiffisial. Yno…

18 2024 Ebrill

Casa Green: chwyldro ynni ar gyfer dyfodol cynaliadwy yn yr Eidal

Mae'r Archddyfarniad "Achos Gwyrdd", a luniwyd gan yr Undeb Ewropeaidd i wella effeithlonrwydd ynni adeiladau, wedi dod â'i broses ddeddfwriaethol i ben gyda…

18 2024 Ebrill