Skip to content

Klasse

Classificeren betekent het organiseren of categoriseren van objecten op basis van gemeenschappelijke kenmerken. Door objecten te classificeren kunnen we ze efficiënter groeperen, beheren en aanpassen.

In programmeren werken we veel op basis van dit soort classificeringen. Laten we het voorbeeld van een bibliotheeksysteem nemen om dit concept beter te begrijpen. In dit systeem willen we alle boeken kunnen catalogiseren die in de bibliotheek aanwezig zijn. Hiervoor maken we een Boek-klasse waarin kenmerken worden opgenomen die gemeenschappelijk zijn voor alle boeken. Je kunt denken aan zaken als de titel, het genre, het aantal bladzijden en de publicatiedatum. Hoewel “Harry Potter & de Gevangene van Azkaban” en “Programmeren met Java voor Dummies” totaal verschillende boeken zijn die andere waarden hebben voor deze kenmerken, kan je van beiden boeken zeggen dat ze een schrijver hebben, een aantal bladzijden, etc.

Sommige kenmerken zoals de publicatiedatum, het genre en het aantal bladzijden kunnen we als tekst of cijfers opslaan, maar de auteur heeft ook weer verschillende kenmerken, zoals voornaam, achternaam en geboortedatum. Daarom kunnen we een aparte Auteur-klasse maken om deze kenmerken vast te leggen. Op deze manier creëren we een structuur van onderling verbonden klassen, die samen een gedetailleerd systeem vormen om alle relevante informatie over elk boek in de bibliotheek vast te leggen.

De kracht van deze aanpak is dat alle relevante details over een bepaald boek centraal worden opgeslagen en toegankelijk zijn wanneer je deze later nodig hebt

Voorbeeld:

  1. Wie is de auteur van het boek? Niet alleen de naam, maar ook andere details over de auteur die we in de Auteur-klasse hebben opgeslagen, zoals geboortedatum of andere werken die ze hebben geschreven.
  2. Wanneer is het boek gepubliceerd? Deze informatie is nu gemakkelijk op te vragen voor elk boekobject dat we maken op basis van de Boek-klasse. We kunnen zelfs methoden in onze klassen definiëren om complexere vragen te beantwoorden, zoals:
  3. Hoeveel boeken heeft een bepaalde auteur geschreven?
  4. Hoeveel boeken zijn er in een bepaald genre?
---
title: Bibliotheek voorbeeld
---
classDiagram
    Book --* Author : Author has-a Book
    note for Author "Author heeft een <b>compositie</b> relatie met Book.\nHet verwijst naar een of meer objecten van andere klassen (in dit geval Book).\nDit noemen we ook wel een <i>has-a</i> relatie: Author has a Book. "

    class Book {
        -string titel
        -string genre
        -int numberOfPages
    }

    class Author {
        -string firstName
        -string lastName
        -Date dateOfBirth
        -Book[] books

        +void AddBook(Book book)
        +Book[] GetAllBooks()
    }    
class Book {
    title: string;
    genre: string;
    numberOfPages: number;
}

class Author {
    firstName: string;
    lastName: string;
    dateOfBirth: Date;
    books: Book[];

    addBook(book: Book) : void {
        books.push(book);
    }

    getAllBooks() : Book[] {
        return books;
    }
}
class Book {
    title;
    genre;
    numberOfPages;
}

class Author {
    firstName;
    lastname;
    dateOfBirth;
    books[];

    addBook() {
        books.push(book);
    }

    getAllBooks() {
        return books;
    }
}
class Book
{
    string title;
    string genre;
    int numberOfPages;
}

class Author
{
    string firstName;
    string lastName;
    Date dateOfBirth;
    Book[] books;

    public void AddBook(Book book)
    {
        Book[] tempBooks = new Book[books.Length + 1];
        for (int i = 0; i < books.Length; i++)
        {
            tempBooks[i] = books[i];
        }
        tempBooks[books.Length] = book;
        books = tempBooks;
    }

