Oracle PL/SQL-objekttyper: CREATE TYPE med eksempler

⚡ Smart opsummering

Objekttyper i PL/SQL gør objektorienteret programmering mere Oracle, så du kan modellere virkelige enheder med attributter og metoder. De understøtter konstruktører, arv og lighedssammenligning, så en enkelt skemaniveautype kan gemme og behandle strukturerede data.

  • 🧱 Objekttypekomponenter: En objekttype kombinerer attributter, der lagrer data, og medlemmer eller metoder, der definerer dens behandlingslogik.
  • 🏗️ Opret objekt: Objekttyper oprettes på skemaniveau med CREATE TYPE, og deres metoder defineres i en separat CREATE TYPE BODY.
  • 🔧 Konstruktører: Hver objekttype har en implicit konstruktør opkaldt efter typen, og du kan definere en eksplicit konstruktør til at indstille standardværdier.
  • 🧬 Arv: En IKKE-ENHEDSFULD forældertype udvides med UNDER, så en undertype arver alle forælderattributter og medlemmer.
  • ⚖️ Lighed: En ORDER-medlemsfunktion sammenligner to objektinstanser og returnerer et negativt, nul eller positivt tal.
  • 🤖 AI Assistance: AI-assistenter som f.eks. GitHub Copilot udarbejder CREATE TYPE-definitioner, konstruktører og ORDER-metoder fra en kommentar.

Oracle PL/SQL-objekttyper, der viser CREATE TYPE med attributter og metoder

Hvad er objekttype i PL/SQL?

Objektorienteret programmering er særligt velegnet til at bygge genbrugelige komponenter og komplekse applikationer. Programmer er organiseret omkring "objekter" snarere end "handlinger"; det vil sige, de er designet til at arbejde med og interagere med et helt objekt snarere end en enkelt handling. Denne tilgang giver programmøren mulighed for at udfylde og manipulere detaljer på objekt-entitetsniveau.

Billedet nedenfor viser et eksempel på en objekttype, hvor en bankkonto behandles som en objektenhed. Objektattributterne indeholder værdier – for en bankkonto er disse kontonummer, banksaldo osv. – mens objektmetoderne beskriver handlinger som f.eks. beregning af renten eller generering af en bankudskrift, som hver især kræver en proces for at blive fuldført.

Bankkonto modelleret som en objekttype med attributter og metoder i PL/SQL

In PL / SQL, objektorienteret programmering er baseret på objekttyper. En objekttype kan repræsentere enhver virkelig enhed. Afsnittene nedenfor udforsker objekttyper, deres komponenter og hvordan man opretter og bruger dem.

Komponenter af objekttyper

En PL/SQL-objekttype indeholder primært to komponenter.

  1. Attributter
  2. Medlemmer/metoder

Attributter

Attributter er de kolonner eller felter, hvor data gemmes. Hver attribut er knyttet til den datatype, der definerer behandlings- og lagringstypen for den pågældende attribut. En attribut kan være af et hvilket som helst gyldigt PL/SQL datatype, eller det kan være af en anden objekttype.

Medlemmer/metoder

Medlemmer, eller metoder, er underprogrammer defineret inde i objekttypen. De bruges ikke til at gemme data; i stedet definerer de den behandling, der udføres inde i objekttypen - for eksempel validering af data før udfyldning af objektet. De er deklareret i objekttypespecifikationen og defineret i objekttypens brødtekst. Brødteksten er valgfri: hvis der ikke er nogen medlemmer til stede, har en objekttype ingen brødtekstdel.

Opret objekt i Oracle

En objekttype kan ikke oprettes på underprogramniveau; den kan kun oprettes på skemaniveau. Når objekttypen er defineret i skemaet, kan den bruges i underprogrammer. Objekttypen oprettes ved hjælp af "CREATE TYPE"-sætningen, og typeteksten kan først oprettes, når dens objekttype findes.

Skærmbillederne nedenfor viser CREATE TYPE-syntaksen for objektspecifikationen og CREATE TYPE BODY-syntaksen, der definerer dens metoder.

CREATE TYPE-syntaks, der definerer en objektspecifikation med attributter i Oracle CREATE TYPE BODY-syntaks, der definerer metoderne for en PL/SQL-objekttype

CREATE TYPE<object_type_name> AS OBJECT
(
<attribute_l><datatype>,
.
.
);
/
CREATE TYPE BODY<object_type_name> AS OBJECT
(
MEMBER[PROCEDURE|FUNCTION]<member_name> 
IS
<declarative section>
BEGIN
<execution part>
END;
.
.
);
/

Syntaks forklaring:

  • Syntaksen ovenfor viser oprettelsen af ​​et OBJECT med attributter og et OBJECT BODY med metoder.
  • Metoderne kan også overbelastes i objektets krop.

Erklæring Initialisering af objekttype

Ligesom andre komponenter i PL/SQL skal objekttyper deklareres, før de bruges i et program. Når objekttypen er oprettet, kan den bruges i et underprograms deklarative sektion til at deklarere en variabel af den pågældende objekttype.

Når en variabel deklareres som en objekttype, oprettes der en ny instans af objekttypen under kørsel, og denne nyoprettede instans refereres til med variabelnavnet. På denne måde kan en enkelt objekttype gemme flere værdier under forskellige instanser.

Skærmbilledet nedenfor viser en variabel, der deklareres som en objekttype i en PL/SQL-blok.

Deklaration af en variabel af en objekttype i en deklarativ sektion i en PL/SQL-blok

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Syntaks forklaring:

  • Syntaksen ovenfor viser deklarationen af ​​en variabel som en objekttype i den deklarative sektion.

Når variablen er deklareret som en objekttype i et underprogram, er den atomisk null – hele objektet i sig selv er null. Det skal initialiseres med værdier, før det kan bruges i programmet. Objekter initialiseres ved hjælp af konstruktører.

Konstruktører er den implicitte metode for et objekt, der kan refereres til med samme navn som objekttypen. Skærmbilledet nedenfor viser initialiseringen af ​​en objekttypeinstans.

Initialisering af en objekttypeinstans til null ved hjælp af dens konstruktør

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

Syntaks forklaring:

  • Syntaksen ovenfor viser initialiseringen af ​​objekttypeinstansen med en nullværdi.
  • Selve objektet er ikke længere null, når det er blevet initialiseret, men attributterne i objektet forbliver null, indtil de får tildelt værdier.

Konstruktører

Konstruktører er den implicitte metode for et objekt, der kan refereres til med samme navn som objekttypen. Når objektet refereres til for første gang, kaldes denne konstruktør implicit.

Du kan også initialisere objekter ved hjælp af disse konstruktører. En konstruktør kan defineres eksplicit ved at definere et medlem i objekttypens brødtekst med samme navn som objekttypen.

Eksempel 1: I det følgende eksempel bruger vi objekttypemedlemmet til at indsætte poster i emp-tabellen med værdierne ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Når dataene er indsat, viser vi dem ved hjælp af objekttypemedlemmet. Vi bruger også en eksplicit konstruktør til at udfylde manager-id'et med standardværdien 1001 for den anden post.

Vi udfører det i følgende trin.

  • Trin 1: Opret objekttypen og objekttypens brødtekst.
  • Trin 2: Opret en anonym blok for at kalde objekttypen via den implicitte konstruktør for emp_no 1005.
  • Trin 3: Opret en anonym blok for at kalde objekttypen via den eksplicitte konstruktør for emp_no 1006.

Trin 1) Opret objekttype og objekttypebrødtekst.

Skærmbilledet nedenfor viser emp_object-objekttypespecifikationen, der oprettes med dens attributter og medlemmer.

Oprettelse af emp_object objekttypespecifikationen med attributter og medlemmer

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2,
p_salary NUMBER) RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records);
/

Skærmbilledet nedenfor viser emp_object-typen, der oprettes med den eksplicitte konstruktør og medlemsprocedurerne.

Definering af emp_object-typens krop med en eksplicit konstruktør og medlemsprocedurer

CREATE OR REPLACE TYPE BODY emp_object AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_output.put_line('Constructor fired..');
SELF.emp_no:=p_emp_no;
SELF.emp_name:=p_emp_name;
SELF.salary:=p_salary;
SELF.manager:=1001;
RETURN;
END;
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_no,emp_name,salary,manager);
END;
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_output.put_line('Employee Name:'||emp_name);
Dbms_output.put_line('Employee Number:'||emp_no);
Dbms_output.put_line('Salary:'||salary);
Dbms_output.put_line('Manager:'||manager);
END;
END;
/

Code Forklaring

  • Code linje 1-9: Oprettelse af objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den indeholder definitionen af ​​en konstruktør med kun 3 parametre. (Den faktiske implicitte konstruktør indeholder antallet af parametre svarende til antallet af attributter i objekttypen.)
  • Code linje 10: Oprettelse af typekroppen.
  • Code linje 11-21: Definition af den eksplicitte konstruktør. Tildeling af parameterværdier til attributterne og tildeling af standardværdien '1001' til attributten 'manager'.
  • Code linje 22-26: Definition af medlemmet 'insert_records', hvor attributværdierne indsættes i tabellen 'emp'.
  • Code linje 27-34: Definition af medlemmet 'display_records', som viser værdierne for objekttypeattributterne.

