window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() ATT HA ELLER ATT VARA? - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2016-09-10
Utveckling av programvara

ATT HA ELLER ATT VARA?

Katarzyna Jaruga

När man lär sig objektorienterad programmering, och efter att ha lärt sig grunderna i objekt, fält och metoder, ägnar man den mesta tiden åt arv. Arv innebär att vi förvärvar en del av implementationen från en basklass. Man behöver bara skapa en subklass av en basklass för att ärva alla icke-privata fält och metoder.

En bil och ett flygplan är fordon så det är uppenbart att båda dessa klasser bör utökas från sin gemensamma basklass som heter Vehicle. Detta är ett typiskt akademiskt exempel, men när vi beslutar om att binda dessa klasser med arvsrelationen bör vi vara medvetna om vissa konsekvenser.

Fig. 1 Implementering av arvsrelation.

I det här fallet är klasserna nära kopplade till varandra - det innebär att förändringar i beteendet hos varje klass kan uppnås genom att göra ändringar i basklassen kod. Detta kan vara både en fördel och en nackdel - det beror på vilken typ av beteende vi förväntar oss. Om arvet tillämpas vid fel tidpunkt kan processen med att lägga till en ny funktion stöta på vissa implementeringssvårigheter eftersom den inte passar in i den skapade klassmodellen. Vi måste välja mellan att duplicera koden och att omorganisera vår modell - och det kan vara en riktigt tidskrävande process. Vi kan kalla den kod som exekverar arvsrelationen för "öppen-stängd" - det betyder att den är öppen för tillägg men stängd för modifiering. Om vi antar att det i Vehicle-klassen finns en allmän, definierad motordrift för varje fordon, skulle vi behöva göra stora förändringar i våra klasser om vi vill lägga till en modell för ett motorlöst fordon (t.ex. en cykel) i vår klasshierarki.

klass Fordon
  def start_motor
  slut

  def stoppa_motor
  slut
slut

klass Flygplan < Fordon
  def flytta
    starta_motorn
    ...
    stoppa_motor
  slut
slut

Sammansättning

Om vi bara är intresserade av en del av beteendet hos den befintliga klassen är ett bra alternativ till arv att använda komposition. Istället för att skapa subklasser som ärver alla beteenden (de vi behöver och de vi inte behöver alls) kan vi isolera de funktioner vi behöver och utrusta våra objekt med referenser till dem. På så sätt ger vi upp tanken på att objektet är en typ av ett basobjekt, till förmån för påståendet att den innehåller endast vissa delar av dess egenskaper.

Fig. 2 Använda kompositionen

På detta sätt kan vi isolera den kod som ansvarar för motordriften till den autonoma klassen Engine och endast referera till den i de klasser som representerar fordon med motorer. Genom att isolera funktionerna med hjälp av komposition blir klassstrukturen för Vehicle enklare och inkapslingen av enskilda klasser stärks. Nu är det enda sättet för fordonen att påverka motorn att använda dess publika interface, eftersom de inte längre kommer att ha information om dess implementation. Dessutom kommer det att göra det möjligt att använda olika typer av motorer i olika fordon och till och med tillåta utbyte av dem medan programmet körs. Att använda komposition är naturligtvis inte felfritt - vi skapar en löst sammanhängande klassuppsättning, som lätt kan utökas och är öppen för modifiering. Men samtidigt är varje klass kopplad till många andra klasser och måste ha information om deras gränssnitt.

klass Fordon
slut

Klass Motor
  def start
  slut

  def stopp
  slut
slut

klass Flygplan < Fordon
  def initialisera
    @motor = Motor.ny
  slut

  def flytta
    @motor.start
    @motor.stopp
  slut

  def change_engine(ny_engine)
    @engine = ny_engine
  end
slut

Valet

Båda beskrivna tillvägagångssätten har fördelar och nackdelar, så hur man väljer mellan dem? Arv är en specialisering, så det är bäst att tillämpa dem endast för problem, där det finns "is-a" typrelationer - så vi hanterar den verkliga hierarkin av typer. Eftersom arv tätt länkar klasser tillsammans, bör vi först och främst alltid överväga om vi ska använda komposition eller inte. Komposition bör användas för problem där det finns "har-en"-typrelationer - så klassen har många delar men den är något mer än en uppsättning klasser. Ett flygplan består av delar men är i sig självt något mer - det har ytterligare förmågor, t.ex. att flyga. Om man går vidare med detta exempel kan enskilda delar förekomma i olika specialistvarianter, och då är det ett bra tillfälle att använda arv.

Såväl arv som komposition är bara verktyg som programmerarna har till sitt förfogande, så att välja rätt verktyg för ett visst problem kräver erfarenhet. Så låt oss öva och lära av våra misstag 🙂

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokala tekniknav

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

    sv_SESwedish
    en_USEnglish de_DEGerman da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek sv_SESwedish