Jag har en webbapplikation som idag används av ett par stycken företag. Under skalet så har jag en hyffsad bra objektmodell, factories o/r-mapper osv..
Men nu kommer vissa kunder med lite andra affärsregler än de som jag en gång byggde siten med. Det kan vara både små och stora saker och samtidigt så är där hela tiden lite småfixar.
Jag har lite problem med hur jag skall strukturera upp detta för att koduppdateringarna skall bli så smidiga som möjligt. När det är småbuggar så vill jag helst gå in och rätta på ett ställe och sedan uppdatera överallt och när det är kundspecifika ändringar så får jag gå in för den aktuella siten. Oftast så använder de sig av samma klasser, så det fungerar om jag ändrar på ett ställe och sedan kompilerar om det hela.
Jag tänkte först att jag skulle låta mina factories skapa olika typer av objekt, men som implementerar samma interface. Problemet med detta är att att det blir ganska mycket jobb då jag skall lägga till en ny kund. Iofs kan jag skapa detta mha av codesmith eller något sånt, men det känns inte rätt. Factoryklasserna skapar sedan instanser av rätt objekt, med rätt regler för den aktuella kunden. Detta skulle kunna fungerar, men på något sätt så känns det som om jag krånglar till. Alternativ så skapar jag specifika interface för kunden, men detta känns ännu värre.
Alternativet är att ha en unik kodbas för varje kund och sedan copy/paste för buggfixarna, men det känns inte riktigt seriöst och det blir lätt man missar något.
Någon som har lite tips om hur man kan lösa det snyggt?
Det problemet kommer du aldrig få löst på ett bra sätt.
Det enda tipset som jag har är att all kod som är gemensam skall ligga i egna komponenter så att om du hittar en bug så rättas den på ett ställe och updateras sedan till alla.
Specifik kod som affärslogiken skall splittas ut till varje enskilt projekt och får rättas då varje ställe. Man kan underlätta hanteringen av affärslogiken lite genom att designa upp sin OO-modell på ett bra sätt. Här kommer ett lite exempel.
Säg att du har en affärslogiksklass som tar in 2 värden och lägger ihop dem och sedan skickar tillbaka svaret. Så fungerar 4 av din 5 siter. Men de 5 siten vill inte bara lägga ihop värden utan vill även multiplicera med en valutafaktor. En lösning blir då att skapa en basklass för affärslogiken som gör additionen och varje site har en egen affärslogikklass som ärver från denna basklass, men i 4 av de 5 klasserna så wrappar man bara basklassensmetod och returneran svaret direkt därifrån, medans i det femte fallet så tar man basklassensmetod och multiplicerar svaret därifrån med valutafaktorn och sedan returnerar man det svaret.
Det betyder att om det nu visar sig att du inte alls skulle lägga ihop de 2 värden utan skulle subtraherar dem istället så behöver du bara ändra på 1 ställe och vips så slår det igenom på de 5 olika websiter även om de faktiskt har olika affärslogiker.
Så en bra OO-design där du fokuserar på arv, abstrakta methoder och polymorfism (eller hur det nu stavas) kan hjälpa dig en bit på vägen.
- M
260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25