Output:

Type oprettet

Skriv brødtekst oprettet

Trin 2) Opretter en anonym blok til at kalde den oprettede objekttype via den implicitte konstruktør for emp_no 1005.

Skærmbilledet nedenfor viser den anonyme blok, der kalder emp_object gennem den implicitte konstruktør.

Anonym blok kalder emp_object gennem den implicitte konstruktør for emp_no 1005

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1005,'RRR',20000,1000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;

Code Forklaring

  • Code linje 37-45: Indsættelse af poster ved hjælp af den implicitte konstruktør. Kaldet til konstruktøren indeholder det faktiske antal attributværdier.
  • Code linje 38: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
  • Code linje 41: Udtrykket 'guru_emp_det.display_records' kalder medlemmet 'display_records', og attributværdierne vises.
  • Code linje 42: Udtrykket 'guru_emp_det.insert_records' kalder medlemmet 'insert_records', og attributværdierne indsættes i tabellen. Blokken committer derefter transaktion.

Output:

Medarbejders navn: RRR

Medarbejdernummer: 1005

Løn: 20000

Leder: 1000

Trin 3) Opretter en anonym blok til at kalde den oprettede objekttype gennem den eksplicitte konstruktør for emp_no 1006.

Skærmbilledet nedenfor viser den anonyme blok, der kalder emp_object gennem den eksplicitte konstruktør med tre argumenter.

Anonym blokkald emp_object gennem den eksplicitte konstruktør for emp_no 1006

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1006,'PPP',20000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;
/

Produktion

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

Code Forklaring:

  • Code linje 46-53: Indsættelse af posten ved hjælp af den eksplicitte konstruktør.
  • Code linje 46: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
  • Code linje 50: Udtrykket 'guru_emp_det.display_records' kalder medlemmet 'display_records', og attributværdierne vises.
  • Code linje 51: Udtrykket 'guru_emp_det.insert_records' kalder medlemmet 'insert_records', og attributværdierne indsættes i tabellen. Da kun tre argumenter sendes, sætter den eksplicitte konstruktør manager-id'et til standardværdien 1001.

Arv i objekttype

Arveegenskaben giver en underobjekttype adgang til alle attributter og medlemmer af superobjekttypen eller den overordnede objekttype.

Underobjekttypen kaldes den nedarvede objekttype, og superobjekttypen kaldes den overordnede objekttype. Syntaksen nedenfor viser, hvordan man opretter overordnede og nedarvede objekttyper. Skærmbilledet nedenfor viser overordnede (SUPER) typesyntaks markeret som IKKE ENDELIG.

CREATE TYPE-syntaks for en NOT FINAL overordnet objekttype, der bruges i arv

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Syntaks forklaring:

  • Syntaksen ovenfor viser oprettelsen af ​​SUPER-typen. NOT FINAL-klausulen tillader, at typen nedarves.

Skærmbilledet nedenfor viser den nedarvede (SUB) typesyntaks, der er oprettet med nøgleordet UNDER.

CREATE TYPE UNDER-syntaks for en underobjekttype, der arver fra en overordnet objekttype

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

Syntaks forklaring:

  • Syntaksen ovenfor viser oprettelsen af ​​SUB-typen. Den indeholder alle medlemmer og attributter fra den overordnede objekttype.

Eksempel 1: I eksemplet nedenfor bruger vi arveegenskaben til at indsætte en post med manager-id'et '1002' for posten ('RRR', 1007, 20000). Vi udfører programmet i følgende trin.

  • Trin 1: Opret SUPER-typen.
  • Trin 2: Opret SUB-typen og -brødteksten.
  • Trin 3: Opret en anonym blok for at kalde SUB-typen.

Trin 1) Opret SUPER-typen eller overordnet typen.

Skærmbilledet nedenfor viser supertypen emp_object, der oprettes med NOT FINAL-klausulen.

Oprettelse af emp_object NOT FINAL supertypen til arveeksemplet

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50),
p_salary NUMBER)RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records)NOT FINAL;
/

Code Forklaring:

  • Code linje 1-9: Opretter objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den indeholder definitionen af ​​en konstruktør med kun 3 parametre. Den er blevet deklareret som 'IKKE ENDELIG', så det er en overordnet type.

Trin 2) Opret SUB-typen under SUPER-typen.