    public Book[] GetAllBooks => books; 
}
from datetime import datetime
from typing import List

class Book:
    def __init__(self, title: str, genre: str, number_of_pages: int):
        self.title = title
        self.genre = genre
        self.number_of_pages = number_of_pages

class Author:
    def __init__(self, first_name: str, last_name: str, date_of_birth: datetime):
        self.first_name = first_name
        self.last_name = last_name
        self.date_of_birth = date_of_birth
        self.books = []

    def add_book(self, book: Book):
        self.books.append(book)

    def get_all_books(self) -> List[Book]:
        return self.books

In dit stukje code schrijven we een blauwdruk voor een boek en een auteur. Hier kunnen we in principe nog niet zoveel mee doen, net zoals een tekening van een auto niet hetzelfde is als de daadwerkelijke auto, maar deze bevat wel alle informatie die de autofabriek nodig heeft om de auto te maken.

Zo bevatten de classes alle informatie die jouw programma nodig heeft om een boek of een auteur mee te maken. Dit doen we met het new keyword. Op dat moment maken we een object van deze class.

class Author {
    // ...
}

class Book {
    // ...
}

/** class voor ee bibliotheek */
class Bibliotheek {
    CreateAuthor() {
        // maak een nieuw boek
        Book book = new Book();
        // bepaal de eigenschappen van het boek
        book.title = "Harry Potter & de Gevangene van Azkaban";
        book.genre = "Fantasy";
        book.numberOfPages = 326;

        // maak een nieuwe auteur
        Author author = new Author();
        // bepaal de eigenschappen van de auteur
        author.firstName = "Joanne";
        author.lastName = "Rowling";
        author.dateOfBirth = new Date("1965-07-31");
        // voeg het boek toe aan de auteur
        author.addBook(book);
    }
}
class Book {
...
}

class Author {
    ...
}

class Library {
    CreateAuthor() {
        // maak een nieuw boek
        let book = new Book();
        // bepaal de eigenschappen van het boek
        book.title = "Harry Potter & de Gevangene van Azkaban";
        book.genre = "Fantasy";
        book.numberOfPages = 326;

        // maak een nieuwe auteur
        let author = new Author();
        // bepaal de eigenschappen van de auteur
        author.firstName = "Joanne";
        author.lastName = "Rowling";
        author.dateOfBirth = new Date("1965-07-31");
        // voeg het boek toe aan de auteur
        author.addBook(book);
    }
}
class Book
{
...
}

class Author
{
...
}

class Library
{
    public void CreateAuthor()
    {
        Book book = new Book();
        book.title = "Harry Potter & de Gevangene van Azkaban";
        book.genre = "Fantasy";
        book.numberOfPages = 326;

        Author author = new Author();
        author.firstName = "Joanne";
        author.lastName = "Rowling";
        author.dateOfBirth = new Date("1965-07-31");
        author.addBook(book);
    }
}
class Book:
    ...

class Author:
    ...

# class voor een bibliotheek
class Library:
    def create_author(self):
        # maak een nieuw boek
        book = Book()
        # bepaal de eigenschappen van het boek
        book.title = "Harry Potter & de Gevangene van Azkaban"
        book.genre = "Fantasy"
        book.number_of_pages = 326

        # maak een nieuwe auteur
        author = Author()
        # bepaal de eigenschappen van de auteur
        author.first_name = "Joanne"
        author.last_name = "Rowling"
        author.date_of_birth = datetime(1965, 7, 31)
        # voeg het boek toe aan de auteur
        author.add_book(book)

Oefening: Waardes aanpassen

Onderzoek hoe je nu de gegevens in deze classes kan aanpassen:

  • Pas de naam van een boek aan vanuit de auteur dat dit boel geschreven heeft.
  • Herschrijf boek op zo’n manier dat er meerdere genres kunnen bestaan.
  • Hoe kan je, met de naam van een boek, gegevens van de auteur opvragen?
  • Maak een nieuwe klasse, Bibliotheek, die gegevens van boeken beheert.

Bronnen