Implementering av Projektlogik - Teknik
Hoppa till innehållet

Implementering av Design Logic

Annonser

Filosofi för implementeringsmetod

Vattenfall närmande

Vattenfallsmetoden för att implementera en applikation kräver att en designer konsulterar en eller flera representanter från slutanvändarorganisationen och skriver ner alla applikationsspecifikationer. Typiskt kommer specifikationer i en uppsättning funktionella dokument eller användningsfall, skrivna på ett sådant sätt att slutanvändaren enkelt kan läsa och förstå dokumenten.

Slutanvändaren undertecknar dessa dokument och dokumenten samlas sedan in av det tekniska designteamet som designar applikationen och skapar olika artefakter som klassmodelldiagram, tillståndsdiagram, aktivitetsdiagram och datamodeller. Målet med den här fasen är att skriva allt så detaljerat att en utvecklare inte har några problem att skapa den nödvändiga koden. Det sker en formell överlämning av designen till utvecklingsteamet och testteamet. Efter leverans börjar utvecklingsteamet koda och testteamet använder den tekniska designen i kombination med användningsfall för att skapa testfall och testscenarier.

Efter att utvecklingsteamet avslutat kodningen överlämnas koden till testteamet. Testteamet utför de tester det designat baserat på kraven och detaljerad design. Eventuella problem kommer att åtgärdas av utvecklingsteamet. När test- och saneringsprocessen är klar överlämnas ansökan till slutanvändaren för acceptanstestning. Slutanvändaren utför en sista kontroll för att se om applikationen uppfyller de initiala kraven. Om han godkänns godkänner han den färdiga produkten och projektet är avslutat. Efter att utvecklingsteamet avslutat kodningen överlämnas koden till testteamet.

Testteamet utför de tester det designat baserat på kraven och detaljerad design. Eventuella problem kommer att åtgärdas av utvecklingsteamet. När test- och saneringsprocessen är klar överlämnas ansökan till slutanvändaren för acceptanstestning. Slutanvändaren utför en sista kontroll för att se om applikationen uppfyller de initiala kraven. Om han godkänns godkänner han den färdiga produkten och projektet är avslutat. Efter att utvecklingsteamet avslutat kodningen överlämnas koden till testteamet. Testteamet utför de tester det designat baserat på kraven och detaljerad design.

 Eventuella problem kommer att åtgärdas av utvecklingsteamet. När test- och saneringsprocessen är klar överlämnas ansökan till slutanvändaren för acceptanstestning. Slutanvändaren utför en sista kontroll för att se om applikationen uppfyller de initiala kraven. Om han godkänns godkänner han den färdiga produkten och projektet är avslutat.

Slutanvändaren utför en sista kontroll för att se om applikationen uppfyller de initiala kraven. Om han godkänns godkänner han den färdiga produkten och projektet är avslutat. Slutanvändaren utför en sista kontroll för att se om applikationen uppfyller de initiala kraven. Om han godkänns godkänner han den färdiga produkten och projektet är avslutat.

Ett projekt kan ha fler eller färre faser när man använder vattenfallsmetoden, men den huvudsakliga egenskapen är en mycket formell början och slutet av varje fas, med mycket formella leveranser.

Fördelen med vattenfallsansatsen är att ansvaret för teamet som ansvarar för varje fas är större. Det är tydligt vad de behöver leverera, när de behöver leverera det och vem de behöver leverera det till. Ofta behöver utvecklingsteamet inte interagera med användaren. Detta kan vara mycket användbart när du lägger ut utveckling till ett annat land.

Den största nackdelen med vattenfallsupplägget är att i en miljö där allt är organiserat på ett mycket formellt sätt minskar flexibiliteten att reagera på förändringar. Även flyttningen måste organiseras. Mycket få företag verkar göra detta effektivt, vilket ofta resulterar i en betydande ökning av omkostnader. För att hantera kostnaderna för ett projekt skjuter vissa företag till och med upp eventuella kravändringar tills den första leveransen av applikationen levereras, vilket effektivt levererar en applikation som inte uppfyller slutanvändarens behov.

Agil utveckling

Många långvariga programvaruutvecklingsprojekt har gått över budget och misslyckats med att leverera produkten i tid. Utgångspunkten för den agila mjukvaruutvecklingsfilosofin är att minimera riskerna genom att utveckla mjukvara i korta tidsrutor, kallade iterationer, som vanligtvis varar en till fyra veckor. Varje iteration är som sitt eget miniatyrprogramvaruprojekt och inkluderar alla uppgifter som är nödvändiga för att släppa det nya funktionalitetsinkrementet: planering, kravanalys, design, kodning, testning och dokumentation. Även om en iteration kanske inte lägger till tillräckligt med funktionalitet för att motivera produktsläpp, syftar ett agilt mjukvaruprojekt till att kunna släppa ny programvara i slutet av varje iteration. I slutet av varje iteration omvärderar teamet projektprioriteringar.

Målet med agil mjukvaruutveckling är att uppnå kundnöjdhet genom snabb och kontinuerlig leverans av användbar mjukvara; alltid sträva efter att bygga vad kunden behöver; välkomna, snarare än att motsätta sig, sena ändringar av kraven; anpassa sig regelbundet till förändrade omständigheter; ha ett nära, dagligt samarbete mellan entreprenörer och utvecklare, där samtal ansikte mot ansikte är den bästa kommunikationsformen.

Den främsta fördelen med agil mjukvaruutveckling är flexibiliteten när det gäller att hantera förändringar, alltid med målet att leverera enligt affärsbehov. Nackdelen är naturligtvis en ökning av komplexiteten i att hantera omfattning, planering och budgetering. En annan vanlig risk är begränsad uppmärksamhet på (teknisk) dokumentation.

Inkrementell utveckling

Inkrementell mjukvaruutveckling är en blandning av agil och vattenfallsutveckling. En applikation designas, implementeras och testas stegvis så att varje inkrement kan levereras till slutanvändaren. Projektet är inte avslutat förrän det sista steget är klart. Det syftar till att förkorta vattenfallet genom att definiera mellanliggande steg och använda några av fördelarna med smidig utveckling. Baserat på feedback som erhållits på ett tidigare inkrement, kan justeringar göras vid leverans av nästa inkrement. Nästa steg kan bestå av ny kod såväl som modifieringar av tidigare tillhandahållen kod.

Fördelen är att formaliteterna finns kvar, men förändringshanteringen blir lättare. Kostnaden för att testa och distribuera en applikation flera gånger kommer att vara högre än att göra det bara en gång.

Program Flödeskontroll

Att välja ett tillvägagångssätt för programflödeskontroll är en mycket arkitektonisk uppgift. Målet är att skapa en ritning av din applikation där allt verkar ha sin egen plats när du väl börjar lägga till funktionalitet och kod. Om du någonsin har granskat eller skrivit högkvalitativ kod förstår du denna princip

Organisationskod

Det första steget i att utforma programflödet är att organisera koden, upprätta en uppsättning regler för att skapa en plan, eller disposition, av applikationen. Underhåll, felsökning och buggfixning sker lättare eftersom koden finns på en logisk plats. När du har gjort grundarbetet kan du välja en metod för att implementera din applikationslogik.

Designmönster bör spela en viktig roll vid utformningen av programflödeskontroll. Under åren har det skrivits mycket kod och många lösningar har designats för återkommande problem. Dessa lösningar är etablerade i designmönster. Att tillämpa ett designmönster på ett vanligt programvarudesignproblem hjälper dig att skapa lösningar som är lätta att känna igen och kan implementeras av dina kamrater. Unika problem kommer fortfarande att kräva unika lösningar, men du kan använda designmönster för att vägleda dig i att lösa dem.

Skapar projektet

Skikten

Det första steget är att överväga de logiska lagren. Observera att lager inte är detsamma som lager, ofta förvirrade eller till och med anses vara samma.

Lager vs lager

Lager handlar om att skapa gränser i din kod. Det övre lagret kan ha referenser till kod i lägre lager, men ett lager kan aldrig ha en referens till kod i ett högre lager. Skiktning avser den fysiska fördelningen av lager över flera datorer. Till exempel, i en applikation med tre nivåer är användargränssnittet utformat för att köras på en stationär dator, applikationslogiken är utformad för att köras på en applikationsserver och databasen körs på en databasserver. Dedikerat datalager och koden i varje lager kan bestå av flera lager.

Figur 8-1: Grundläggande organisation i tre nivåer

Lager hänvisar till nivåer av abstraktion. Skikten som visas i figur 8-1 är sanna för de flesta applikationer. Dessa nivåer kallas också för de tre huvudskikten och kan ha flera andra namn. Som regel kan kod i presentationslagret anropa tjänster i det logiska applikationslagret, men det logiska applikationslagret får inte anropa metoden i presentationslagret. Presentationsskiktet bör aldrig direkt anropa dataåtkomstskiktet, eftersom detta skulle kringgå ansvar som implementerats av applikationslogikskiktet. Dataåtkomstskiktet ska aldrig anropa applikationslogikskiktet.

Lager är bara en abstraktion och förmodligen det enklaste sättet att implementera lager är att skapa mappar i ditt projekt och lägga till kod i lämplig mapp. En mer användbar metod skulle vara att placera varje lager i ett separat projekt och på så sätt skapa separata sammansättningar. Fördelen med att placera din applikationslogik i en bibliotekssammansättning är att den låter dig skapa enhetstester, med hjälp av Microsoft Visual Studio eller NUnit, för att testa logiken. Det skapar också flexibilitet när du väljer var varje lager ska distribueras.

Fysiska lager

I en företagsapplikation bör du förvänta dig att ha flera klienter för samma logik. Det som faktiskt gör en applikation till en företagsapplikation är att den kommer att distribueras i tre lager: klient, applikationsserver och databasserver. Microsoft Office Access-applikationen som skapats av ditt företags försäljningsavdelning, även om den är mycket viktig för försäljningsavdelningen, utgör inte en företagsapplikation.

Observera att applikationslogik- och dataåtkomstskikten ofta distribueras tillsammans på applikationsservern. En del av utformningen av projektet är att välja om du vill få åtkomst till applikationsservern med hjälp av .NET eller webbtjänster. Oavsett vad du väljer kommer du att lägga till lite kod för att enkelt komma åt fjärrtjänsterna i presentationslagret. Om du använder webbtjänster för att komma åt tjänster på din applikationsserver, gör Visual Studio .NET jobbet åt dig och genererar proxykoden, vilket automatiskt tillhandahåller en implementering av fjärrproxymönstret.

Lägga till mönster till lager

De tre grundläggande lagren ger en överblick på hög nivå. Låt oss lägga till några strukturella mönster för att skapa en robust företagsarkitektur. Resultatet visas i figur 8-2.

Fokusera på applikationslogikskiktet. Figur 8-2 visar att åtkomst till applikationslogiken använder fasadmönstret. En fasad är ett objekt som ger ett förenklat gränssnitt till en större kodkropp, till exempel ett klassbibliotek. En fasad kan minska extern kodberoende på bibliotekets interna funktion eftersom de flesta koder använder fasaden, vilket möjliggör mer flexibilitet i systemutvecklingen. För att göra detta kommer fasaden att ge ett grovkornigt gränssnitt till en samling finkorniga föremål.

Beslutsflöde

Programflödeskontroll, även känt som beslutsflöde, handlar om hur du designar tjänsterna i ditt applikationslogiklager eller, som du såg i föregående stycke, hur du designar metoderna i din fasad.

Det finns två sätt att organisera dina tjänster:

  • Handlingsinriktade
  • Statsorienterad

Handlingsorienterat förhållningssätt

Genom att organisera tjänster baserade på användaråtgärder implementerar du applikationslogik genom att erbjuda tjänster, som var och en hanterar en specifik begäran från presentationslagret. Detta är också känt som transaktionsskriptmönstret. Detta tillvägagångssätt är populärt eftersom det är enkelt och känns väldigt naturligt. Exempel på metoder som följer detta tillvägagångssätt är BookStoreService.AddNewOrder(Order order) och BookStoreService.CancelOrder(int orderId).

Logiken som krävs för att utföra åtgärden implementeras mycket sekventiellt i metoden, vilket gör det mycket läsbart men också svårare att återanvända koden. Att använda ytterligare designmönster, såsom bordsmodulmönstret, kan bidra till att öka återanvändbarheten.

Statsorienterat förhållningssätt

Det går även att genomföra ansökans beslutsflöde på ett betydligt mer statligt inriktat sätt. De tjänster som erbjuds av applikationsservern är mer generiska till sin natur, till exempel BookStoreService.SaveOrder(Orderorder). Den här metoden kommer att titta på beställningsstatusen och avgöra om en ny beställning ska läggas till eller avbrytas.

Datastrukturprojekt

Du måste göra flera val när du utformar dina datastrukturer. Det första valet är datalagringsmekanismen, det andra är den avsedda användningen av data och det tredje är versionskrav. Det finns tre sätt att se på datastrukturdesigner:

  • Tjänster erbjuder data; data är en återspegling av relationsdatabasen.
  • Data måste mappas till objekt och tjänster ger tillgång till objekt.
  • Data som erbjuds av tjänster måste vara schemabaserade.

Att välja en av de tre som grund för din dataflödesstruktur bör göras i ett tidigt skede i designprocessen. Många företag har en företagspolicy som kräver ett av tre alternativ för alla projekt, men när det är möjligt bör du omvärdera alternativen för varje projekt och välja den idealiska metoden för det aktuella projektet.

Att välja en datalagringsmotor

När du designar din applikation måste du utan tvekan designa någon typ av datalagring. Följande butiker och former av datalagring är tillgängliga:

  • Spela in
  • app.config-filen
  • XML-filer
  • vanliga textfiler
  • Databas
  • Message Queuing

Varje butik har sina egna unika egenskaper och kan skräddarsys efter specifika krav.

Designa dataflödet

Dataflöde med ADO.NET

När du implementerar datacentrerade tjänster i applikationslogikskiktet kommer du att designa ditt dataflöde med ADO.NET. Klassbiblioteket .NET Framework tillhandahåller ett omfattande applikationsprogrammeringsgränssnitt (API) för att manipulera data i hanterad kod. Kallas ADO.NET, API kan hittas i System.Data-namnområdet. Den fullständiga separationen av media och datalager är en viktig designfunktion hos ADO.NET. Klasser som DataSet, DataTable och DataRow är designade för att lagra data, men de har ingen kunskap om var data kom ifrån. De anses vara agnostiska som datakälla. En separat uppsättning klasser, såsom SqlConnection, SqlDataAdapter och SqlCommand, tar hand om att ansluta till en datakälla, hämta data och fylla i DataSet, DataTable och DataRow. Dessa klasser finns i undernamnsområden som System.Data.Sql, System.Data.OleDB, System.Data.Oracle och så vidare. Beroende på vilken datakälla du vill ansluta till kan du använda klasser i rätt namnutrymme, och beroende på omfattningen av produkten du använder kommer du att upptäcka att dessa klasser erbjuder mer eller mindre funktionalitet.

Eftersom DataSet inte är anslutet till datakällan kan det användas ganska framgångsrikt för att hantera dataflödet i en applikation. Figur 8-5 visar dataflödet när du gör detta.

Låt oss ta en titt på det här projektet och föreställa oss att någon loggat in i din bokhandel och beställt tre böcker. Presentationsskiktet hanterade varukorgens tillstånd. Kunden är redo att lägga beställningen och har lämnat all nödvändig information. Han väljer att skicka order. Webbsidan omvandlar all data till en datauppsättning som innehåller två datatabeller, en för beställning och en för beställning; infogar en DataRow för begäran; och infogar tre DataRows för orderraderna. Webbsidan visar sedan dessa data tillbaka för användaren igen, kontrollerar databindning mot DataSet och frågar Är du säker? Användaren bekräftar begäran och den skickas till programmets logiska lager. Applikationslogikskiktet kontrollerar datamängden för att se om alla obligatoriska fält har ett värde och utför en kontroll för att se om användaren har mer än US$ 1 000. 00 på utestående räkningar. Om allt är ok skickas datauppsättningen till dataåtkomstlagret, som ansluter till databasen och genererar infogningsinstruktioner baserat på datauppsättningsinformationen.

Att använda datamängden på detta sätt är ett snabbt och effektivt sätt att skapa en applikation och använda kraften i Framework Class Library och ASP.NET:s förmåga att binda data till flera kontroller, såsom GridView mot en datauppsättning. Istället för att använda enkla DataSet-objekt kan du använda Typed DataSet-objekt och förbättra kodningsupplevelsen genom att implementera koden i presentationslagret såväl som i applikationslogiklagret. Fördelen med detta tillvägagångssätt är också nackdelen med tillvägagångssättet. Små förändringar i datamodellen leder inte nödvändigtvis till att många metoder måste ändra sina signaturer. Så underhållsmässigt fungerar detta väldigt bra. Om du kommer ihåg att presentationslagret inte nödvändigtvis är ett användargränssnitt kan det också vara en webbtjänst. Och om du ändrar DataSet-definitionen, kanske för att du byter namn på ett fält i databasen, så ändrar du kontraktet som garanterar Som du kan föreställa dig kan detta leda till några betydande problem. Det här scenariot fungerar bra om presentationslagret bara är ett användargränssnitt, men för gränssnitt till externa system eller komponenter vill du dölja det inre arbetet i din applikation och omvandla data till något annat än en direkt klon av din datamodell och du vill skapa dataöverföringsobjekt (DTOs).

Dataflöde med hjälp av objektrelationell mappning

Dataflöde med ADO.NET är ett mycket datacentrerat tillvägagångssätt för att hantera dataflödet. Data och logik är diskreta. Den andra sidan av spektrumet tar ett mer objektorienterat tillvägagångssätt. Här skapas klasser för att gruppera data och beteende. Målet är att definiera klasser som efterliknar data och beteende som finns i affärsdomänen för vilken applikationen skapades. Resultatet benämns ofta som ett affärsobjekt. Samlingen av affärsobjekt som utgör applikationen kallas domänmodellen. Vissa utvecklare hävdar att en rik domänmodell är bättre för att designa mer komplex logik. Det är svårt att bevisa eller motbevisa ett sådant påstående. Vet bara att du har ett val och det är upp till dig att göra det.

Figur 8-6 visar ett dataflöde som liknar figur 8-5, förutom att du nu har lagt till det objektrelationella mappningsskiktet och ersatt DataSet-objekten med olika databärare.

Gör nu samma steg för steg som tidigare; Föreställ dig att någon loggat in i din bokhandel och beställt tre böcker. Presentationsskiktet hanterade varukorgens tillstånd. Kunden är redo att lägga beställningen och har lämnat all nödvändig information. Han väljer att skicka order. Webbsidan omvandlar all data till en DTO, innehåller data för en order och med tre orderrader, skapar objekten efter behov. Webbsidan visar denna data tillbaka till användaren igen, databindande kontroller mot DTO med hjälp av ObjectDataSource i ASP.NET 2.0 och frågar Är du säker? Användaren bekräftar valet och DTO:n skickas till ansökans logiska lager. Applikationslogikskiktet omvandlar DTO till ett affärsobjekt av typen Order med en egenskap som innehåller tre OrderLine-objekt. Beställningsmetoden. Validate() anropas för att validera beställningen och kontrollera om alla obligatoriska fält har ett värde, och en kontroll görs för att identifiera om användaren har mer än R$ 1 000,00 i utestående fakturor. För att göra detta kommer ordern att anropa Order.Customer.GetOutstandingBills(). Om allt är bra anropas metoden Order.Save(). Ordern kommer att skickas till objektrelationsmappningsskiktet, där order- och orderraderna mappas till en datatabell i en datauppsättning, och datauppsättningen skickas till dataåtkomstlagret, som ansluter till databasen och genererar infogningsinstruktioner från informationen i datauppsättningen. Det finns naturligtvis många sätt på vilka objektrelationell mappning kan ske, men inte alla kommer att inkludera transformering till en DataSet. Vissa kommer att skapa insert-satserna direkt, men kommer fortfarande att använda dataåtkomstlagret för att köra den satsen.

Som du kan se sker vissa transformationer. Användningen av DTO:er är nödvändig eftersom ett affärsobjekt implementerar beteende och beteende är föremål för förändring. För att minimera effekten av dessa ändringar på presentationslagret måste du omvandla data från affärsobjektet till ett dataöverföringsobjekt. I Java kallas dataöverföringsobjektet vanligtvis för ett värdeobjekt.

En stor fördel med att arbeta med affärsobjekt är att det verkligen hjälper till att organisera din kod. Om du ser tillbaka på en bit av komplex logik, är den vanligtvis mycket läsbar eftersom det finns väldigt lite VVS-kod. Nackdelen är att de flesta datalager fortfarande är relationella och att kartlägga affärsobjekt till relationsdata kan bli ganska komplicerat.

Schemabaserade tjänster

Du har precis sett två motsatser när det gäller att hantera dataflödet. Många varianter är möjliga. En vanlig är varianten där en datauppsättning används som grundläggande användargränssnittsdatastöd för datalagring, men separata scheman (DTO) används för webbtjänster som anropas från andra system. Applikationsskiktet omvandlar relationsdata till ett fördefinierat schema. Den största fördelen med detta är att alla program som refererar till tjänsten inte är beroende av någon typ av intern implementering av komponenten. Detta möjliggör mer flexibilitet i versionshantering, bakåtkompatibilitet för gränssnitt och möjligheten att ändra komponentimplementeringen utan att ändra tjänstegränssnittet.

Naturligtvis kan du använda affärsobjekt i webbapplikationen och kringgå DTO-transformationen, men detta fungerar i allmänhet bara om applikationslogiken implementeras tillsammans med webbapplikationen. Kom ihåg att för att anropa Order.Save() behöver du en databasanslutning. Om detta är önskvärt är upp till dig och förmodligen din säkerhetschef.