Skærmbilledet nedenfor viser den nedarvede type sub_emp_object og dens brødtekst, der oprettes.

Oprettelse af den nedarvede type sub_emp_object og dens brødtekst med insert_default_mgr

CREATE OR REPLACE TYPE sub_emp_object 
UNDER emp_object
(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);
/


CREATE OR REPLACE TYPE BODY sub_emp_object 
AS
MEMBER PROCEDURE insert_default_mgr 
IS
BEGIN
INSERT INTO emp
VALUES(emp_no,emp_name,salary,manager);
END;
END;
/

Code Forklaring:

  • Code linje 10-13: Opretter 'sub_emp_object' som den nedarvede type med den ekstra attribut 'default_manager' og en medlemsproceduredeklaration.
  • Code linje 14: Opretter kroppen for den nedarvede objekttype.
  • Code linje 16-21: Definerer den medlemsprocedure, der indsætter poster i tabellen 'emp' med værdierne fra SUPER-objekttypen, bortset fra manager-værdien. For manager-værdien bruges 'default_manager' fra SUB-typen.

Trin 3) Oprettelse af anonym blok til at kalde SUB-typen.

Skærmbilledet nedenfor viser den anonyme blok, der kalder SUB-typen og indsætter standardmanager-id'et.

Anonym blok kalder sub_emp_object-typen for at indsætte et standard manager-id

DECLARE
guru_emp_det sub_emp_object;
BEGIN
guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);
guru_emp_det.insert_default_mgr;
COMMIT;
END;
/

Code Forklaring:

  • Code linje 25: Deklarerer 'guru_emp_det' som typen 'sub_emp_object'.
  • Code linje 27: Initialiserer objektet med den implicitte konstruktør. Konstruktøren har 5 parametre (4 attributter fra PARENT-typen og 1 attribut fra SUB-typen). Den sidste parameter (1002) definerer værdien for default_manager-attributten.
  • Code linje 28: Kald af medlemmet 'insert_default_mgr' for at indsætte posten med standardmanager-id'et, der er angivet i konstruktøren.

Ligestilling af PL/SQL-objekter

Objektinstanser, der tilhører den samme objekttype, kan sammenlignes for lighed. For at gøre dette skal objekttypen bruge en særlig metode kaldet ORDER-metoden.

Denne ORDER-metode skal være en funktion, der returnerer en numerisk type. Den tager to parametre som input (første parameter: id'et for self-objekt-instansen; anden parameter: id'et for en anden objektinstans).

Id'erne for de to objektinstanser sammenlignes, og resultatet returneres som et tal.

  • En positiv værdi angiver, at SELF-objektinstansen er større end den anden instans.
  • En negativ værdi angiver, at SELF-objektinstansen er mindre end den anden instans.
  • Nul angiver, at SELF-objektinstansen er lig med den anden instans.
  • Hvis en af ​​instanserne er null, returnerer funktionen null.

Skærmbilledet nedenfor viser syntaksen for ORDER-medlemsfunktionen, der skal inkluderes i typeteksten for lighedskontrollen.

ORDER medlemsfunktionssyntaks brugt til at sammenligne objektforekomster for lighed

CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
  ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
  RETURN INTEGER IS
  BEGIN
    IF <attribute_name>parameter <attribute_name>THEN
      RETURN -1; --any negative number will do
    ELSIF id>c.id THEN
      RETURN 1; --any positive number will do
    ELSE
      RETURN 0;
    END IF;
  END;
  .
  .
);
/

Syntaks forklaring:

  • Syntaksen ovenfor viser ORDER-funktionen, der skal inkluderes i typeteksten for at kunne udføre lighedstjekket.
  • Parameteren for denne funktion skal være en instans af samme objekttype.
  • Funktionen kan kaldes "obj_instance_1.match(obj_instance_2)", og dette udtryk returnerer den viste numeriske værdi, hvor obj_instance_1 og obj_instance_2 er forekomster af objekttypen.

Eksempel 1: I det følgende eksempel sammenligner vi to objekter. Vi opretter to instanser og sammenligner attributten 'salary' mellem dem. Vi gør dette i to trin.

  • Trin 1: Opret objekttypen og -brødteksten.
  • Trin 2: Opret den anonyme blok for at sammenligne objektinstanserne.

Trin 1) Oprettelse af objekttypen og -kroppen.

Skærmbillederne nedenfor viser emp_object_equality-specifikationen og dens brødtekst, som definerer ORDER-funktionen, der sammenligner salary-attributten.

Oprettelse af objekttypespecifikationen emp_object_equality med en ORDER-funktion Definition af emp_object_equality-typen, der sammenligner salary-attributten

