fast: del 1

, fast: del 1 - fælles ansvar princip,,,,, 61,,,,,,,,, 42,,,,,,, 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 2 - åbne eller lukkede princip, fælles ansvar (srp), åbne /tæt, liskov er substitution, grænseflade, adskillelse og afhængighed inversion.fem adræt principper, som skal lede dig, hver gang du skriver kode.,, definition,,, en klasse kun skal have en grund til at ændre.,,, defineret som robert c. martin i hans bog fleksibel udvikling af software, principper, mønstre og - praksis og senere offentliggjort på ny i c -&#udgave af bogen adræt principper, mønstre og praksis i c #, det er en af de fem faste adræt principper.det, der er meget enkel, men det kan være meget vanskeligt at opnå enkelhed.en klasse kun skal have en grund til at ændre.,, men hvorfor?hvorfor er det så vigtigt, at der kun er én grund til at ændre?, i statisk maskinskrevet og udarbejdet, idet flere grunde kan føre til flere uønskede omlægninger.hvis der er tale om to forskellige grunde til at ændre, er det tænkeligt, at to forskellige grupper kan arbejde med den samme kode i to forskellige grunde.de bliver nødt til at anvende sin løsning, som i tilfælde af en samlet sprog (c + +, c&#eller java), kan medføre uforenelige moduler med andre grupper eller andre dele af ansøgningen, selvom du ikke kan bruge en samlet sprog, kan det være nødvendigt at foretage en ny test af samme klasse eller modul for forskellige grunde.det betyder mere qa arbejde, tid og indsats.,, publikum, fastsættelsen af en enkelt ansvar en klasse - eller modul bør have, er meget mere kompliceret end bare at kigge på en tjekliste.for eksempel, et spor for at finde årsagerne til ændring er at analysere publikum i vores klasse.brugerne af anvendelsen eller system, vi udvikler, der betjenes af en bestemt modul vil være dem, anmoder om ændringer til det.de tjente vil anmode om ændringer.her er et par af moduler og deres mulige målgrupper.,,, persistens modul - publikum omfatter dbas og software, arkitekter, rapportering modul - publikum omfatter kontorister, revisorer, og operationer, betaling beregning modul til lønsystem, - publikum kan omfatte advokater, ledere, og revisorer, bog. - modul til biblioteksstyring system - publikum kan omfatte en bibliotekar og /eller kunderne selv.,,, roller og aktører, at konkrete personer til alle disse roller kan være vanskeligt.i en lille virksomhed, en enkelt person skal opfylde flere roller i en stor virksomhed, der kan være flere personer, der er tildelt en rolle.det er langt mere fornuftigt at tænke på de roller.men roller i sig selv er ret vanskelige at definere.hvad er en rolle?hvordan finder vi det?det er meget lettere at forestille sig aktører gør disse roller og inddrage vores publikum med disse aktører.,, så hvis vores publikum er grunde til at ændre de aktører definerer publikum.dette har i høj grad hjælper os med at begrænse begrebet konkrete personer som john arkitekt "arkitektur, eller" mary reference "operationer,.,,, så et ansvar er en familie af funktioner, der tjener et bestemt aktør.(robert c. martin), kilde til forandring i form af denne argumentation, aktører og blive en kilde til forandring for familien af funktioner, der tjener dem.som deres behov, at specifikke familie af funktioner skal også ændres for at imødekomme deres behov.,,, en skuespiller til ansvar er den eneste kilde til forandring til det ansvar.(robert c. martin), klassiske eksempler, genstande, der kan "tryk" sig selv, lad os sige, at vi har en bog, at begrebet en bog og dets funktioner, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "john doe"} funktion turnpage() (//fingerpeg til næste side) funktion printcurrentpage() (echo "nuværende side indhold"), og det kan ligne en rimelig klasse.vi har bogen, den kan give sin titel, forfatter, og det kan bladre.endelig er det også i stand til at trykke den aktuelle side på skærmen.men der er et lille problem.hvis vi tænker på de aktører, der er involveret i driften, bog, genstand, hvem er de?vi kan nemt tro på to forskellige aktører: bog forvaltning (som bibliotekar) og præsentation af data mekanisme (som den måde, vi ønsker at levere indhold til brugeren - på skærmen, grafiske ui, kun eu - erhvervsgrenen, måske trykning).det er to meget forskellige aktører.,, at blande forretning logik med præsentation er dårligt, fordi det er i modstrid med fælles ansvar - princippet (srp).tag et kig på følgende kode:,, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "ukendt"} funktion turnpage() (//fingerpeg til næste side) funktion getcurrentpage() {tilbage "nuværende side indhold"}} grænseflade printer (funktion printpage ($));} klasse plaintextprinter gennemfører printer (funktion printpage ($side) (echo $side;}} klasse htmlprinter gennemfører printer (funktion printpage ($side) (echo '< div stil = "side" > ".$side. "< /div > «), også dette meget grundlæggende eksempel viser, hvordan adskiller præsentation fra forretningslogik og respektere srp, giver store fordele i vores design er fleksibilitet.,, genstande, der kan "redde" selv, et lignende eksempel den foregående, er, når en genstand kan redde og skaffe sig fra præsentation.,, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "ukendt"} funktion turnpage() (//fingerpeg til næste side) funktion getcurrentpage() {tilbage "nuværende side indhold"} funktion save() {$filnavn = /documents /«.$- > gettitle(). "- ".$- > getauthor(); file_put_contents ($filnavn, sandt ($))), kan vi endnu en gang at identificere en række aktører som bog forvaltningssystem og vedholdenhed.hvis vi ønsker at ændre persistens, er vi nødt til at ændre denne klasse.hvis vi ønsker at ændre, hvor vi kommer fra den ene side til den anden, er vi nødt til at ændre denne klasse.der er flere akse forandring her.,, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "ukendt"} funktion turnpage() (//fingerpeg til næste side) funktion getcurrentpage() {tilbage "nuværende side indhold") klasse simplefilepersistence {funktion redde (bog $bog) ($filnavn = /documents /«.$bog - > gettitle(). "- ".$bog - > getauthor(); file_put_contents ($filnavn, sandt ($bog)}}, flytter den fortsatte drift til en anden klasse vil klart adskille ansvar, og vi vil være fri til at udveksle persistens metoder, uden at det berører vores bog, klasse.f.eks. gennemførelse af en, databasepersistence, klasse ville være ubetydelige, og vores forretningslogik baseret på transaktioner med bøger vil ikke ændre sig, har en højere mening, i mine tidligere artikler, som jeg ofte nævnt og forelagt på det høje niveau, arkitektoniske skema, som kan ses nedenfor.,,,,,,, hvis vi analyserer dette skema. kan du se, hvordan den fælles ansvar - princippet overholdes.objekt skabelse er adskilt på højre i fabrikker og hovedindgangen i vores anvendelse, en aktør, et ansvar.udholdenhed er også ordnet på bunden.et separat modul for særskilt ansvar.endelig, til venstre, vi har præsentation eller levering mekanisme, hvis de ønsker det, i form af en mvc eller enhver anden form for eu - erhvervsgrenen.srp respekteret igen.det eneste, der mangler, er at finde ud af, hvad vi skal gøre i vores forretning logik.,, programmel, overvejelser, når vi tænker på den software, som vi er nødt til at skrive, vi kan analysere mange forskellige aspekter.f.eks. flere krav i samme klasse, kan repræsentere en akse for forandring.denne akse i forandring kan være en ledetråd for et fælles ansvar.der er stor sandsynlighed for, at grupper af krav, som vedrører den samme gruppe af funktioner vil have grunde til at ændre eller specificeres i første omgang, den primære værdi af software, er at lette ændringer.det sekundære er funktionaliteten i den forstand, at så mange krav som muligt, og som opfylder brugernes behov.men for at opnå en høj afledte værdi, en grundlæggende værdi er obligatorisk.for at holde vores primære værdi højt, må vi have en konstruktion, der er let at ændre, at udvide, for at tage hensyn til nye funktioner og for at sikre, at srp er overholdt, kan vi derfor i en trinvis måde:,,, høje primære værdi fører i tide til høje sekundære værdi.,, sekundære værdi: behov for brugerne.,, behovene hos brugerne betyder behov hos de aktører, skal af de aktører, bestemmer, for ændringer af disse aktører,.,, behov for ændring af aktører definerer vores ansvar.,,, så bør vi, når vi skal udforme vores software:,,, finde og fastlægge de aktører.,, identificere de ansvarsområder, der tjener de aktører,.,, gruppe vores funktioner og klasser, således at hver kun har én, der tildeles ansvar.,,, en mindre obvioueksempel, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "ukendt"} funktion turnpage() (//fingerpeg til næste side) funktion getcurrentpage() {tilbage "nuværende side indhold"} funktion getlocation() (//returnerer den holdning i biblioteket //ie. antal & værelse nummer}}, så dette kan synes rimelige.vi har ingen metode at behandle persistens eller præsentation.vi har vores, turnpage(), funktionalitet og nogle metoder til at give andre oplysninger om bogen.men vi har måske et problem.for at finde ud af det, vi ønsker at analysere vores anmodning.den funktion, getlocation(), kan være et problem, alle de metoder, den bog, klasse er forretning logik.så vores perspektiv må være fra virksomhedens synspunkt.hvis anvendelsen er skrevet til brug for reel bibliotekarer, der leder efter bøger og giver os en fysisk bog, så srp kunne blive krænket., kan vi derfor, at skuespilleren operationer er dem interesserede i de metoder, gettitle(),, getauthor(), og getlocation(),.kunderne kan også have adgang til ansøgningen, til at vælge en bog og læs den første par sider for at få en idé om den bog, og beslutte, om de vil det eller ej.så den skuespiller læsere kan være interesseret i alle de metoder, undtagen getlocations(),.en almindelig kunde er ligeglad, hvor bogen er holdt i biblioteket.bogen bliver overgivet til kunden med bibliotekaren.- vi har nemlig en krænkelse af srp.,, klasse bog (funktion gettitle() {tilbage "en stor bog"} funktion getauthor() {tilbage "ukendt"} funktion turnpage() (//fingerpeg til næste side) funktion getcurrentpage() {tilbage "nuværende side indhold") klasse booklocator {funktion finde (bog $bog) (//returnerer den holdning i biblioteket //, dvs. at hylde nummer & værelse nummer $librarymap - > findbookby ($bog - > gettitle() $bog - > getauthor())), ved at indføre det, booklocator, bibliotekaren vil være interesseret i, booklocator,.klienten vil være interesserede i, bog.naturligvis er der forskellige måder at gennemføre en, booklocator,.det er forfatteren og titel eller en bog til formål, og få de nødvendige oplysninger fra den bog.det afhænger altid af vores forretning.det, der er vigtigt, er, at hvis biblioteket er ændret, og den bibliotekar bliver nødt til at finde bøger i en anderledes tilrettelagt bibliotek, bog, genstand, ikke vil blive påvirket.på samme måde, hvis vi beslutter at yde et på forhånd udarbejdet resumé til læserne i stedet for at lade dem tage de sider, som ikke vil påvirke bibliotekar og processen med at finde bøger sidder på hylden.,, hvis vores forretning er at fjerne en bibliotekar og skabe et tagselvbord mekanisme i vores bibliotek. så vi kan overveje, at srp er overholdt i vores første eksempel.de læsere vores bibliotekarer, de har brug for til at finde bogen sig og så tjek det ud på automatiseret system.det er også en mulighed.det er vigtigt at huske på her, er, at du skal altid tage din sag nøje.,, sidste tanker, det fælles ansvar princip bør altid tages i betragtning, når vi skriver kode.klasse og modul design er stærkt berørt af det, og det fører til et lavt koblet design med mindre og lettere afhængighedsforhold.men som en mønt, det har to ansigter.det er fristende at design fra begyndelsen af vores ansøgning med srp i tankerne.det er fristende at finde så mange aktører, som vi ønsker og har brug for.men det er farligt, - - fra et bestemt synspunkt - at prøve at tænke på alle parter fra starten.overdreven srp hensyn kan let føre til for tidligt fødte optimering og i stedet for en bedre udformning, kan det føre til en spredt, hvor et klart ansvar for kategorier eller moduler kan være svært at forstå.,, så når du ser, at en klasse - eller modul begynder at ændre af forskellige grunde, tøv ikke, tage de nødvendige skridt til at respektere srp, men ikke for sent, for tidlig optimering let kan narre dig.

HighLevelDesign



Previous:
Next Page: