Hjem » Siste artikler » Objektorientert programmering forklart enkelt: slik kommer du i gang med klasser i C#

Objektorientert programmering forklart enkelt: slik kommer du i gang med klasser i C#

Hovedillustrasjon
Hovedillustrasjon. Foto: Daniil Komov / Pexels.

Mange som lærer programmering, hopper rett på funksjoner, variabler og if-setninger. Det fungerer fint i små prosjekter, men blir fort uoversiktlig når ting vokser. Da trenger du en bedre måte å organisere logikken din på.

Her kommer objektorientert programmering og klasser inn. I denne artikkelen ser vi praktisk på hva en klasse er, hvorfor du bør bry deg, og hvordan du kan bruke klasser i C# for å skrive ryddigere og mer gjenbrukbar kode.

Hva er en klasse, egentlig?

En klasse er en mal for å lage objekter. Du kan tenke på det som en «oppskrift» eller «tegning» for noe i programmet ditt: for eksempel en kunde, et produkt eller en oppgave i en to-do-liste.

Klassen beskriver hvilke data som hører til (felter og egenskaper) og hvilke handlinger den kan gjøre (metoder). Når du bruker klassen til å lage en konkret instans, får du et objekt som følger denne oppskriften.

Et enkelt eksempel: en klasse for oppgaver

La oss si at du lager en enkel konsollapp som holder orden på oppgaver. Uten klasser kunne du hatt flere parallelle lister: en for titler, en for datoer og en for om oppgaven er ferdig. Det blir fort rot.

Med en klasse kan du samle alt som hører til én oppgave på ett sted:

Eksempel i C#:

Merk:Kodene er for læring, ikke direkte produksjon. Tilpass alltid til ditt eget prosjekt.

using System;

public class Oppgave
{
public string Tittel { get; set; }
public DateTime Frist { get; set; }
public bool Ferdig { get; private set; }

public Oppgave(string tittel, DateTime frist)
{
Tittel = tittel;
Frist = frist;
Ferdig = false;
}

public void MarkerSomFerdig()
{
Ferdig = true;
}

public void SkrivUtInfo()
{
Console.WriteLine($”{Tittel} (frist: {Frist.ToShortDateString()}) – ” +
(Ferdig ? “Ferdig” : “Ikke ferdig”));
}
}

Hva denne klassen gjør, steg for steg

I eksemplet over har vi kombinert data og logikk på en ryddig måte. La oss bryte det ned i mindre biter.

Først har vi tre egenskaper:

  • Tittel: en tekststreng som beskriver oppgaven.
  • Frist: en dato som sier når oppgaven senest bør gjøres.
  • Ferdig: en boolsk verdi som forteller om oppgaven er fullført.

Legg merke til atFerdigharprivate set. Det betyr at den kan leses utenfra, men bare endres inne i klassen selv. Dette er et enkelt eksempel på innkapsling.

Konstruktøren: hvordan du lager et gyldig objekt

Konstruktøren er metoden som har samme navn som klassen. Den brukes når du oppretter et nytt objekt mednew. Her sørger vi for at alle nye oppgaver får en tittel, en frist og starter som ikke ferdige.

Når du vil lage et nytt objekt, kan du gjøre noe som dette i programmet ditt:

var oppgave1 = new Oppgave(“Skriv første utkast til artikkel”, DateTime.Today.AddDays(2));
oppgave1.SkrivUtInfo();
oppgave1.MarkerSomFerdig();
oppgave1.SkrivUtInfo();

Poenget er at du slipper å holde styr på løse variabler. Alt som har med oppgaven å gjøre, ligger pent samlet i én instans.

Hvorfor klasser gjør livet enklere når programmet vokser

Tematisk illustrasjon
Tematisk illustrasjon. Foto: Katerina Holmes / Pexels.

I små eksempler kan det virke som ekstra jobb å lage klasser. Men når du får flere typer data og mye logikk, blir fordelene tydelige.

  • Bedre oversikt: Du kan åpne én fil og se all logikk som hører til et bestemt konsept.
  • Mindre duplisering: Felles funksjonalitet kan ligge i én klasse i stedet for kopiert flere steder.
  • Lettere vedlikehold: Endringer gjøres på ett sted, og du slipper å lete gjennom hele prosjektet.

Dette er særlig nyttig i litt større prosjekter, som et nettbasert administrasjonssystem eller en app med mange skjermbilder.

Flere objekter av samme klasse

En klasse er bare malen, det som blir interessant er objektene du lager av den. Hver instans har sine egne data, men deler samme struktur og funksjoner.

For vår oppgave-klasse kan du ha mange oppgaver i en liste:

var oppgaver = new List<Oppgave>();

oppgaver.Add(new Oppgave(“Handle mat”, DateTime.Today));
oppgaver.Add(new Oppgave(“Vaske kjøkken”, DateTime.Today.AddDays(1)));
oppgaver.Add(new Oppgave(“Lese fagbok”, DateTime.Today.AddDays(7)));

foreach (var oppgave in oppgaver)
{
oppgave.SkrivUtInfo();
}

Du kan også sende disse objektene til metoder, lagre dem i databaser eller konvertere dem til JSON ved hjelp av rammeverk som støtter det.

Enkel innkapsling: beskytte tilstanden din

Innkapsling handler om å begrense hvem som kan endre hva. I stedet for at alt kan endres fritt utenfra, tilbyr klassen trygge metoder som tar seg av oppdateringer.

I eksemplet har vi gjortFerdigkun skrivbar fra innsiden av klassen. Det hindrer resten av programmet i å sette tilfeldige verdier, og sørger for at all endring skjer gjennom metodenMarkerSomFerdig(). Dette gjør det enklere å legge til ekstra logikk senere, for eksempel logging eller validering.

Et lite designgrep: én klasse per fil

Når du jobber i C# i et prosjekt, er det vanlig å legge hver klasse i sin egen fil. Filnavnet matcher som regel klassenavnet, for eksempelOppgave.cs.

Det gjør det enklere å finne frem, og verktøy som Visual Studio eller JetBrains Rider gir deg rask navigasjon mellom klassene. På sikt hjelper det deg med å tenke i moduler i stedet for i én stor fil der alt ligger blandet sammen.

Hva du kan gjøre videre

Når du forstår poenget med enkle klasser, er neste naturlige steg å se på begreper som arv og grensesnitt. Men før du går dit, er det lurt å være trygg på å:

  • Identifisere «ting» i programmet ditt som fortjener en egen klasse.
  • Samle data og metoder som hører sammen.
  • Bruke konstruktører for å sikre at objekter starter i en fornuftig tilstand.

Hvis du allerede har et lite prosjekt, kan du prøve å ta én del av det og flytte logikken inn i en klasse. Det gir ofte raskt en følelse av at strukturen blir ryddigere, og du får direkte erfaring med hvordan objektorientert tenkning kan hjelpe deg i hverdagslig utvikling.

0 kommentarer