Undersøg strukturen af objektorienterede programmer

Fuldført

Objektorienteret programmering (OOP) bruger objekter til at modellere objekter i den virkelige verden.

For udviklere, der kender til struktureret programmering, kan en sammenligning mellem struktureret programmering og objektorienteret programmering hjælpe med at tydeliggøre forskellene mellem de to tilgange. Derudover kan en øget forståelse af indkapsling og klasselivscyklus hjælpe dig med at udvikle sikre og robuste løsninger.

Sammenlign Object-Oriented programmering med struktureret programmering

Struktureret programmering og objektorienteret programmering (OOP) er to forskellige tilgange til softwareudvikling, der hver især har sit eget sæt principper og metoder. Struktureret programmering er baseret på en top-down tilgang, hvor programmet er opdelt i mindre, håndterbare funktioner eller procedurer. Denne fremgangsmåde lægger vægt på et klart og logisk flow af kontrol ved hjælp af løkker, betingelser og subrutines. Objektorienteret programmering organiserer softwaredesign omkring objekter, der indkapsler både data og funktionsmåde, og fremmer en mere modulopbygget og genbrugelig kodestruktur. Selvom struktureret programmering fokuserer på rækkefølgen af handlinger, der skal udføres, lægger objektorienteret programmering vægt på de objekter, der er involveret i handlingerne.

Vi kan bruge virkelige eksempler på byggeprojekter som metaforer til at illustrere forskellene mellem struktureret programmering og objektorienteret programmering.

eksempel på Object-Oriented programmering

Forestil dig objektorienteret programmering som design og oprettelse af en by. I denne metafor repræsenterer hver bygning en klasse, og hver bygnings lokaler og faciliteter repræsenterer den pågældende klasses egenskaber og metoder. Ligesom en by består af forskellige bygninger, der hver især tjener et bestemt formål (bolig, kommercielle, industrielle), er et OOP-program sammensat af forskellige klasser, der hver især er designet til at håndtere specifikke opgaver. Bygningerne (klasser) er konstrueret på baggrund af kursusplaner (klassedefinitioner), og hver bygning kan have flere instanser (objekter), der deler den samme struktur, men som kan have forskellige tilstande (data).

I denne by er indkapsling som væggene i en bygning, der beskytter dens interne struktur og kun tillader adgang gennem udpegede døre og vinduer (metoder). Indkapsling sikrer, at en bygnings interne funktioner (klasse) er skjult for omverdenen, og at interaktioner med bygningen styres og er sikre.

Denne by-bygning metafor fremhæver de modulære og genbrugelige karakter af OOP, hvor hver klasse (bygning) kan udvikles, testes og vedligeholdes uafhængigt, men de arbejder alle sammen for at danne en sammenhængende og funktionel by (program). Ligesom en velplanlagt by giver mulighed for effektiv administration og skalerbarhed, fremmer et veldesignet OOP-program vedligeholdelse, fleksibilitet og skalerbarhed.

Eksempel på struktureret programmering

Forestil dig struktureret programmering som at lave et quilt. I denne metafor repræsenterer hvert stykke stof en funktion eller procedure i dit program. Ligesom et quilt består af mange individuelle programrettelser syet sammen, er et struktureret program består af forskellige funktioner, der er designet til at udføre specifikke opgaver. Hver funktion er som en programrettelse, der kan udvikles, testes og vedligeholdes uafhængigt af hinanden. Når du syer disse programrettelser sammen i en bestemt rækkefølge, opretter du et komplet quilt, ligesom du kombinerer funktioner for at danne et komplet program.

I struktureret programmering er fokus på det logiske flow af kontrol, ligesom en quilter planlægger layoutet og rækkefølgen af programrettelser for at skabe et sammenhængende design. Quilteren sikrer, at hvert plaster passer perfekt sammen med de andre og bevarer et klart og organiseret mønster. På samme måde sikrer en struktureret programmør, at hver funktion passer problemfrit ind i det overordnede program og opretholder et klart og logisk flow af kontrol gennem brug af løkker, betingede og subrutiner.

Denne quiltingmetfor fremhæver den modulære karakter af struktureret programmering, hvor hver funktion (eller programrettelse) kan genbruges og omarrangeres efter behov. Ligesom en quilter kan erstatte eller ændre individuelle programrettelser uden at forstyrre hele quilt, kan en programmør opdatere eller tilpasse individuelle funktioner uden at påvirke hele programmet. Denne modularitet gør struktureret programmering til en effektiv metode til at oprette klar, vedligeholdbar og genbrugelig kode. Men i takt med at programmet vokser i størrelse og kompleksitet, kan administration af interaktioner mellem funktioner blive mere udfordrende. Ligesom et quilt med for mange programrettelser kan blive besværligt og svært at administrere, kan et struktureret program med mange funktioner og procedurer blive besværligt og svært at vedligeholde. I takt med at antallet af programrettelser (funktioner) øges, bliver det mere udfordrende at holde styr på, hvordan de passer sammen og interagerer. Dette fører til problemer som duplikering af kode, problemer med fejlfinding og manglende samhørighed. I store programmer kan den lineære og top-down-tilgang til struktureret programmering resultere i et viklet web af indbyrdes afhængige funktioner, hvilket gør det svært at forstå og ændre kodebasen. Denne kompleksitet kan forhindre skalerbarhed og vedligeholdelse, hvilket i sidste ende påvirker softwarens overordnede kvalitet og ydeevne.

Undersøg brugen af klasser i Object-Oriented Programmering

Klasser er komponenterne i objektorienteret programmering (OOP) og bruges til at definere strukturen og funktionsmåden af objekter i et program. Forståelse af fordelene ved indkapsling og livscyklus for klasser hjælper dig med at forstå, hvordan objektorienteret programmering fungerer.

Indkapsling

Indkapsling er et af de grundlæggende principper for objektorienteret programmering (OOP). Det refererer til bundling af data (felter) og metoder (funktionsmåder), der fungerer på dataene i en enkelt enhed, typisk en klasse. Indkapsling begrænser den direkte adgang til nogle af objektets komponenter, hvilket kan forhindre utilsigtet ændring af data.

Indkapsling giver følgende fordele:

Skjulning af data: Indkapsling gør det muligt at skjule objektets interne tilstand udefra. Det betyder, at den interne repræsentation af et objekt kan ændres, uden at det påvirker den eksterne kode, der bruger objektet. Ved f.eks. at bruge private felter og angive offentlige getter- og settermetoder kan du styre, hvordan dataene tilgås og ændres.

Forbedret vedligeholdelse: Indkapsling gør det nemmere at vedligeholde og ændre kode. Ændringer af den interne implementering af en klasse påvirker ikke den kode, der bruger klassen, så længe den offentlige grænseflade forbliver den samme. Denne adskillelse af bekymringer gør det muligt for udviklere at fokusere på bestemte dele af koden uden at bekymre sig om utilsigtede bivirkninger.

Øget fleksibilitet: Indkapsling giver mulighed for mere fleksibel og modulopbygget kode. Ved at definere tydelige grænseflader kan du nemt erstatte eller opdatere dele af koden uden at påvirke andre dele. Denne modularitet gør det nemmere at genbruge kode og bygge komplekse systemer ud fra enklere komponenter.

Udvidet sikkerhed: Indkapsling hjælper med at beskytte integriteten af et objekts data ved at forhindre uautoriseret adgang og ændring. Ved at styre adgangen til dataene via metoder kan du gennemtvinge regler og begrænsninger for, hvordan dataene bruges. Denne håndhævelse hjælper med at forhindre fejl og sikre, at objektet forbliver i en gyldig tilstand.

Abstraktion: Indkapsling understøtter begrebet abstraktion ved kun at udsætte de nødvendige detaljer om et objekt til omverdenen. Dette forenkler grænsefladen og gør det nemmere at forstå og bruge objektet. Brugere af objektet behøver ikke at kende den interne implementering, hvilket reducerer kodekompleksiteten og forbedrer læsbarheden.

Seddel

Indkapsling handler om at skjule de datamedlemmer, som brugere af en klasse ikke har brug for. Datamedlemmer er indkapslet eller skjult ved hjælp af nøgleordet private accessor. Adgangen til skjulte feltvariabler styres ved hjælp af egenskaber og metoder. Skjulte datamedlemmer er ikke direkte tilgængelige.


public class Person
{
    // Private fields
    private string firstName;
    private string lastName;
    private int age;

    // Public properties with getters and setters
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public int Age
    {
        get { return age; }
        set
        {
            if (value >= 0)
            {
                age = value;
            }
            else
            {
                throw new ArgumentException("Age can't be negative");
            }
        }
    }

    // Public method
    public void Introduce()
    {
        Console.WriteLine($"Hi, I'm {FirstName} {LastName}, and I'm {Age} years old.");
    }
}

I dette eksempel:

  • Felterne firstName, lastNameog age er private, hvilket betyder, at der ikke er direkte adgang til dem uden for klassen.
  • Offentlige egenskaber FirstName, LastNameog Age give kontrolleret adgang til de private felter.
  • Egenskaben Age indeholder valideringslogik for at sikre, at alderen ikke kan angives til en negativ værdi.
  • Metoden Introduce giver dig mulighed for at interagere med objektets data uden at vise de interne implementeringsoplysninger.

Klasselivscyklus

I et C#-program omfatter livscyklussen for en klasse flere faser fra definitionen til dens endelige destruktion. Livscyklussen for en klasse indeholder følgende trin:

  1. Klassedefinition: Definer klassen med dens medlemmer.
  2. Kompilering: Kompiler klassen til IL-kode.
  3. Indlæsning: Indlæs assemblyen i hukommelsen.
  4. Instantiering: Opret en forekomst af klassen.
  5. Initialisering: Initialiser objektets felter og egenskaber.
  6. Anvendelse: Brug objektet i programmet.
  7. Garbage Collection: Reclaim objektets hukommelse, når det ikke længere er nødvendigt.
  8. Destruction: Udfør oprydningslogik, og frigiv hukommelse.

Her er et eksempel, der inkluderer som forklaring på hvert trin i en klasses livscyklus:

  1. Klassedefinition

    Definition: En klasse er defineret i kildekoden med dens egenskaber, metoder og andre medlemmer.

    For eksempel:

    
    public class Person
    {
        // auto-implemented properties for name and age
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    
        // method to introduce the person
        public void Introduce()
        {
            Console.WriteLine($"Hi, I'm {FirstName} {LastName}, and I'm {Age} years old.");
        }
    }
    
    
  2. Samling

    Kompilering: Kildekoden kompileres til et mellemliggende sprog (IL) af C#-compileren. IL-koden gemmes i en assembly (DLL- eller EXE-fil).

    Eksempel: Klassen Person kompileres til IL-kode og inkluderes i assemblyen.

  3. Pålæsning

    Indlæsning: Når programmet kører, indlæser CLR (Common Language Runtime) assemblyen i hukommelsen.

    Eksempel: Den assembly, der indeholder klassen Person, indlæses i hukommelsen af CLR.

  4. Instantiering

    Instantiering: Der oprettes en forekomst af klassen ved hjælp af nøgleordet new. Konstruktøren for klassen kaldes for at initialisere objektet.

    For eksempel:

    
    Person person1 = new Person { FirstName = "Tim", LastName = "Shao", Age = 25 };
    
    
  5. Initialisering

    Initialisering: Konstruktøren initialiserer objektets felter og egenskaber. Enhver initialiseringslogik, der er defineret i konstruktøren, udføres.

    Eksempel: Det Person objekt person1 initialiseres med de angivne værdier for FirstName, LastNameog Age.

  6. Brug

    Format: Objektet bruges i programmet. Metoder og egenskaber for objektet tilgås og ændres efter behov.

    For eksempel:

    
    person1.Introduce();
    
    
  7. Affaldssamling

    Affaldsindsamling: Når objektet ikke længere er nødvendigt, og der ikke er nogen referencer til det, genvinder affaldsopsamleren (GC) den hukommelse, der bruges af objektet. Destructoren (finalizer) kaldes, hvis den er defineret.

    Eksempel: Hvis der ikke længere refereres til person1 nogen steder i koden, vil GC til sidst genvinde hukommelsen.

  8. Ødelæggelse

    Destruktion: Objektets hukommelse frigives, og enhver oprydningslogik, der er defineret i destruktoren (finalizeren, hvis der er angivet en), udføres.

    Eksempel: Det Person objekt person1 ødelægges, og hukommelsen genvundet af GC.