CREATE TYPE emp_object_equality AS OBJECT(
salary NUMBER,
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER);
/
CREATE TYPE BODY emp_object_equality AS
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER 
IS
BEGIN
IF salary<c.salary
THEN RETURN -1;
ELSIF salary>c.salary
THEN RETURN 1;
ELSE
RETURN 0;
END IF;
END;
END;
/

Code Forklaring:

  • Code linje 1-4: Opretter objekttypen 'emp_object_equality' med 1 attribut og 1 medlem.
  • Code linje 6-16: Definition af ORDER-funktionen, der sammenligner attributten 'salary' for SELF-instansen og parameterinstansen. Den returnerer en negativ værdi, hvis SELF-lønnen er mindre, en positiv værdi, hvis SELF-lønnen er større, og 0, hvis lønningerne er ens.

Code Output:

Type oprettet

Trin 2) Oprettelse af den anonyme blok for at sammenligne objektinstanserne.

Skærmbilledet nedenfor viser den anonyme blok, der sammenligner to emp_object_equality-instanser efter løn.

Anonym blok, der sammenligner to emp_object_equality-instanser efter løn

DECLARE
l_obj_1 emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_1:=emp_object_equality(15000); 
l_obj_2:=emp_object_equality(17000);
IF l_obj_1.equals(l_obj_2)>0
THEN
Dbms_output.put_line('Salary of first instance is greater');
ELSIF l_obj_1.equals(l_obj_2)<0
THEN
Dbms_output.put_line('Salary of second instance is greater'); 
ELSE
Dbms_output.put_line('Salaries are equal');
END IF;
END;
/

Produktion

Salary of second instance is greater

Code Forklaring:

  • Code linje 20: Deklarerer 'l_obj_1' af typen 'emp_object_equality'.
  • Code linje 21: Deklarerer 'l_obj_2' af typen 'emp_object_equality'.
  • Code linje 23: Initialiserer 'l_obj_1' med lønværdien '15000'.
  • Code linje 24: Initialiserer 'l_obj_2' med lønværdien '17000'.
  • Code linje 25-33: Udskriver beskeden baseret på det tal, der returneres af ORDER-funktionen.

Ofte Stillede Spørgsmål

En objekttype modellerer en enkelt enhed i den virkelige verden med attributter og metoder. samling — en VARRAY, en indlejret tabel eller et associativt array — indeholder mange elementer af én datatype. Objekttyper beskriver struktur og adfærd, mens samlinger gemmer flere værdier.

Begge sammenligner objektinstanser. En MAP-metode returnerer en enkelt skalarværdi, der Oracle bruger til at sortere eller sammenligne objekter, mens en ORDER-metode sammenligner to instanser direkte og returnerer et negativt, nul eller positivt tal. En type kan definere den ene eller den anden, ikke begge.

Ja. Du kan oprette en objekttabel, hvor hver række er en objektinstans, eller bruge en objekttype som datatype for en tabelkolonne. Dette giver mulighed for Oracle bevare strukturerede objekter direkte i databasen i stedet for kun i hukommelsen.

En IKKE-INSTANTIBAR type kan ikke oprette objekter direkte; den fungerer som en abstract-base, som andre typer udvider. Kombineret med NOT FINAL definerer den en supertype, hvis undertyper giver den konkrete implementering af dens deklarerede metoder.

Brug ALTER TYPE til at tilføje eller slette attributter og metoder, tilføj CASCADE til at opdatere afhængige objekter, og brug DROP TYPE til at fjerne typen. En type, der stadig bruges af tabeller eller andre typer, kan ikke slettes, før disse afhængige er håndteret først.

Forespørg dataordbogsvisningerne USER_TYPES og ALL_TYPES for typenavne, og USER_TYPE_ATTRS og USER_TYPE_METHODS for deres attributter og metoder. Disse visninger giver dig mulighed for at revidere en eksisterende objektmodel uden at læse kildekoden.

Ja. GitHub Copilot kladder CREATE TYPE-specifikationer, TYPE BODY-metoder, konstruktører og ORDER-funktioner fra en kommentar. RevSe attributdatatyperne, konstruktørparametrene og arvsklausulerne, før den genererede type implementeres.

AI-assistenter analyserer dine tabeller og foreslår objekttyper og attributkortpings og arvshierarkier. Denne maskinlæringsgennemgang markerer redundante attributter, manglende konstruktører og for dyb arv, før objektmodellen når produktion, hvilket forbedrer vedligeholdelsen.

Opsummer dette indlæg med: