1. Företagets historia

Jag vill berÀtta en historia som visar hur OOP hjÀlper till att bekÀmpa komplexiteten hos stora system. Detta Àr nödvÀndigt för att du ska förstÄ syftet med OOP .

Det var en gÄng ett litet företag som tillhandahöll intergalaktiska frakttjÀnster...

LÄt oss kalla det Galaxy Rush. Den sysselsatte 5 personer. En arbetade med ekonomi, den andra arbetade pÄ ett lager, den tredje skötte leveranserna, den fjÀrde skötte reklam och den femte skötte hela företaget.

De var vÀldigt hÄrt arbetande och lyckades med allt. Företaget hade ett gott rykte och tjÀnade mycket pengar. Men varje Är kom det fler och fler bestÀllningar, sÄ chefen fick anstÀlla ytterligare medarbetare. Flera till för lagret, flera till för leveranser, en till för ekonomi och ytterligare en annonsexpert för att utöka företagets marknadsandel.

Och det var dÄ problemen började. Det var fler mÀnniskor och de började komma i vÀgen för varandra.

Marknadsförarens utgifter tömmer bankkontot pÄ en ny reklamkampanj, sÄ det finns inga pengar för att köpa produkter som akut mÄste skickas.

Lagret har 10 helt nya hyperdiskar som skickas till en kund en gÄng i mÄnaden. En kurir flög in och tog bort en hyperdrive för en annan kund, vilket gjorde att den vanliga bestÀllningen pÄ 10 hyperdriven blev försenad med en mÄnad. Den första kuriren visste helt enkelt inte om den andra bestÀllningen fylldes av den andra kuriren.

Den nya assisterande chefen skickar ivÀg en kurir pÄ ett rymdskepp för att köpa mer varor. Samtidigt vÀntar alla andra pÄ att ett tillgÀngligt rymdskepp ska dyka upp. Det finns massor av brÄdskande leveranser, men den hÀr assistenten övervakar bara upphandlingen och försöker göra sitt jobb bra. Ju bÀttre en anstÀlld utför sina arbetsuppgifter, desto mer stör han andras arbete.

NÀr chefen analyserar situationen inser han att viktiga resurser som rymdskeppet, kontanter och produkter inte anvÀnds optimalt. IstÀllet omfattas de av regeln "du snooze, du förlorar". Vilken anstÀlld som helst skulle kunna ta en resurs som alla andra behöver för sitt arbete och dÀrmed Àventyra de andra anstÀllda och företaget som helhet.

NÄgot mÄste göras, sÄ chefen bestÀmde sig för att dela upp det monolitiska företaget i nÄgra avdelningar. Han skapade en fraktavdelning, en marknadsavdelning, en inköpsavdelning, en ekonomiavdelning och en lageravdelning. Ingen lÀngre kunde bara ta rymdskeppet. Chefen för fraktavdelningen fick all information om leveranserna och utfÀrdade fartyget till kuriren med den mest lönsamma bestÀllningen. Dessutom tillÀt lagret inte kurirer att helt enkelt ta alla varor de ville ha. Plockningen av produkter frÄn lagret blev istÀllet en kontrollerad process. Ekonomiavdelningen skulle inte slÀppa pengar för en marknadsföringskampanj om den visste att det skulle bli ett köp snart. Varje avdelning hade ett offentligt ansikte - avdelningschefen.Varje avdelnings interna struktur var sin egen verksamhet. Om en kurir ville fÄ produkter gick hon till lagerchefen, inte till lagret. Om en ny bestÀllning kom in togs den emot av chefen för fraktavdelningen ( ) public-facing representativeoch inte av en kurir ( someone not authorized to interact with the other departments).

Med andra ord konsoliderade chefen resurserna och ÄtgÀrderna som involverade resurser i grupper (avdelningar) och förbjöd Àven andra att störa avdelningarnas interna strukturer . Interaktioner mellan avdelningarna mÄste gÄ genom en specifik person.

Ur OOPs synvinkel Àr detta inget annat Àn att dela upp programmet i objekt. Ett monolitiskt program av metoder och variabler blir ett program som bestÄr av objekt. Och objekten har variabler och metoder.

Problemet var att vilken anstÀlld som helst kunde arbeta med vilken resurs som helst och ge kommandon till vilken annan anstÀlld som helst, allt utan tillsyn eller kontroller. Vi införde en liten begrÀnsning, men uppnÄdde mer ordning. Och vi kunde ocksÄ bÀttre kontrollera allt.

Detta Àr dela-och-hÀrska i sin renaste form.


2. Hur program skapas

Jag vill beröra ytterligare en viktig punkt som avslöjar en annan fördel med OOP . Ser du att program Àr mer som djur Àn byggnader? De Àr inte byggda. De Àr odlade. Utveckling Àr stÀndig förÀndring. Inom byggandet kan du ha en bra plan och följa den med precision. SÄ Àr inte fallet med mjukvaruutveckling.

Mycket ofta i programmering kan du inte göra nÄgot som du ursprungligen tÀnkt dig och mÄste omarbeta mycket. Kundernas krav förÀndras Ànnu oftare.

Men vad hÀnder om kunden lÀmnade en mycket exakt specifikation? Det gör saken Ànnu vÀrre. Ta en titt pÄ vad som hÀnder med produkten över tiden.

Produktens framgÄng kommer att leda till att kunden vill slÀppa en ny version, och sedan en och en till. Och, naturligtvis, allt du behöver göra Àr att lÀgga till "smÄ Àndringar" i den befintliga produkten. SÄ du kan se produktutveckling Àr en sekvens av stÀndiga förÀndringar. Bara tidsskalan Àr annorlunda. En ny version kan slÀppas en gÄng i veckan, en gÄng i mÄnaden eller en gÄng var sjÀtte mÄnad.

Och vilken slutsats kan vi dra av allt detta? Produktens interna struktur mÄste bibehÄllas pÄ ett sÀtt som gör att betydande (och mindre) Àndringar kan göras med minimal omarbetning.

ObjektsammanhÄllning

Men att göra det Àr svÄrare Àn att bestÀmma sig för att göra det. Vi har redan sagt att ett program bestÄr av objekt som interagerar med varandra. LÄt oss rita alla vÄrt programs objekt pÄ tavlan och representera dem med poÀng. Och lÄt oss rita pilar frÄn varje objekt (punkt) till alla andra objekt (punkter) som det interagerar med.

Nu ska vi kombinera objekten (punkterna) i grupper. Punkter bör grupperas om kopplingarna mellan dem Àr mycket intensivare Àn de med andra punkter. Om de flesta av pilarna frÄn en punkt gÄr till andra punkter i den egna gruppen, sÄ bildades grupperna korrekt. Vi sÀger att punkterna inom en grupp har hög sammanhÄllning medan poÀng i olika grupper har lÀgre sammanhÄllning.

Löskopplingsprincip

Det finns en "princip om lös koppling". Ett program Àr uppdelat i flera delar, som ofta Àr lager. Logiken hos dessa lager/delar Àr tÀtt kopplad till deras inre struktur och mycket löst kopplad till andra lager/delar. Interaktioner mellan lager Àr vanligtvis mycket reglerade. Ett lager kan referera till det andra lagret och endast anvÀnda en liten delmÀngd av dess klasser. Det Àr principen att "dela upp företaget i avdelningar" vi sÄg tidigare, men i större skala.

Resultatet Àr att vi kan omorganisera en avdelning efter behov för att öka dess effektivitet och vi kan anstÀlla Ànnu fler personer till avdelningen, och sÄ lÀnge vi inte Àndrar protokollet för interaktion med vÄra andra avdelningar, kommer alla Àndringar som görs att förbli lokal. Ingen behöver lÀra sig nÄgonting igen. Du behöver inte omarbeta hela systemet. Varje avdelning kan göra denna typ av intern optimering om mekanismerna för interdepartemental interaktion Àr vÀl valda.

VÀl vald. Men vad hÀnder om de inte Àr vÀl valda? DÄ Àr förÀndringskapaciteten snabbt uttömd och du mÄste göra om hela systemet. Detta mÄste göras dÄ och dÄ. Du kan inte förutsÀga framtiden, men du kan hÄlla antalet omstÀllningar till ett minimum.

Abstraktionsprincipen

Att vÀlja hur avdelningar Àr uppbyggda och hur de samverkar Àr " abstraktionsprincipen" . I programmering anvÀnds det för att bestÀmma det bÀsta sÀttet att dela upp ett program i bestÄndsdelar och hur dessa delar ska interagera. Vi kan ÄteranvÀnda principen, dela upp de resulterande delarna i delar, tills vi har delat upp programmet i individuella klasser.

Att dölja den interna strukturen hos dessa delar och strikt begrÀnsa interaktioner med andra delar Àr inkapsling . Inkapsling och abstraktion Àr hörnstenar i OOP . Ett bra program mÄste följa dessa tvÄ principer. I framtiden kommer vi att titta pÄ resten av principerna och utforska vilka fördelar de ger.