hvordan skriver kode, der omfatter ændringer

, hvordan man skriver kode, der omfatter ændringer,,,,, 2,,,,,,,,,,,, 183,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, skrive koden, som er let at ændre, er den hellige gral af programmeringen.velkommen til programmering, nirvana.men det er langt mere vanskeligt i virkeligheden: kildekode er vanskelig at forstå, områder i mange retninger, kobling er irriterende, og du snart føle varme i programmeringen, for helvede.i denne forelæsning, vi vil drøfte nogle principper, metoder og idéer, der kan hjælpe dig med at skrive kode, der er let at ændre.,,,, en genstand orienterede begreber, objekt orienteret planlægning (ups) blev populær på grund af sit løfte af kode organisation og genbrug; det er mislykkedes for mig.vi har brugt oop begreber i mange år nu, men vi fortsætter til gentagne gange at gennemføre samme logik i vores projekter.undskyld, der er indført et sæt gode grundlæggende principper, der, hvis det anvendes korrekt, kan føre til bedre og renere kode., samhørighed, de ting, der hører sammen, bør holdes sammen; ellers burde være flyttet andre steder hen.det er, hvad begrebet samhørighed, henviser til.det bedste eksempel på samhørighed kan påvises med en klasse, klasse anotcohesiveclass (private $firstnumber; private $secondnumber; private $længde; private $bredde; funktion __construct ($firstnumber, $secondnumber) ($- > firstnumber = $firstnumber. $- > secondnumber = $secondnumber;} funktion setlength ($længde) {$- > længde = $længde;} funktion setheight ($højde) {$- > bredde = $højde} funktion add() {tilbage $- > firstnumber + $- > secondnumber;} funktion subtract() {tilbage $- > firstnumber - $- > secondnumber;} funktion area() {tilbage $- > længde * $- > bredde;}}, dette eksempel definerer en klasse med områder, der represent antal og størrelse.disse egenskaber, bedømt ved deres navne, ikke hører sammen.så har vi to metoder, add(), og substract(),, der arbejder på kun to antal variabler.vi har en yderligere, area(), metode, der fungerer på, længde og bredde, områder. det er indlysende, at denne klasse er ansvarlige for de forskellige grupper af oplysninger.det er meget lav, samhørighed.lad os refactor. klasse acohesiveclass (private $firstnumber; private $secondnumber; funktion __construct ($firstnumber, $secondnumber) ($- > firstnumber = $firstnumber. $- > secondnumber = $secondnumber;} funktion add() {tilbage $- > firstnumber + $denne - > secondnumber;} funktion subtract() {tilbage $- > firstnumber - $- > secondnumber;}}, dette er en meget sammenhængende klasse.hvorfor?for hvert afsnit af denne kategori hører sammen med en anden.du skal arbejde for samhørighed, men pas på, det kan være vanskeligt at opnå. orthogonality i enkle vendinger, orthogonality henviser til isolation eller fjernelse af bivirkninger.en metode, en klasse - eller modul, der ændrer tilstand af andre klasser eller moduler ikke er ortogonale.for eksempel, et fly er sorte boks er ortogonale.det har sine indre funktioner, indre energi kilde, mikrofoner og sensorer.det har ingen effekt på flyet, den ligger i eller i den ydre verden.det er kun en mekanisme til at registrere og hente flyvedata. et eksempel på en ikke - retvinklede system er din bil er elektronik.at øge deres køretøj er speed har flere bivirkninger, såsom øget radio volumen (blandt andet).hastighed ikke er vinkelret på den bil.klasse regnemaskine (private $firstnumber; private $secondnumber; funktion __construct ($firstnumber, $secondnumber) ($- > firstnumber = $firstnumber. $- > secondnumber = $secondnumber;} funktion add() {$beløb = $- > firstnumber + $- > secondnumber; hvis ($beløb > 100) ((nye alertmechanism()) - > toobignumber ($beløb)} tilbage $beløb;} funktion subtract() {tilbage $- > firstnumber - $- > secondnumber;}} klasse alertmechanism {funktion toobignumber ($) {echo $nummer. "er for stor. ";) i dette eksempel, regnemaskine, klasse, add(), metode har uventet adfærd: den skaber, alertmechanism, formål og opfordrer til en af sine metoder.dette er uventet og uønsket opførsel, bibliotek, forbrugerne vil aldrig forvente en besked, trykkes på skærmen.i stedet, at de kun forventer summen af de tal. klasse regnemaskine (private $firstnumber; private $secondnumber; funktion __construct ($firstnumber, $secondnumber) ($- > firstnumber = $firstnumber. $- > secondnumber = $secondnumber;} funktion add() {tilbage $- > firstnumber + $- > secondnumber;} funktion subtract() {tilbage $- > firstnumber - $- > secondnumber;}} klasse alertmechanism {funktion checklimits ($firstnumber, $secondnumber) ($beløb = (nye regnemaskine ($firstnumber, $secondnumber)) - > add(); hvis ($beløb > 100) ($- > toobignumber ($beløb)}} funktion toobignumber ($) (echo $nummer. "er for stor. ";), det er bedre., alertmechanism, ikke har indflydelse på, lommeregner.i stedet alertmechanism, anvendelser, hvad det har brug for for at fastslå, om en indberetning bør udstedes, afhængighed og sammenkobling, som i de fleste tilfælde er disse to ord er ombyttelige, men i nogle tilfælde, en betegnelse er at foretrække frem for en anden. hvad er en afhængighed.når en genstand, skal bruge objekt, b, med henblik på at foretage den foreskrevne opførsel, vi siger, at en, der afhænger af, b.i kan afhængighed er meget almindelige.objekter, arbejder ofte med og er afhængige af hinanden.så, samtidig med at afhængighed er et ædelt mål, er det næsten umuligt at gøre det.kontrol med afhængighed og reducere dem er imidlertid at foretrække.,,, tunge kobling og løs kobling, sædvanligvis henviser til, hvor meget en genstand, afhænger af andre objekter,.,, i en løst koblet system, ændringer i en genstand, har en begrænset virkning på de andre objekter, der er afhængige af det.i sådanne systemer, klasser, afhænger af grænseflader i stedet for konkret gennemførelse (vi vil tale mere om det senere.det er derfor løst koblet systemer er mere åbne over for ændringer, kobling på en mark, lad os tage et eksempel: klasse skærm (private $lommeregner; funktion __construct() {$- > lommeregner = nye regnemaskine (1,2)}}, er det almindeligt at se denne form for kode.en klasse, display, i dette tilfælde afhænger af, regnemaskine, klasse af direkte referencer til denne klasse.i ovennævnte kode, display, er $regnemaskine, område er af typen, lommeregner.formål at område indeholder, er et resultat af direkte opfordring, regnemaskine, er konstruktøren., sammenkobling af adgang til anden klasse metoder, gennemgår følgende koder for en demonstration af denne slags kobling: klasse skærm (private $lommeregner; funktion __construct() {$- > lommeregner = nye regnemaskine (stk. 1 og 2);} funktion printsum() (echo $- > regnemaskine - > add();}}, display, klasse kalder, regnemaskine, objekt er, add() metode.det er en anden form for kobling, fordi en klasse til den anden metode, sammenkobling af metode reference, kan du et par timer med metode henvisninger, også.for eksempel: klasse skærm (private $lommeregner; funktion __construct() {$- > lommeregner = $- > makecalculator();} funktion printsum() (echo $- > regnemaskine - > add();} funktion makecalculator() {tilbage nye regnemaskine (1, 2)), det er vigtigt at bemærke, at det, makecalculator(), metode vender tilbage en regnemaskine, objekt.det er en afhængighed, sammenkobling af polymorfisme, arv er sandsynligvis den stærkeste form for afhængighed: klasse advancedcalculator udvider lommeregner {funktion sinus ($) værdi {tilbage synd ($værdi);}}, ikke kun kan advancedcalculator, ikke sit arbejde uden regnemaskine,, men det kan ikke eksistere uden det, at reducere kobling af afhængighed injektion, kan man reducere kobling ved at indsprøjte en afhængighed.her er et eksempel: klasse skærm (private $lommeregner; funktion __construct (lommeregner $lommeregner = null) ($- > lommeregner = $regnemaskine?: $- > makecalculator();} //...//}, ved at sprøjte, regnemaskine, genstand, udviser, er konstruktøren har vi reduceret, display, er afhængigheden af den regnemaskine, klasse.men det er kun halvdelen af opløsningen., reducere kobling med grænseflader, vi yderligere kan reducere kobling ved hjælp af grænseflader.for eksempel: cancompute {funktion, grænseflade add(); funktion subtract();} klasse lommeregner gennemfører cancompute (private $firstnumber; private $secondnumber; funktion __construct ($firstnumber, $secondnumber) ($- > firstnumber = $firstnumber. $- > secondnumber = $secondnumber;} funktion add() {tilbage $- > firstnumber + $- > secondnumber;} funktion subtract() {tilbage $- > firstnumber - $- > secondnumber;}} klasse skærm (private $lommeregner; funktion __construct (cancompute $lommeregner = null) ($- > lommeregner = $regnemaskine?: $- > makecalculator();} funktion printsum() (echo $- > regnemaskine - > add();} funktion makecalculator() {tilbage nye regnemaskine (1, 2)), kan du tænke på isp som en højere samhørighedsprincippet. denne kodeks indfører, cancompute, grænseflade.en grænseflade, er så abstrakt som du kan komme ind nu. det definerer de medlemmer, at en klasse skal gennemføre.i tilfælde af ovenstående eksempel lommeregnere, gennemfører, cancompute interface.,, display, er konstruktøren forventer et objekt, der gennemfører, cancompute,.på dette punkt, display, afhængighed, regnemaskine, rent faktisk er i stykker.til enhver tid, kan vi skabe en anden klasse, der gennemfører, cancompute, og send en genstand for denne klasse, udviser, er konstruktøren.- nu kun afhænger af den, cancompute interface, men selv denne afhængighed er fakultativ.hvis vi vedtager nogen argumenter, display, er konstruktøren, vil det blot skabe et klassisk, regnemaskine, genstand ved at kræve, makecalculator(),.denne teknik anvendes ofte, og det er meget nyttigt for prøvekørt udvikling (tdd). de faste principper fast, er et sæt principper for at skrive ren kode, som gør det lettere at skifte, bevare og udvide i fremtiden.de anbefalinger, som, når de anvendes til kildekoden, har en positiv virkning på vedligehold. en lille historie, den faste principper, også kendt som fleksible principper, blev oprindeligt defineret af robert c. martin.selv om han ikke opfinde alle disse principper, og han var den, der satte dem sammen.du kan læse mere om dem i hans bog: fleksibel udvikling af software, principper, mønstre og praksis.faste principper, dækker en bred vifte af emner, men jeg vil forelægge dem i en så enkel måde, som jeg kan.det er gratis at anmode om supplerende oplysninger i bemærkningerne, hvis der er behov for fælles ansvar, om (srp), en klasse har et fælles ansvar.det lyder enkelt, men det kan undertiden være vanskeligt at forstå og iværksætte. klasse journalist {funktion generateincomereports(); funktion generatepaymentsreports(); funktion computebalance(); funktion printreport();}, hvem tror du så, at de fordele, der følger af denne klasse 'opførsel?- en regnskabsafdelingen er en mulighed (balancen), den finansielle afdeling kan være et andet (for indtægter /betaling rapporter) og arkivering afdeling kunne trykke og arkivering af rapporterne.,, der er fire grunde til, at du bliver nødt til at ændre denne klasse; hver enkelt afdeling, kan have deres respektive metoder, tilpasset til deres behov,.,, srp anbefaler, at sådanne klasser i mindre, beahvior specifikke klasser, der hver har én grund til at ændre.disse kurser har tendens til at være meget sammenhængende og løst koblet.i en vis forstand srp er samhørighed defineret på baggrund af brugerne. åben lukket princip (ocp), klasser (moduler) velkommen udvidelse af deres funktioner samt modstand mod ændringer af deres nuværende funktioner.lad os spille med det klassiske eksempel på en elektrisk fan.du har en kontakt, og du vil styre fan.så du kunne skrive noget i retning af: klasse switch_ (private $fan; funktion __construct() {$- > fan = nye fan();} funktion turnon() {$- > fan - > on();} funktion turnoff() {$- > fan - > off();}},, arv er sandsynligvis den stærkeste form for afhængighed. denne kode definerer, switch_, klasse, der skaber og kontrollerer, fan, objekt.bemærk venligst understrege efter "switch_".php ikke tillader dig at definere en klasse med navnet "knappen.", din chef beslutter, at han ønsker at kontrollere lyset med samme skift.dette er et problem, fordi du er nødt til at ændre, switch_,., ændringer til eksisterende kodeks er en risiko; andre dele af systemet kan blive berørt, og kræver en yderligere ændring.det er altid at foretrække frem for at forlade eksisterende funktioner alene ved at tilføje nye functionlaity. i oop terminologi, kan man se, at switch_, har en stærk afhængighed af, fan.det er vores problem, og vi bør gøre vores ændringer. interface omstillelig {funktion on(); funktion off();} klasse fan gennemfører omstillelig {offentlige funktion on() (//kode for at starte fan} offentlig funktion off() (//kode for at stoppe den ventilator) klasse switch_ (private $omstillelig; funktion __construct (omstillelig $omstillelig) ($- > omstillelig = $omstillelig;} funktion turnon() {$- > omstillelig - > on();} funktion turnoff() {$- > omstillelig - > off();}} denne løsning er der, omstillelig interface.den definerer metoder at bytte for genstande skal gennemføre.den fan, redskaber, omstillelig, og switch_, accepterer, at en henvisning til en indsigelse inden for den pågældende, omstillelig,.,, hvordan hjælper det os?denne løsning, først bryder afhængighed mellem switch_ og fan., switch_, har ingen idé om, at det starter en fan, heller ikke mig.andet, indførelse af en lys, klasse ikke vil påvirke switch_ eller omstillelig,.har du lyst til at kontrollere en, lys, objekt med din, switch_?blot skaber et lys, formål og give den til, switch_, som denne: klasse lys gennemfører omstillelig {offentlige funktion on() (//kode til at vende ligh på} offentlig funktion off() (//kode vender lyset slukket) klasse somewhereinyourcode {funktion controllight() {$lys = nye light(). $skifte = nye switch_ ($lys); $switch - > turnon(). $switch - > turnoff();}}, liskov substitutionsprincippet (lsp), lsp fastslår, at et barn klasse må aldrig bryde funktionaliteten af moder - klasse.det er meget vigtigt, fordi forbrugerne forventer af et moderselskab, klasse klasse til at opføre sig på en bestemt måde.passerer et barn klasse til en forbruger vil arbejde og ikke påvirker den oprindelige funktioner. det er forvirrende ved første øjekast, så lad os se på et klassisk eksempel: klasse rektangel (private $bredde; private $højde; funktion setwidth ($bredde) ($- > bredde = $bredde.} funktion setheigth ($heigth) ($- > højde = $heigth;} funktion area() {tilbage $- > bredde * $- > højde), dette eksempel definerer en enkel, rektangel, klasse.vi kan sætte sit højde og bredde, og dets, area(), metode giver rektangel område.ved hjælp af, rektangel, klasse kan se ud som følgende: klasse geometri (funktion rectarea (rektangel $rektangel) ($rektangel - > setwidth (10); $rektangel - > setheigth (5); tilbage $rektangel - > area();}}, rectarea(), metode accepterer et rektangel, objekt som argument fastsætter dens højde og bredde, og returnerer form er område. i skolen lærte vi, at firkanter er rektangulær form.dette antyder, at hvis vi model, vores program til vores geometriske genstand, en square, klasse bør udvide en rektangel, klasse.hvordan ville en sådan klasse ud?klasse m2, udvider rektangel (//- kode til at skrive her?}, jeg har svært ved at finde ud af, hvad jeg skal skrive i, square, klasse.vi har flere muligheder.vi kunne omgå, area(), metode og vende tilbage med kvadratet på $bredde: klasse rektangel (beskyttede $bredde; beskyttede $højde; //...//} klasse square udvider rektangel (funktion area() {tilbage $- > bredde (2), bemærke, at jeg har ændret rektangel, marker, beskyttet, idet square, adgang til disse områder.det ser fornuftigt ud fra et geometrisk synspunkt.en square er lige sider; tilbage. af bredde er rimeligt. vi har imidlertid et problem af en programmering synspunkt.hvis square, er et rektangel, bør vi ikke have noget problem med at give det til, geometri, klasse.men ved at gøre det, du kan se det, geometri, er kode giver ikke meget mening; det indeholder to forskellige værdier for højde og bredde.derfor er en square, er ikke et rektangel i programmeringen.lsp krænket. interface adskillelse princip (isp), enhed prøver skal løbe hurtigt - meget hurtigt, er dette princip koncentrerer sig om at bryde store grænseflader til små, specialiserede grænseflader.den grundlæggende idé er, at forskellige forbrugere af samme klasse, ikke ved, om de forskellige grænseflader - grænseflader, forbrugeren skal bruge.selv hvis en forbruger ikke direkte brug af alle de offentlige metoder på en genstand, der stadig er afhængig af, at alle metoder.så hvorfor ikke give grænseflader med, at kun erklære de metoder, som brugeren behov?det er i nøje overensstemmelse, at grænsefladerne tilhører kunder og ikke for gennemførelsen.hvis du skræddersy deres grænseflader til indtagelse af klasser, de vil respektere isp.selve gennemførelsen kan være enestående, som klasse kan gennemføre forskellige grænseflader, lad os forestille os, at vi gennemfører en børs anvendelse.vi har en mægler, der køber og sælger aktier, og det kan indberette deres dagløn og tab.en meget enkel gennemførelse ville være noget, som en mægler, grænseflade,, nysebroker, klasse, der gennemfører, mægler, og et par af brugergrænsefladen klasser: den ene for at skabe transaktioner (, transactionsui,) og én for indberetning (, dailyreporter,).kode for et sådant system kunne svare til følgende: interface mægler (funktion købe ($symbol, $volumen); funktion sælge ($symbol, $volumen); funktion dailyloss ($); funktion dailyearnings ($);} klasse nysebroker gennemfører mægler (offentlig funktion købe ($symbol. - bind) (//implementsation går her} offentlig funktion currentbalance() (//implementsation går her} offentlig funktion dailyearnings ($) (//implementsation går her} offentlig funktion dailyloss ($) (//implementsation går her} offentlige funktion sælge ($symbol, $volumen) (//implementsation går her.}} klasse transactionsui (private $broker; funktion __construct (mægler $mægler) ($- > mægler = $broker;} funktion buystocks() (//- logik her til at indhente oplysninger fra en formular til $data $- > mægler - > købe ($data ['sybmol "$data ['volume ']);} funktion sellstocks() (//ui logik her til at indhente oplysninger fra en formular til $data $- > mægler - > sælge ($data ['sybmol" $data ['volume']);}} klasse dailyreporter (private $broker; funktion __construct (mægler $mægler) ($- > mægler = $broker;} funktion currentbalance() (echo 'nuværende balace for i dag.dato (time()). "\\ n "echo 'indtjening: «.$- > mægler - > dailyearnings (time()). "\\ n ", echo" tab ".$- > mægler - > dailyloss (time()). "\\ n "), mens denne kodeks, kan arbejde, det strider mod isp.både, dailyreporter, og transactionui, afhænge af, mægler, grænseflade.men de bruger kun en brøkdel af den grænseflade., transactionui, anvender den, buy(), og sell(), metoder, mens dailyreporter, anvender den, dailyearnings(), og dailyloss(), metoder,.,, du kan hævde, at mægler, ikke er sammenhængende, fordi det er metoder, som er uafhængige, og derfor ikke hører sammen. det kan være sandt, men svaret afhænger af gennemførelsen af, mægler, og sælger og køber kan være stærkt knyttet til løbende tab og indtjening.for eksempel, du kan ikke få lov til at købe aktier, hvis du mister penge. du kan også hævde, at mægler, krænker også srp.fordi vi har to klasser, at bruge det på forskellige måder, der kan være to forskellige brugere.jeg siger nej. den eneste bruger sandsynligvis er den faktiske mægler.han /hun ønsker at købe, sælge, og anser de nuværende midler.men igen, det virkelige svar afhænger af hele systemet og erhvervslivet., isp er overtrådt.både eu - klasser, afhænger af hele, mægler.dette er et fælles problem, hvis du tror, grænseflader hører til deres gennemførelse.men at flytte deres synspunkt kan foreslå følgende udformning: brokertransactions {funktion, grænseflade købe ($symbol, $volumen); funktion sælge ($symbol, $volumen)} {funktion, grænseflade brokerstatistics dailyloss ($); funktion dailyearnings ($);} klasse nysebroker gennemfører brokertransactions, brokerstatistics {offentlige funktion, købe ($symbol, $volumen) (//implementsation går her} offentlig funktion currentbalance() (//implementsation går her} offentlig funktion dailyearnings ($) (//implementsation går her} offentlig funktion dailyloss ($) (//implementsation går her} offentlige funktion sælge ($symbol, $volumen) (//implementsation går her}} clrøv transactionsui (private $broker; funktion __construct (brokertransactions $mægler) ($- > mægler = $broker;} funktion buystocks() (//- logik her til at indhente oplysninger fra en formular til $data $- > mægler - > købe ($data ['sybmol '] $data ['volume']);} funktion sellstocks() (//- logik her til at indhente oplysninger fra en formular til $data $- > mægler - > sælge ($data ['sybmol "$data ['volume ']);}} klasse dailyreporter (private $broker; funktion __construct (brokerstatistics $mægler) ($- > mægler = $broker;} funktion currentbalance() (echo' nuværende balace for i dag.dato (time()). "\\ n "echo 'indtjening: «.$- > mægler - > dailyearnings (time()). "\\ n ", echo" tab ".$- > mægler - > dailyloss (time()). "\\ n "), det giver mening, og som respekterer isp., dailyreporter, kun afhænger af, brokerstatistics,; det er ligeglad og ikke er nødt til at vide, om salg og køb af operationer., transactionsui, på den anden side ved kun at købe og sælge.det, nysebroker, er identisk med den tidligere klasse, medmindre det nu gennemfører, brokertransactions, og brokerstatistics, grænseflader,.,, du kan tænke på isp som en højere samhørighedsprincippet.,,, når begge eu - klasser afhang af, mægler, grænseflade, var de samme to klasser, hver med fire områder, to, der blev anvendt i en metode, og de to andre i en anden metode.klassen ikke ville have været meget sammenhængende, en mere kompleks eksempel på dette princip kan findes i en af robert c. martin 's første dokumenter om emnet: grænsefladen adskillelse princip., afhængighed inversion princip (dip), dette princip foreskriver, at højtstående moduler bør ikke afhænge af mindre moduler; begge bør afhænge af det abstrakte.indvinding, bør ikke afhænge af detaljer, detaljer, bør afhænge af det abstrakte.enkelt sagt, du bør afhænge af det abstrakte så meget som muligt og ikke på konkrete gennemførelse. det trick med - er, at du vil vende denne afhængighed, men altid vil holde strømmen af kontrol.lad os gennemgå vores eksempel fra ofp (, skift og lys, klasser).i den oprindelige gennemførelse, havde vi et skifte direkte kontrol med et lys, som du kan se, afhængighed og kontrol med strøm fra, skifte mod, lys.dette er, hvad vi ønsker, og vi ønsker ikke, at direkte afhænger af lys.så har vi indført en grænseflade,.,, det er forbløffende, hvordan blot at indføre en grænseflade, gør vores kode respektere både dip og ofp.som du kan se, ingen klasse, afhænger af den konkrete gennemførelse af lys, og både lys og skifte, afhænge af, omstillelig interface.vi byttede afhængighed, og strømmen af kontrol var uændret.,, højt niveau udformning, et andet vigtigt aspekt af din kode er din højt design og generelle struktur.en indviklet struktur giver kode, som er svært at ændre.at holde en ren arkitektur er afgørende, og det første skridt er at forstå, hvordan at skille din kode er forskellige bekymringer., i det billede, jeg har forsøgt at sammenfatte de vigtigste bekymringer.i midten af skema er vores forretning logik.det skal være isoleret fra resten af verden, og være i stand til at arbejde og opfører sig som forventet, uden at der forelå nogen af de andre dele.se det som orthogonality på et højere niveau. fra højre, du har din "hoved" - indgangsstedet til gennemførelsen - og fabrikker, der skaber objekter.en ideel løsning ville få sin indsigelse fra specialiserede fabrikker, men det er næsten umuligt.du bør stadig bruge fabrikker, når du har mulighed for det, og holde dem uden for din virksomhed logik. så i bunden (orange), har vi vedholdende (databaser, fil adgangsveje, net kommunikation) med henblik på vedvarende information.ikke noget i vores forretning logik burde vide, hvordan vedholdenhed virker. til venstre er leveringsmekanisme.,, en mvc, som laravel eller cakephp, bør kun være en gennemførelsesmekanisme, intet mere. det lader du bytte en mekanisme med en anden uden at røre ved din virksomhed logik.det lyder måske nok, at nogle af dem.vi har fået at vide, at vores forretningslogik bør placeres i vores modeller.jeg er uenig.vores modeller bør være "anmodning modeller", dvs. dumme data genstande, der anvendes til formidling af informationer fra mvc til virksomheden logik.man, jeg kan ikke se problemet, herunder input validering i de modeller, men ikke mere.forretningslogik bør ikke være i de modeller, når du ser på din ansøgning arkitektur eller fortegnelse struktur, skal du se en struktur, der viser, hvad programmet gør, i modsætning til hvad ramme eller database du plejede. endelig sørge for, at alle områder punkt mod vores forretning logik.brugergrænseflader, fabrikker, databaser, er meget konkrete gennemførelser, og du vil aldrig stole på dem.at afhængighedsforhold til punkt mod vores forretningslogik modularizes vores system, der giver os mulighed for at ændre områder uden at ændre erhvervslivets logik.,, nogle tanker om former for design, konstruktion, mønstre, spille en vigtig rolle for, at kode lettere at ændre ved at tilbyde en fælles design, at hver programmør kan forstå.ud fra et strukturelt synspunkt, former for design er naturligvis en fordel.de er testet og gennemtænkte løsninger.,,, hvis du ønsker at lære mere om former for design, skabte jeg en tuts + præmie til dem!,,, kraft af test, test drevet udvikling fremmer skrive kode, der er let at prøve.derfor tvinger dig til at respektere de grundlæggende principper for at gøre din kode let at prøve.injektion af afhængighed og skrive retvinklede klasser er væsentlige; ellers ender du med enorme testmetoder.enhed prøver skal løbe hurtigt - meget hurtigt, og alt det, der ikke er testet, bør blive hånet."mange komplekse klasser for en enkel test kan være overvældende.så når du finder dig selv nar ti objekter til at teste en enkelt metode på en klasse, de kan have et problem med din kode.ikke din test.,, sidste tanker, ved udgangen af den dag, det kommer an på, hvor meget du bekymrer dig om din kildekode.under teknisk viden er ikke nok. du er nødt til at anvende denne viden igen og igen, aldrig at være 100% tilfredse med din kode.vil du gøre din kode er let at opretholde, ren og åbne over for forandring. tak for læse - og føle sig fri til at bidrage med deres teknik i bemærkningerne nedenfor.






Previous:
Next Page: