# Lathund för klassdesign

## Klasser

* Vilka SAKER finns i programmet/spelet?
  * Spelarkaraktär, Fiender, Powerups, Andra objekt, Level/spelplan, Grafiska knappar
* Varje klass ska ha namn i **singular**, även om det finns flera i programmet/spelet.
  * Powerup, Player, Enemy, Football, BaseballBat
* Varje klass beskriver en **kategori** av saker.

### Underkategorier

* Är det liten skillnad mellan sakerna? Använd olika **instanser av samma klass**.
* Är det stor skillnad, framför allt i metoderna? Skapa nya klasser och använd **arv**.

### Variabler

* Vilka EGENSKAPER hos de olika sakerna är relevanta för spelet?
  * Position, Styrka, intelligens, Hit points
* En egenskap som bara är ett enkelt värde (int, strint, float etc) bör vara en **variabel**.
  * Exempel: namn, hit points
* En egenskap som är mer komplex, och i sig har en massa egenskaper/funktionalitet bör vara en referens till en **instans av en klass**.
  * Exempel: ett svärd, som har skadevärde, vikt etc
* Variabler kan leda till djupa hierarkier.
  * I en instans av klassen Game finns en instans av Scene, i instansen av Scene finns en instans av Player…

### Metoder

* Vilken kod hör samman med varje SAK?
  * Vilken kod använder enbart eller mestadels variabler som tillhör klassen?
* Vad ska varje SAK kunna göra?
* Metoder = verb, saker man kan göra med en instans eller som instansen kan göra.

### Public/private/protected

* Public, private och protected används för att skapa **gränssnittet ut mot världen**.
* Saker som ska kunna kommas åt utifrån – **public**.
  * Variabler – helst inte public alls. Använd [properties](/klasser-och-objektorientering/inkapsling-och-properties.md) istället.
* Saker som bara ska kunna påverkas från metoder som tillhör den här klassen – **private**.
* Saker som ska kunna påverkas av metoder som tillhör den här klassen och klasser som ärver från den – **protected**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://csharp.progdocs.se/klasser-och-objektorientering/lathund-foer-klassdesign.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
