window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = vindue if (w.LeadBooster) { console.warn('LeadBooster findes allerede') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() AT HAVE ELLER AT VÆRE? - The Codest
Codest
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Industrier
    • Fintech og bankvirksomhed
    • E-commerce
    • Adtech
    • Sundhedsteknologi
    • Produktion
    • Logistik
    • Biler
    • IOT
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
Pil tilbage GÅ TILBAGE
2016-09-10
Udvikling af software

AT HAVE ELLER AT VÆRE?

Katarzyna Jaruga

Når man lærer objektorienteret programmering, og efter at have lært det grundlæggende om objekter, felter og metoder, bruger man det meste af tiden på nedarvning. Arv betyder, at vi overtager en del af implementeringen fra en basisklasse. Man skal bare oprette en underklasse af en basisklasse for at kunne arve alle ikke-private felter og metoder.

En bil og et fly er køretøjer, så det er indlysende, at begge disse klasser skal udvides fra deres fælles basisklasse kaldet Vehicle. Dette er et typisk akademisk eksempel, men når vi beslutter os for at binde disse klasser med arverelationen, skal vi være opmærksomme på nogle konsekvenser.

Fig. 1 Implementering af arverelation.

I dette tilfælde er klasserne tæt forbundet med hinanden - det betyder, at ændringer i hver klasses opførsel kan opnås ved at foretage ændringer i basisklassen. Kode. Det kan både være en fordel og en ulempe - det afhænger af, hvilken adfærd vi forventer. Hvis arven anvendes på det forkerte tidspunkt, kan processen med at tilføje en ny funktion støde på nogle implementeringsvanskeligheder, fordi den ikke passer til den oprettede klassemodel. Vi bliver nødt til at vælge mellem at duplikere koden og omorganisere vores model - og det kan være en meget tidskrævende proces. Vi kan kalde den kode, der udfører arverelationen, for "åben-lukket" - det betyder, at den er åben for udvidelser, men lukket for ændringer. Hvis vi antager, at der i Vehicle-klassen er en generel, defineret motordrift for hvert køretøj, vil vi være nødt til at foretage nogle alvorlige ændringer af vores klasser i det øjeblik, vi ønsker at tilføje en motorløs køretøjsmodel (f.eks. en cykel) til vores klassehierarki.

klasse Køretøj
  def start_motor
  slut

  def stop_engine
  end
end

klasse Fly < Køretøj
  def move
    start_motor
    ...
    stop_engine
  end
slut

Sammensætning

Hvis vi kun er interesseret i en del af den eksisterende klasses adfærd, er et godt alternativ til arv at bruge komposition. I stedet for at lave underklasser, der arver alle funktioner (dem, vi har brug for, og dem, vi slet ikke har brug for), kan vi isolere de funktioner, vi har brug for, og udstyre vores objekter med referencer til dem. På den måde opgiver vi tanken om, at objektet er en type af et basisobjekt, til fordel for påstanden om, at Den indeholder kun nogle dele af dens egenskaber.

Fig. 2 Brug af kompositionen

Med denne tilgang kan vi isolere den kode, der er ansvarlig for motordriften, til den selvstændige klasse kaldet Engine og kun henvise til den i de klasser, der repræsenterer køretøjer med motorer. Isolering af funktionerne ved hjælp af komposition vil gøre køretøjets klassestruktur enklere og styrke indkapslingen af de enkelte klasser. Nu er den eneste måde, køretøjerne kan påvirke motoren på, at bruge dens offentlige interface, fordi de ikke længere har oplysninger om dens implementering. Desuden giver det mulighed for at bruge forskellige typer motorer i forskellige køretøjer og endda udveksle dem, mens programmet kører. Det er selvfølgelig ikke fejlfrit at bruge komposition - vi skaber et løst forbundet klassesæt, som nemt kan udvides og er åbent for ændringer. Men samtidig er hver klasse forbundet med mange andre klasser og skal have oplysninger om deres grænseflader.

klasse Køretøj
ende

klasse Motor
  def start
  end

  def stop
  end
slut

klasse Fly < Køretøj
  def initialize
    @motor = Motor.ny
  end

  def move
    @engine.start
    @engine.stop
  end

  def change_engine(ny_motor)
    @engine = ny_engine
  end
end

Valget

Begge de beskrevne tilgange har fordele og ulemper, så hvordan vælger man mellem dem? Arv er en specialisering, så det er bedst kun at anvende dem til problemer, hvor der er "is-a"-typerelationer - så vi har at gøre med det virkelige hierarki af typer. Fordi nedarvning knytter klasser tæt sammen, bør vi for det første altid overveje, om vi skal bruge komposition eller ej. Komposition bør anvendes til problemer, hvor der er "har-en"-typerelationer - så klassen har mange dele, men den er noget mere end et sæt af klasser. Et fly består af dele, men alene er det noget mere - det har yderligere evner, f.eks. at flyve. Hvis man går videre med dette eksempel, kan de enkelte dele forekomme i forskellige specialiserede varianter, og så er det et godt tidspunkt at bruge nedarvning.

Både arv og komposition er kun værktøjer, som programmørerne har til rådighed, så det kræver erfaring at vælge det rigtige værktøj til et bestemt problem. Så lad os øve os og lære af vores fejl 🙂 .

Relaterede artikler

Udvikling af software

Byg fremtidssikrede webapps: Indsigt fra The Codest's ekspertteam

Oplev, hvordan The Codest udmærker sig ved at skabe skalerbare, interaktive webapplikationer med banebrydende teknologier, der leverer sømløse brugeroplevelser på tværs af alle platforme. Lær, hvordan vores ekspertise driver digital transformation og...

DENKODEST
Udvikling af software

Top 10 Letlands-baserede softwareudviklingsvirksomheder

Læs om Letlands bedste softwareudviklingsvirksomheder og deres innovative løsninger i vores seneste artikel. Find ud af, hvordan disse teknologiledere kan hjælpe med at løfte din virksomhed.

thecodest
Løsninger til virksomheder og scaleups

Grundlæggende om Java-softwareudvikling: En guide til succesfuld outsourcing

Udforsk denne vigtige guide til vellykket outsourcing af Java-softwareudvikling for at forbedre effektiviteten, få adgang til ekspertise og skabe projektsucces med The Codest.

thecodest
Udvikling af software

Den ultimative guide til outsourcing i Polen

Den voldsomme stigning i outsourcing i Polen er drevet af økonomiske, uddannelsesmæssige og teknologiske fremskridt, der fremmer it-vækst og et erhvervsvenligt klima.

TheCodest
Løsninger til virksomheder og scaleups

Den komplette guide til IT-revisionsværktøjer og -teknikker

IT-revisioner sikrer sikre, effektive og kompatible systemer. Lær mere om deres betydning ved at læse hele artiklen.

Codest
Jakub Jakubowicz CTO og medstifter

Tilmeld dig vores vidensbase, og hold dig opdateret om ekspertisen fra it-sektoren.

    Om os

    The Codest - International softwareudviklingsvirksomhed med tech-hubs i Polen.

    Storbritannien - Hovedkvarter

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

    Polen - Lokale teknologiske knudepunkter

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

      Codest

    • Hjem
    • Om os
    • Serviceydelser
    • Casestudier
    • Ved hvordan
    • Karriere
    • Ordbog

      Serviceydelser

    • Det rådgivende
    • Udvikling af software
    • Backend-udvikling
    • Frontend-udvikling
    • Staff Augmentation
    • Backend-udviklere
    • Cloud-ingeniører
    • Dataingeniører
    • Andet
    • QA-ingeniører

      Ressourcer

    • Fakta og myter om at samarbejde med en ekstern softwareudviklingspartner
    • Fra USA til Europa: Hvorfor beslutter amerikanske startups sig for at flytte til Europa?
    • Sammenligning af Tech Offshore-udviklingsknudepunkter: Tech Offshore Europa (Polen), ASEAN (Filippinerne), Eurasien (Tyrkiet)
    • Hvad er de største udfordringer for CTO'er og CIO'er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Vilkår for brug af hjemmesiden

    Copyright © 2025 af The Codest. Alle rettigheder forbeholdes.

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