, fast: del 2 - åbne eller lukkede princip,,,,, 23,,,,,,,,, 14,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet fast principles.solid: del 1 - det fælles ansvar principlesolid: del 3 - liskov substitution & grænseflade adskillelse principper, fælles ansvar (srp), åbne eller lukkede (ocp), liskov er substitution, grænseflade, adskillelse og afhængighed inversion.fem adræt principper, som skal lede dig, hver gang du skal skrive koden.,, definition, software - enheder (klasser, moduler, funktioner osv.) bør være åbent for udvidelse, men lukket for ændring,.,,, det er åbne eller lukkede princip, ofp, kort sagt, krediteres bertrand mayer, en fransk programmør, som først blev offentliggjort i sin bog n objekt orienterede software opførelse i 1988. princippet er steget i popularitet i begyndelsen af 2000 'erne, da det blev et af de faste principper, der er fastlagt af robert c. martin i hans bog fleksibel udvikling af software, principper, mønstre og - praksis og senere offentliggjort på ny i c -udgave af bog adræt principper, mønstre og praksis i c #.,, hvad vi taler om.der er til at udforme vores moduler fag og funktioner på en sådan måde, at det, når en ny funktion er nødvendige, bør vi ikke ændre vores eksisterende kodeks, men snarere at skrive ny kode, der skal anvendes af de eksisterende regler.det lyder lidt mærkeligt, især hvis vi arbejder i sprog som java, c, c + +, eller c #, når det gælder ikke kun for kildekoden i sig selv, men til binære også.vi ønsker at skabe nye egenskaber på en måde, der ikke vil kræve os til at omlægge eksisterende binaries, executables eller dlls.,, ofp i fast forbindelse, som vi fremskridt med disse tutorials, kan vi sætte hvert nyt princip i forbindelse med den allerede drøftet.vi har allerede drøftet det fælles ansvar (srp), som erklærede, at et modul kun skal have en grund til at ændre.hvis vi tænker på ofp og srp, kan vi konstatere, at de supplerer hinanden.kode, der specifikt er konstrueret med srp i betragtning, vil være tæt på ofp principper eller let at få landet til at respektere disse principper.når vi har koden, der er nogen grund til at ændre, indførelse af et nyt element, vil skabe en anden grund til at ændre.så både srp og ofp ville blive krænket.på samme måde, hvis vi har en kode, der vil ændre sig, når dets hovedfunktion ændringer og bør forblive uændret, når et nyt element er tilføjet, således at ofp, først og fremmest vil respektere srp., betyder dette ikke, at srp altid fører til ofp eller omvendt, men i de fleste tilfælde, hvis en af dem er overholdt, den anden er ganske enkel. den indlysende eksempel ofp krænkelse, udelukkende ud fra en teknisk synsvinkel, åbne eller lukkede princip er meget enkel.en simpel forbindelse mellem to klasser, som den under krænker ofp.,,,,,,, bruger, klasse bruger, logik, klasse direkte.hvis vi skal gennemføre en anden logik, klasse på en måde, der vil give os mulighed for at anvende både den nuværende og nye, eksisterende logik, klasse skal ændres., bruger, er direkte forbundet med gennemførelsen af logik, der er ingen måde for os at tilvejebringe en ny logik, uden at det berører de nuværende.og når vi taler om statisk skrevet sprog, det er meget muligt, at de, der bruger, klasse vil også kræve ændringer.hvis vi taler om udarbejdet sprog, er helt sikkert både, bruger, eksekverbar og logik, eksekverbar eller dynamisk bibliotek vil kræve en omarbejdelse af dette katalog og omskoling til vores kunder, en proces, som vi ønsker at undgå, når det er muligt,.,, vis mig den kode, baseret på afsnit ovenfor, kan man udlede, at enhver klasse direkte ved hjælp af en anden klasse ville faktisk være åbne eller lukkede princip.og det er rigtigt, strengt taget.jeg fandt det meget interessant at finde grænserne, det øjeblik, når du trækker grænsen og beslutte, at det er mere vanskeligt at overholde ofp end ændre eksisterende kodeks eller den arkitektoniske omkostninger ikke retfærdiggøre udgifterne til at ændre eksisterende kodeks.,, lad os sige, at vi ønsker at skrive en klasse, der kan skabe fremskridt i procent for en sag, som er overført via vores anmodning.vi har to vigtigste klasser, et fremskridt, og en sag, og jeg kan forestille mig, at vi vil bruge dem som i nedenstående prøvning.,, funktion testitcangettheprogressofafileasapercent() {$file = nye file(). $fil - > længde = 200 $fil - > sendte = 100 $fremskridt = nye fremskridt ($fil); $- > assertequals (50 $fremskridt - > getaspercent())}, i denne test, vi bruger, fremskridt.vi ønsker at opnå en værdi som en procent, uafhængigt af de egentlige fil størrelse.vi bruger, en fil, som kilde til oplysninger om vores fremskridt.en fil, har en længde på bytes og et område kaldet, sendte, der repræsenterer den mængde oplysninger, der sendes til en gang at downloade.vi er ligeglade med, hvordan disse værdier er ajourført i ansøgningen.vi kan gå ud fra, at det er en magisk logik gør det for os, så vi kan sætte dem i en test, udtrykkeligt.,, klasse fil (offentlige $længde; offentlige $sendte;},,, fil, klasse er bare en simpel data genstand, der indeholder to områder.naturligvis i det virkelige liv, vil sandsynligvis indeholde andre oplysninger og adfærd, ligesom filnavn, vej, relative flyvevej, løbende fortegnelse, type, tilladelser og så videre.,, klasse fremskridt (private $fil funktion __construct (file $fil) ($- > file = $fil} funktion getaspercent() {tilbage $- > fil - > sendte * 100 $- > fil - > længde;}}, fremskridt, er simpelthen en klasse under en fil i den pågældende.af hensyn til klarheden, vi bestemt type variabel i entreprenørens parametre.der er en nyttig metode til udvikling, getaspercent(),, som vil tage de værdier, der sendes, og længde fra fil, og omdanne dem til en procent.simpelt, og det fungerer.,, afprøvning, startede i 5:39 pm...phpunit 3.7.28 af sebastian bergmann..: 15 - hukommelse: 2.50mb ok (1 test 1 påstand), denne kode synes at være ret, men det strider mod det åbne eller lukkede princip.men hvorfor?og hvordan?,, skiftende krav, for hver ansøgning, der forventes at udvikle sig i tide får brug for nye elementer.et nyt element for vores anvendelse kunne være, at der strømmer til musik, i stedet for bare at downloade filer., fil, er længden er repræsenteret i bytes, musikken er varighed i sekunder.vi ønsker at tilbyde et pænt fremskridt bar vores lyttere, men vi kan genbruge, vi allerede har?- nej, det kan vi ikke.de fremskridt, der er sket, er forpligtet til at indgive,.det forstår kun filer, selv om den kan anvendes til musik indhold også.men for at gøre det er vi nødt til at ændre det, er vi nødt til at gøre fremskridt, kender til musik, og fil.hvis vores design ville respektere ofp, behøvede vi ikke at røre ved, fil eller fremskridt.vi kunne bare genbruge eksisterende, fremskridt og anvende det til musik,.,, opløsning 1: drage fordel af den dynamiske karakter af folkesundhedsprogrammet, dynamisk skrevet sprog har fordele af, at de forskellige typer af objekter i runtime.dette giver os mulighed for at fjerne typehint fra fremskridt, konstruktøren og adfærdskodeksen vil stadig arbejde.,, klasse fremskridt (private $fil funktion __construct ($fil) ($- > file = $fil} funktion getaspercent() {tilbage $- > fil - > sendte * 100 $- > fil - > længde), og nu kan vi gøre fremskridt.og jeg mener bogstaveligt talt noget:,, klasse musik (offentlige $længde; offentlige $sendte; offentlige $kunstner, offentlige $album, offentlige $releasedate; funktion getalbumcoverfile() {tilbage "billeder /omfatter /«.$- > kunstner. "/«.$- > album. ". men heller ikke dér er menneskene sikre "), og et, musik, klasse som den ovenfor, fint.kan vi teste det let med en lignende test, fil,.,, funktion testitcangettheprogressofamusicstreamasapercent() {$musik = nye music(). $musik - > længde = 200 $musik - > sendte = 100 $fremskridt = nye fremskridt ($musik); $- > assertequals (50 $fremskridt - > getaspercent())},, så alle målbare indhold kan anvendes sammen med fremskridt, klasse.måske skulle vi give udtryk for dette i kode, ved at ændre den variable navn:,, klasse fremskridt (private $measurablecontent; funktion __construct ($measurablecontent) ($- > measurablecontent = $measurablecontent;} funktion getaspercent() {tilbage $- > measurablecontent - > sendte * 100 $denne - > measurablecontent - > længde;}}, godt, men vi har et stort problem med denne tilgang.da vi havde, fil, angivet som en typehint, vi var positive om, hvad vores klasse kan klare.det var klart, og hvis der kom noget i en god fejl har fortalt os så, argument 1 gik til fremskridt: __construct() skal være et tilfælde af dokumentation, f.eks. musik,.,, men uden typehint, må vi stole på, at uanset hvad i vil have to offentlige variabler af nogle nøjagtige navne som "længde" og "sendt".ellers vil vi have nægtet arv.,, nægtede arv: en klasse, der har forrang for en metode, en base klasse på en sådan måde, at kontrakten på grundlag af klasse ikke er overholdt af de afledte klasse.- kilde wikipedia.,,, det er en af de kode lugter, præsenteres mere detaljeret i påvisning af kode lugter præmie.kort sagt, vi ønsker ikke at ende prøver at ringe metoder eller adgang områder om genstande, som ikke er i overensstemmelse med vores kontrakt.da vi havde en typehint blev kontrakten, der er fastsat af det.markerne og metoder til den fil, klasse.nu, hvor vi har noget, vi kan sende i alt, selv en kæde, og at det ville resultere i en grim fejl.,, funktion testitfailswithaparameterthatdoesnotrespecttheimplicitcontract() {$fremskridt = nye fremskridt ('some klynge); $- > assertequals (50 $fremskridt - > getaspercent())}, en test, som denne, hvor vi sender en simpel snor, vil udarbejde en nægtede arv:,, forsøger at få ejendom af ikke - objekt, og resultatet er det samme i begge tilfælde, dvs. den kode knækker, den første udarbejdet et godt budskab.det er imidlertid meget uklart.der er ingen chance for at vide, hvad den variable er - en snor i vores tilfælde - og det blev så for og ikke fundet.det er vanskeligt at ser og til at løse problemet.en programmør skal åbne den, fremskridt, klasse og læse og forstå den.den kontrakt, i dette tilfælde, hvor vi ikke udtrykkeligt angive typehint er defineret af opførsel af fremskridt.det er en implicit kontrakt, kun kendt til fremskridt.i vort eksempel er det defineret af adgang til de to områder, der sendes, og længde i, getaspercent() metode.i virkeligheden den implicitte aftale kan være meget kompliceret og vanskeligt ved at finde ud af, jeg leder efter et par sekunder i klassen. denne løsning kan kun anbefales, hvis ingen af de andre forslag under let kan gennemføres, eller hvis de vil forårsage alvorlige arkitektoniske ændringer, der ikke begrunder indsatsen.,, opløsning 2: anvendelse strategien design mønster, det er den mest almindelige og nok den mest hensigtsmæssige løsning med hensyn til ofp.det er en enkel og effektiv.,,,,,,, at strategien - blot indfører brugen af en grænseflade.en grænseflade, er en særlig type enhed i objekt orienteret planlægning (nu), som fastlægger en kontrakt mellem en klient og en server klasse.begge klasser vil overholde aftalen for at sikre, at de forventede adfærd.der kan være flere, ikke - forretningsmæssigt forbundne, server klasser, at overholde de samme kontrakt, således at være i stand til at tjene den samme kunde klasse.,, grænseflade målelige {funktion getlength(); funktion getsent();}, i en grænseflade, vi kan definere kun opførsel.det er derfor, i stedet for direkte ved hjælp af offentlige variabler, bliver vi nødt til at overveje at bruge getters og montører.tilpasning af andre klasser ikke vil være vanskeligt på dette punkt.vores ide kan gøre de fleste jobs.,, funktion testitcangettheprogressofafileasapercent() {$file = nye file(). $fil - > setlength (200); $fil - > setsent (100); $fremskridt = nye fremskridt ($fil); $- > assertequals (50 $fremskridt - > getaspercent())}, som sædvanlig, begynder vi med vores prøver.vi skal bruge maskinsættere at fastsætte værdier.hvis det anses for påkrævet, disse maskinsættere kan også defineres i, målelige, grænseflade.men pas på, hvad du har der.denne grænseflade definerer kontrakten mellem klient klasse, fremskridt, og de forskellige server klasser, fil og musik.gør fremskridt, er det nødvendigt at fastsætte værdier?- sikkert ikke.så er det usandsynligt, at der vil være behov for omgvelserne defineres i grænseflade.også, hvis de ville definere maskinsættere der, ville du tvinge alle - klasser for at gennemføre omgvelserne.for nogle af dem, kan det være logisk at have maskinsættere, men andre kan opføre sig helt anderledes.hvad nu, hvis vi ønsker at bruge vores fremskridt, klasse viser temperaturen af vores ovn?det, oventemperature, klasse kan indledes med værdierne i den pågældende eller indhente oplysninger fra en tredje klasse.hvem ved?for omgvelserne i den klasse ville være mærkeligt,.,, klasse fil gennemfører målelige (private $længde; private $sendte; offentlige $filnavn, offentlige $ejerens funktion setlength ($længde) {$- > længde = $længde;} funktion getlength() {tilbage $- > længde.} funktion setsent ($) {$- > sendte = $sendte;} funktion getsent() {tilbage $- > sendte;} funktion getrelativepath() {tilbage dirname ($- > filnavn)} funktion getfullpath() {tilbage realpath ($- > getrelativepath());}},,, fil, klasse er ændret en smule for at imødekomme de ovennævnte krav.det nu gennemfører, målelige, grænseflader og montører og getters for områder, vi er interesserede i.musik, er meget ens, du kan kontrollere indholdet i den vedlagte kildekode.vi er næsten færdige.,, klasse fremskridt (private $measurablecontent; funktion __construct (målelige $measurablecontent) ($- > measurablecontent = $measurablecontent;} funktion getaspercent() {tilbage $- > measurablecontent - > getsent() * 100 $- > measurablecontent - > getlength();}}, fremskridt, også har brug for en lille opdatering.nu kan vi fastsætte en type ved hjælp af typehinting, entreprenøren.den forventede type er målbare.nu har vi en udtrykkelig aftale.fremskridt, kan være sikker på at de tilgængelige metoder, altid vil være til stede, fordi de er defineret i, målelige, grænseflade., fil, og musik, kan også være sikker på, at de kan levere alt, hvad der er behov for fremskridt, ved at gennemføre alle de metoder, den grænseflade, et krav, når en gruppe gennemfører en grænseflade, dette design mønster er forklaret i detaljer i den smidige former for design., en bemærkning om grænseflade navngivning, folk har tendens til at navn grænseflader med kapital, jeg foran dem, eller med ordet "grænseflade", der er knyttet til sidst, som ifile, eller, fileinterface,.det er en gammeldags notat, der er indført af visse forældede standarder.vi er så meget over den ungarske notater eller behovet for at præcisere arten af en variabel eller objekt i sit navn, for at lette identifikation.ides identificere noget i et splitsekund for os.dette giver os mulighed for at koncentrere sig om, hvad vi egentlig ønsker at abstrakt.,, grænseflader hører til deres kunder.- ja.når du vil opkalde en grænseflade, du skal tænke på kunden, og glemme alt om gennemførelsen.når vi opkaldt vores interface målelige gjorde vi så tænke på fremskridt.hvis jeg ville være et fremskridt, hvad jeg har brug for at være i stand til at give den procent?svaret er enkelt, noget vi kan måle.deraf navnet målelige.en anden grund er, at gennemførelsen kan være fra forskellige områder.i vores tilfælde er der filer og musik.men vi kan godt genbrug vores fremskridt i en væddeløbs - simulator.i det tilfælde, de målte timer ville være hastighed, brændstof osv. er det ikke hyggeligt?,, opløsning 3: modellen metode design mønster, model metode design mønster er meget lig den strategi, men i stedet for en grænseflade, der bruger en abstrakt klasse.det anbefales at anvende en skabelon metode mønster, når vi har en klient specifikke for anvendelsen, med reduceret genbrugelighed og, når serveren klasser har fælles adfærd.,,,,,, det bestemt mønster er nærmere beskrevet i den smidige former for design.,, et højere niveau for, hvordan er alt dette, der påvirker vores høje arkitektur?,,,,,, hvis billedet ovenfor udgør det nuværende arkitektur af vores anmodning, at tilføje et nyt modul med fem nye klasser (blå) vil påvirke vores design i en moderat (røde klasse).,,,,,, i de fleste systemer, kan man ikke forvente, absolut ingen indvirkning på den eksisterende kodeks når nye klasser er indført.men at åbne eller lukkede princip vil betyde en betydelig reduktion af de kurser og moduler, der kræver konstant ændrer sig., som med ethvert andet princip synes ikke om alt fra før.hvis du gør det, ender du med en grænseflade til timerne.en sådan udformning, vil være svært at opretholde og forstå.normalt er den sikreste vej er at overveje de muligheder, og hvis du kan afgøre, om der vil være andre typer servere klasser.man kan let forestille os et nyt element, eller du kan finde en på projektets efterslæb, der vil føre til en server klasse.i disse tilfælde, tilføjer den grænseflade, fra begyndelsen.hvis du ikke kan bestemme, eller hvis de er usikker - for det meste - blot udelade den.lad den næste programmør, eller måske endda selv, at tilføje den grænseflade, når du har brug for en anden gennemførelse.,, sidste tanker, hvis de følger deres disciplin og tilføje grænseflader, så snart en anden server, der er behov for ændringer vil være få og let.husk, hvis kode nødvendige ændringer, når der er en stor mulighed, vil det være nødvendigt at ændre igen.da denne mulighed bliver til virkelighed, ofp vil spare dig en masse tid og indsats.,, jeg takker dem for at læse.
fast: del 2
Previous:fast: del 3