fast: del 3

, fast: del 3 - liskov substitution &grænseflade adskillelse principper,,,,, 19,,,,,,,,, 19,,,,,,,,,, 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: 2 - det er åbne eller lukkede principlesolid: del 4 - afhængighed inversion princippet om fælles ansvar (srp), åbne eller lukkede (ocp), liskov substitution, grænseflade adskillelse, og afhængighed inversion.fem adræt principper, som skal lede dig, hver gang du skriver kode.,,, fordi både liskov substitutionsprincippet (lsp) og grænsefladen adskillelse - princippet (isp), er meget let at definere og give eksempler på i denne lektie, vi vil tale om dem begge.,, liskov substitutionsprincippet (lsp), barn klasser må aldrig bryde den forælder, klasse, type definitioner.,,, begrebet dette princip blev indført af barbara liskov i 1987 - konferencen i centrum og senere offentliggjort i en avis sammen med jannette fløj i 1994.den oprindelige definition er som følger:,,, lad q (x) være en ejendom bevislige om objekter, x af typen t. så q (y), skal være dokumenteret for genstande af type i, hvor s er en undergruppe af t, senere med offentliggørelsen af den faste principper, som robert c. martin hans bog fleksibel udvikling af software, principper, mønstre og praksis og offentliggjort på ny i c -&#udgave af bogen adræt principper, mønstre og praksis i c #, definition blev kendt som liskov substitutionsprincippet., dette fører os til definitionen af robert c. martin:,,, der skal benyttes som erstatning for deres base types.,,, så simpelt er det en underklasse skal tilsidesætte de stiftende klasse metoder på en måde, der ikke bryder funktioner fra en kundes synspunkt.her er et simpelt eksempel viser, at begrebet.,, klasse køretøj (funktion startengine() (//default motorstart funktionalitet} funktion accelerate() (//default acceleration funktioner), på grund af en klasse køretøjer, - - kan det være abstrakt og to børn:,, klasse bil udvider køretøj (funktion startengine() {% - > engageignition(); forældre: startengine();} privat funktion engageignition() (//start - proceduren) klasse electricbus udvider køretøj (funktion accelerate() {$- > increasevoltage(). $- > connectindividualengines();} privat funktion increasevoltage() (//elektrisk logik} privat funktion connectindividualengines() (//forbindelse logik), en klient klasse bør være i stand til at bruge dem, hvis det kan bruge, køretøj,.,, klasse chauffør {funktion går (køretøjets $v) ($v - > startengine(). $v - > accelerate();}},,, fører os til en simpel anvendelse af den model, som vi brugte den metode bestemt mønster i ofp tutor.,,,,,, der er baseret på tidligere erfaringer med den åbne eller lukkede princip, kan vi konkludere, at liskov er substitutionsprincippet er i stærk forbindelse med ofp.faktisk er en krænkelse af lsp er en latent krænkelse af ofp "(robert c. martin), og modellen metode design - er et klassisk eksempel på respekt for og gennemførelse af lsp, der igen er en af løsningerne til at respektere ofp.,, det klassiske eksempel på lsp krænkelse, at illustrere dette fuldstændig vil vi komme med et klassisk eksempel, fordi det er meget vigtigt og let forståelig.,, klasse rektangel (private $topleft; private $bredde; private $højde, offentlig funktion setheight ($højde) {$- > højde = $højde) offentlig funktion getheight() {tilbage $- > og højde) offentlig funktion setwidth ($bredde) ($- > bredde = $bredde;} offentlig funktion getwidth() {tilbage $this - > bredde;}}, vi starter med en grundlæggende geometriske form, en rektangel.det er bare en simpel data genstand med montører og getters, bredde og højde.forestil dig, at vores ansøgning virker, og det er der allerede flere kunder.nu har de brug for et nyt element.de skal være i stand til at manipulere med kvadratisk.,, i det virkelige liv, i geometri, en square er en særlig form for rektangel.så kunne vi forsøge at gennemføre en square, klasse, der strækker sig et rektangel, klasse.det siges ofte, at et barn klasse, er en modervirksomhed klasse, og dette udtryk også er i overensstemmelse med lsp, i det mindste ved første øjekast.,,,,,, men er en square, virkelig et rektangel i programmeringen.klasse m2, udvider rektangel (offentlig funktion setheight ($) værdi {$- > bredde = $værdi; $- > højde = $værdi;} offentlig funktion setwidth ($) værdi {$- > bredde = $værdi; $- > højde = $værdi), en square er et rektangel med samme bredde og højde, og vi kunne gøre en mærkelig gennemførelse som i ovennævnte eksempel.vi kunne træde i stedet for både maskinsættere at fastsætte højde samt bredde.men hvordan vil det påvirke kundekode?,, klasse klient {funktion areaverifier (rektangel $r) ($r - > setwidth (5); $r - > setheight (4); hvis ($r - > area()!= 20) {kaster ny undtagelse ('bad område. ');} tilbage.}}, er det tænkeligt, at have en klient, klasse, der kontrollerer rektangel område og kaster en undtagelse, hvis det er forkert.,, funktion area() {tilbage $- > bredde * $- > højde}, vi naturligvis tilføjes ovenstående metode vores, rektangel, klasse til at give området.,, klasse lsptest udvider phpunit_framework_testcase {funktion testrectanglearea() {$r = nye rectangle(). $c = nye client(). $- > asserttrue ($c - > areaverifier ($r)), og vi har skabt en enkel test ved at sende en tom rektangel imod område verifikator og prøven passerer.hvis vores square, klasse er korrekt defineret, og sender det til kunden, areaverifier(), må ikke bryde den funktionalitet.når alt kommer til alt, en square, er en rektangel i alle matematiske mening.men er vores klasse?,, funktion testsquarearea() {$r = nye square(). $c = nye client(). $- > asserttrue ($c - > areaverifier ($r)}, afprøvning, det er meget nemt, og det er stort.en undtagelse er kastet for os, når vi løber testen ovenfor.,, phpunit 3.7.28 af sebastian bergmann.undtagelse: dårligt område.# 0 /paht: //////////////... /... /lsptest. folkesundhedsprogrammet (18): klient - > areaverifier (objekt (.)) [interne funktion]: lsptest - > testsquarearea(), så vores square, klasse er ikke en rektangel, trods alt.det bryder lovene i geometri.det slår fejl, og det strider mod liskov substitutionsprincippet.,, jeg elsker især dette eksempel, fordi det ikke kun er i strid med lsp, det viser også, at objekt resultatorienteret programmering er ikke om kortlægning af virkelige liv til objekter.hver genstand i vores program må være en abstraktion over et begreb.hvis vi kort - virkelige objekter til programmeret objekter, vil vi næsten altid mislykkes.,, grænsefladen adskillelse princippet, det fælles ansvar er princippet om aktører og højt niveau arkitektur.den åbne eller lukkede princip om klasse design og træk udvidelser.den liskov substitutionsprincippet er subtyping og arv.grænsefladen adskillelse - princippet (isp), drejer sig om forretningslogik kunder meddelelse., i alle modulopbygget ansøgninger, der må være en eller anden grænseflade, som kunden kan stole på.disse kan være faktiske grænseflade maskinskrevet enheder eller andre genstande af klassiske former for design som facader.det er ligegyldigt, hvilken løsning der er anvendt.det er altid det samme anvendelsesområde: at meddele den kundekode om brugen af modulet.disse grænseflader kan opholde sig mellem forskellige moduler i samme ansøgning eller projekt, eller mellem et projekt, som en tredjemand bibliotek i et andet projekt.igen, det betyder ikke noget.kommunikation er kommunikation og kunder er kunder, uanset den faktiske personer, skrive koden.,, så hvordan skal vi definere disse grænseflader.vi kan tænke på vores modul og udlevere alle de funktioner, vi ønsker at tilbyde.,,,,,, det ser ud som en god start, en god måde at definere, hvad vi ønsker at gennemføre i vores modul.eller er det?en begyndelse, som vil føre til en af to mulige anvendelser:,,, en stor bil eller bus, klasse af alle metoder på en bil, grænseflade.kun de store dimensioner af disse klasser bør fortælle os, for at undgå, at de under alle omstændigheder, eller er, at mange små klasser, lightscontrol,, speedcontrol, eller, radiocd, som alle er gennemførelsen af hele den grænseflade, men faktisk leverer noget nyttigt, kun for de dele, de gennemfører.,,, det er klart, at hverken løsning er acceptabelt at gennemføre vores forretningslogik.,,,,,, kan vi tage en anden tilgang.bryde grænseflade i stykker, specialiserede hver gennemførelse.det vil hjælpe med til at bruge de små klasser, der bekymrer sig om deres egne grænseflade.genstande af grænseflader vil blive anvendt af de forskellige typer af køretøjer, som bil i billedet ovenfor.bilen vil bruge implementeringer, men afhænger af grænseflader.så et skema, som den nedenfor, kan være endnu mere udtryksfuldt.,,,,,, men det grundlæggende ændrer vores opfattelse af arkitektur.den bil bliver klienten i stedet for gennemførelsen.vi ønsker stadig at give vores klienter måder at bruge hele vores modul, der er en type køretøj,.,,,,,, at vi løste gennemførelsen problem, og vi har en stabil virksomhed logik.den nemmeste ting at gøre er at skabe en fælles grænseflade med alle de gennemførelser og lade kunderne i vores tilfælde, busstation, highway, chauffør, og så videre, til at bruge, hvad de vil fra grænsefladen gennemførelse.dybest set, at dette skift den opførsel udvælgelse ansvar til kunderne.du kan finde denne løsning i mange gamle ansøgninger.,, grænsefladen adskillelse - princippet (isp) hedder det, at ingen klient skal tvinges til at afhænge af metoder, der ikke anvendes.,,, men denne løsning har sine problemer.nu er alle kunder afhænger af alle metoder.hvorfor skulle en, busstation, afhænger af den stat, i lyset af bussen, eller om de radiokanaler, som vælges af føreren?det bør ikke.men hvad hvis det gør?betyder det noget?hvis vi tænker på den fælles ansvar - princippet, det er en søster koncept til den her.hvis busstation, afhænger af mange forskellige implementeringer, ikke engang brugt af det, kan den kræve ændringer, hvis nogen af de enkelte små børn.dette er navnlig tilfældet for udarbejdet sprog, men vi kan stadig se virkningen af, lightcontrol, ændre indvirkning, busstation,.disse ting burde aldrig ske.,, grænseflader hører til deres kunder, og ikke til anvendelse.vi skal således altid design dem på en sådan måde, at bedste suite vores klienter.nogle gange kan vi nogle gange kan vi ikke nøjagtigt ved, vores kunder.men når vi kan, bør vi bryde vores grænseflader i mange mindre virksomheder, så de bedre kan opfylde de præcise behov i vores klienter.,,,,,, det vil naturligvis føre til en vis grad af overlapning.men husk!grænseflader er bare funktion navn definitioner.der er ingen gennemførelse af enhver form for logik i dem.så man er lille og overskuelige.,, så vi har den store fordel, kunder, afhængigt af og kun på det, de rent faktisk har brug for og anvendelse.i nogle tilfælde klienter kan bruge og har brug for flere grænseflader, det er okay, så længe de bruge alle metoder fra alle de grænseflader, de er afhængige af.,, en anden flot trick er, at i vores forretning logik, en enkelt klasse kan gennemføre en række forskellige grænseflader, hvis det er nødvendigt.så vi kan skabe en fælles gennemførelse af alle de fælles metoder mellem grænseflader.den separate interface vil også tvinge os til at tænke på vores kode mere fra kundens synspunkt, hvilket vil give løs kobling og let test.så vi har ikke kun gjort vores kode bedre til vores kunder, vi har også gjort det nemmere for os at forstå, test og gennemføre.,, sidste tanker, lsp lærte os, hvorfor virkeligheden kan ikke betragtes som en direkte forbindelse med programmeret genstande, og hvordan der skal respektere deres forældre.vi har også gjort det på baggrund af de andre principper, som vi allerede vidste.,, isp lærer os at respektere vores kunder mere, end vi troede.under hensyntagen til deres behov, vil gøre vores kode bedre og vores liv som programmører lettere.,, tak for din tid.

template_method
SquareRect
hugeInterface
specializedImplementationInterface
carUsingInterface
oneInterfaceManyClients
segregatedInterfaces



Previous:
Next Page: