<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Objektorientierte_Modelle_sinnvoll_einsetzen</id>
	<title>Anwendungsentwicklung und Softwarequalität – Objektorientierte Modelle sinnvoll einsetzen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Objektorientierte_Modelle_sinnvoll_einsetzen"/>
	<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Objektorientierte_Modelle_sinnvoll_einsetzen&amp;action=history"/>
	<updated>2026-10-10T10:28:34Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MOOCsWiki Staging</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Objektorientierte_Modelle_sinnvoll_einsetzen&amp;diff=63493&amp;oldid=prev</id>
		<title>Glanz: aiMOOC über GPT aiMOOC Action erstellt</title>
		<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Objektorientierte_Modelle_sinnvoll_einsetzen&amp;diff=63493&amp;oldid=prev"/>
		<updated>2026-10-09T19:33:20Z</updated>

		<summary type="html">&lt;p&gt;aiMOOC über GPT aiMOOC Action erstellt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{T}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anwendungsentwicklung und Softwarequalität – Objektorientierte Modelle sinnvoll einsetzen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Einleitung =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zielgruppe:&amp;#039;&amp;#039;&amp;#039; Ausbildung Fachinformatik – Anwendungsentwicklung&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; ca. 90–120 Minuten&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Voraussetzungen:&amp;#039;&amp;#039;&amp;#039; Python-Grundlagen, Variablen, Funktionen und Bedingungen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lernziel:&amp;#039;&amp;#039;&amp;#039; Du entwirfst Klassen, modellierst Zustände, erklärst Beziehungen und überprüfst Dein Modell mit automatisierten Tests.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ausbildungsfall:&amp;#039;&amp;#039;&amp;#039; Eine fiktive Geräteausleihe im Ausbildungsbetrieb.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Dein Lernpfad ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Einheit !! Thema !! Ergebnis&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Klassen und Objekte || Klassenmodell&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Beziehungen || UML-Klassendiagramm&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Zustände || Zustandsmodell&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Implementierung || Python-Programm&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Softwarequalität || Automatisierte Tests&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Transfer || Verbessertes Modell&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Datei:UML diagrams overview.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: Übersicht der UML-Diagrammarten. Quelle: Wikimedia Commons, gemeinfrei.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Leitfrage:&amp;#039;&amp;#039;&amp;#039; Wie helfen uns objektorientierte Modelle, verständliche und zuverlässige Software zu entwickeln?&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Sicher arbeiten ==&lt;br /&gt;
&lt;br /&gt;
Alle Übungen verwenden ausschließlich &amp;#039;&amp;#039;&amp;#039;fiktive Geräte und erfundene Benutzerkennungen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
# Arbeite lokal in einem eigens angelegten Übungsordner, vorzugsweise in einer Offline-VM oder einem Container ohne Netzwerk.&lt;br /&gt;
# Verwende keine Kundeninformationen, Zugangsdaten, Produktivsysteme oder fremden Netzwerke.&lt;br /&gt;
# Die Beispiele benötigen nur Python und dessen Standardbibliothek. Installiere keine zusätzlichen Pakete.&lt;br /&gt;
# Führe nur ausdrücklich freigegebene Tests durch.&lt;br /&gt;
# Ein Python-venv isoliert Paketabhängigkeiten, ist aber keine Sicherheits-Sandbox.&lt;br /&gt;
&lt;br /&gt;
Externe Lernvideos und LearningApps sind optionale Lernmaterialien. Ihre Nutzung benötigt eine bewusste Freigabe; übertrage niemals echte Test- oder Kundendaten.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 1: Klassen und Objekte =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 10–15 Minuten&lt;br /&gt;
&lt;br /&gt;
Eine [[Klasse]] beschreibt gemeinsame Eigenschaften und Verhaltensweisen. Ein [[Objekt (Programmierung)|Objekt]] ist eine konkrete Instanz einer Klasse.&lt;br /&gt;
&lt;br /&gt;
[[Datei:UML class diagram example.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: Aufbau eines UML-Klassendiagramms, Wikimedia Commons, gemeinfrei.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Uml-Instance-specification-1.svg|400px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: UML-Instanzdarstellung, Wikimedia Commons, Stkl, CC BY-SA 3.0.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=rKCPh9bqgMM|500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Praxisfall: Geräteausleihe&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Klasse !! Attribute !! Verantwortlichkeit&lt;br /&gt;
|-&lt;br /&gt;
| Geraet || nummer, name || Gerät beschreiben&lt;br /&gt;
|-&lt;br /&gt;
| Ausleihe || geraet, alias, status || Ausleihvorgang steuern&lt;br /&gt;
|-&lt;br /&gt;
| AusleihService || ausleihen || Anfragen koordinieren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispielobjekt:&amp;#039;&amp;#039;&amp;#039; Geraet(&amp;quot;G-01&amp;quot;, &amp;quot;Beamer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Dabei ist Geraet die Klasse, &amp;quot;G-01&amp;quot; eine fiktive Inventarnummer und &amp;quot;Beamer&amp;quot; der Gerätename.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Merke:&amp;#039;&amp;#039;&amp;#039; Eine Klasse ist ein Modell. Das Objekt enthält konkrete Werte.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== UML-Klassennotation ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:UML class diagram with access modifiers.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: Sichtbarkeiten in UML, Wikimedia Commons, Frap, CC0.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Eine UML-Klasse kann aus Klassenname, Attributen und Methoden bestehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+----------------------------+&lt;br /&gt;
|          Ausleihe          |&lt;br /&gt;
+----------------------------+&lt;br /&gt;
| - geraet: Geraet           |&lt;br /&gt;
| - alias: String            |&lt;br /&gt;
| - status: Status           |&lt;br /&gt;
+----------------------------+&lt;br /&gt;
| + freigeben(): void        |&lt;br /&gt;
| + zurueckgeben(): void     |&lt;br /&gt;
+----------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;-&amp;#039;&amp;#039;&amp;#039; kennzeichnet private Sichtbarkeit im UML-Modell.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039; kennzeichnet öffentliche Sichtbarkeit.&lt;br /&gt;
&lt;br /&gt;
In Python ist ein führender Unterstrich wie bei &amp;lt;code&amp;gt;_status&amp;lt;/code&amp;gt; dagegen nur eine Konvention und keine technische Zugriffssperre.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Basisaufgabe mit Feedback ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Auftrag:&amp;#039;&amp;#039;&amp;#039; Entwickle eine Klasse Arbeitsplatz mit zwei Attributen und einer Methode.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartung:&amp;#039;&amp;#039;&amp;#039; Beispielsweise Arbeitsplatz mit nummer, standort und pruefen().&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Dein Entwurf ist sinnvoll, wenn die Attribute Eigenschaften des Arbeitsplatzes und die Methode eine fachliche Handlung beschreiben. Eine Klasse, die beliebige Aufgaben ohne Bezug zum Arbeitsplatz übernimmt, hat eine unklare Verantwortung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 2: Beziehungen zwischen Klassen =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 10–15 Minuten&lt;br /&gt;
&lt;br /&gt;
Ein gutes objektorientiertes Modell zeigt nicht nur Klassen, sondern auch ihre [[Assoziation (UML)|Beziehungen]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:Komposition Aggregation.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: Aggregation und Komposition mit Multiplizitäten, Wikimedia Commons, gemeinfrei.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=Yx5iXeKNbcA|500|center}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drei wichtige Beziehungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Beziehung !! Bedeutung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Assoziation || Objekte stehen miteinander in Beziehung || Ausleihe verweist auf Geraet&lt;br /&gt;
|-&lt;br /&gt;
| Aggregation || Lose Teil-Ganzes-Beziehung || Team mit Mitgliedern&lt;br /&gt;
|-&lt;br /&gt;
| Komposition || Starke Teil-Ganzes-Beziehung mit gebundener Lebensdauer || Bestellung mit Bestellpositionen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtig:&amp;#039;&amp;#039;&amp;#039; Nicht jede Beziehung ist eine Komposition. Eine starke Zugehörigkeit sollte nur modelliert werden, wenn sie fachlich begründet ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Multiplizitäten lesen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UML-Angabe !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Genau ein Objekt&lt;br /&gt;
|-&lt;br /&gt;
| 0..1 || Kein oder ein Objekt&lt;br /&gt;
|-&lt;br /&gt;
| 0..* || Beliebig viele, auch keines&lt;br /&gt;
|-&lt;br /&gt;
| 1..* || Mindestens ein Objekt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modell des Ausbildungsfalls:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-----------------+&lt;br /&gt;
| AusleihService  |&lt;br /&gt;
+-----------------+&lt;br /&gt;
        |&lt;br /&gt;
        | verwaltet&lt;br /&gt;
        | 0..*&lt;br /&gt;
        v&lt;br /&gt;
+-----------------+       +-----------------+&lt;br /&gt;
|    Ausleihe     |------&amp;gt;|     Geraet      |&lt;br /&gt;
+-----------------+   1   +-----------------+&lt;br /&gt;
                         jede Ausleihe&lt;br /&gt;
                         referenziert&lt;br /&gt;
                         genau ein Geraet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Ausleihe besitzt genau eine Gerätereferenz. Ein Gerät kann über die Zeit in mehreren Ausleihen vorkommen, aber im aktuellen Modell nur in einer offenen Ausleihe gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modellierungsentscheidung:&amp;#039;&amp;#039;&amp;#039; Wir verwenden eine Assoziation zwischen Ausleihe und Geraet, weil ein Gerät unabhängig von einem einzelnen Ausleihvorgang existiert.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Anwendungsaufgabe mit Feedback ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Auftrag:&amp;#039;&amp;#039;&amp;#039; Begründe, warum eine Geräteausleihe nicht automatisch eine Komposition zwischen Ausleihe und Geraet benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartung:&amp;#039;&amp;#039;&amp;#039; Das Gerät besteht nach Beendigung des Ausleihvorgangs weiter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Richtig ist nicht allein die Auswahl der Assoziation. Entscheidend ist die Begründung über unabhängige Lebensdauer und fachliche Verantwortung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 3: Zustände verstehen =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 10–15 Minuten&lt;br /&gt;
&lt;br /&gt;
Ein [[Zustandsdiagramm (UML)|Zustandsdiagramm]] zeigt zulässige Zustände und Zustandsübergänge eines Objekts.&lt;br /&gt;
&lt;br /&gt;
[[Datei:UML state machine Fig1.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Bild: UML-Zustände und Transitionen, Wikimedia Commons, Mirosamek, CC BY-SA 3.0.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=5qp0WkU_T-M|500|center}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Zustandsmodell der Geräteausleihe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
       anfragen&lt;br /&gt;
          |&lt;br /&gt;
          v&lt;br /&gt;
    [ANGEFRAGT]&lt;br /&gt;
          |&lt;br /&gt;
       freigeben&lt;br /&gt;
          |&lt;br /&gt;
          v&lt;br /&gt;
    [AUSGELIEHEN]&lt;br /&gt;
          |&lt;br /&gt;
     zurueckgeben&lt;br /&gt;
          |&lt;br /&gt;
          v&lt;br /&gt;
      [ZURUECK]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aktueller Zustand !! Aktion !! Ergebnis&lt;br /&gt;
|-&lt;br /&gt;
| Kein Vorgang || anfragen || ANGEFRAGT&lt;br /&gt;
|-&lt;br /&gt;
| ANGEFRAGT || freigeben || AUSGELIEHEN&lt;br /&gt;
|-&lt;br /&gt;
| AUSGELIEHEN || zurueckgeben || ZURUECK&lt;br /&gt;
|-&lt;br /&gt;
| ANGEFRAGT || zurueckgeben || Fehler&lt;br /&gt;
|-&lt;br /&gt;
| ZURUECK || freigeben || Fehler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warum sind Fehler wichtig?&amp;#039;&amp;#039;&amp;#039; Ohne Übergangsregeln könnte ein Gerät zurückgegeben werden, das noch gar nicht ausgeliehen wurde.&lt;br /&gt;
&lt;br /&gt;
Eine [[Guard (Informatik)|Guard-Bedingung]] erlaubt einen Übergang nur bei erfüllter Bedingung. Im späteren Python-Beispiel prüfen Methoden den aktuellen Status, bevor sie ihn verändern.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Basisaufgabe mit Feedback ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Auftrag:&amp;#039;&amp;#039;&amp;#039; Eine Ausleihe ist ANGEFRAGT. Darf sie direkt zurückgegeben werden?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung:&amp;#039;&amp;#039;&amp;#039; Nein.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Eine Rückgabe setzt eine vorherige Freigabe voraus. Das Modell verhindert damit einen fachlich widersprüchlichen Ablauf.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 4: Vom UML-Modell zum Python-Programm =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 20–25 Minuten&lt;br /&gt;
&lt;br /&gt;
Jetzt überträgst Du das Modell in ausführbaren [[Python (Programmiersprache)|Python]]-Code.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lokale Vorbereitung:&amp;#039;&amp;#039;&amp;#039; Lege einen neuen Ordner &amp;lt;code&amp;gt;geraeteausleihe_labor&amp;lt;/code&amp;gt; an. Speichere den folgenden Code als &amp;lt;code&amp;gt;ausleihe.py&amp;lt;/code&amp;gt;. Verwende Python 3.10 oder neuer.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lokales Codebeispiel: ausleihe.py ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from dataclasses import dataclass&lt;br /&gt;
from enum import Enum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass(frozen=True)&lt;br /&gt;
class Geraet:&lt;br /&gt;
    nummer: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Status(Enum):&lt;br /&gt;
    ANGEFRAGT = &amp;quot;angefragt&amp;quot;&lt;br /&gt;
    AUSGELIEHEN = &amp;quot;ausgeliehen&amp;quot;&lt;br /&gt;
    ZURUECK = &amp;quot;zurueck&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Ausleihe:&lt;br /&gt;
    def __init__(self, geraet: Geraet, alias: str):&lt;br /&gt;
        self.geraet = geraet&lt;br /&gt;
        self.alias = alias&lt;br /&gt;
        self._status = Status.ANGEFRAGT&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def status(self) -&amp;gt; Status:&lt;br /&gt;
        return self._status&lt;br /&gt;
&lt;br /&gt;
    def freigeben(self) -&amp;gt; None:&lt;br /&gt;
        if self._status is not Status.ANGEFRAGT:&lt;br /&gt;
            raise ValueError(&amp;quot;Freigabe nur nach Anfrage&amp;quot;)&lt;br /&gt;
        self._status = Status.AUSGELIEHEN&lt;br /&gt;
&lt;br /&gt;
    def zurueckgeben(self) -&amp;gt; None:&lt;br /&gt;
        if self._status is not Status.AUSGELIEHEN:&lt;br /&gt;
            raise ValueError(&amp;quot;Rueckgabe nur bei Ausleihe&amp;quot;)&lt;br /&gt;
        self._status = Status.ZURUECK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class AusleihService:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self._ausleihen: list[Ausleihe] = []&lt;br /&gt;
&lt;br /&gt;
    def anfragen(self, geraet: Geraet, alias: str) -&amp;gt; Ausleihe:&lt;br /&gt;
        belegt = any(&lt;br /&gt;
            a.geraet.nummer == geraet.nummer&lt;br /&gt;
            and a.status is not Status.ZURUECK&lt;br /&gt;
            for a in self._ausleihen&lt;br /&gt;
        )&lt;br /&gt;
        if belegt:&lt;br /&gt;
            raise ValueError(&amp;quot;Geraet bereits vorgemerkt&amp;quot;)&lt;br /&gt;
        ausleihe = Ausleihe(geraet, alias)&lt;br /&gt;
        self._ausleihen.append(ausleihe)&lt;br /&gt;
        return ausleihe&lt;br /&gt;
&lt;br /&gt;
    def zaehle_offene(self) -&amp;gt; int:&lt;br /&gt;
        return sum(&lt;br /&gt;
            a.status is not Status.ZURUECK&lt;br /&gt;
            for a in self._ausleihen&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    service = AusleihService()&lt;br /&gt;
    a = service.anfragen(Geraet(&amp;quot;G-01&amp;quot;, &amp;quot;Beamer&amp;quot;), &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
    print(a.status.value, service.zaehle_offene())&lt;br /&gt;
    a.freigeben()&lt;br /&gt;
    print(a.status.value, service.zaehle_offene())&lt;br /&gt;
    a.zurueckgeben()&lt;br /&gt;
    print(a.status.value, service.zaehle_offene())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lokal ausführen ==&lt;br /&gt;
&lt;br /&gt;
Starte das Programm im Übungsordner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python ausleihe.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartete Ausgabe:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
angefragt 1&lt;br /&gt;
ausgeliehen 1&lt;br /&gt;
zurueck 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; auf Deinem Rechner nicht verfügbar ist, nutze den lokal installierten Python-3-Befehl. Es werden weder externe Dienste noch Zugangsdaten benötigt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Interaktives lokales Python-Labor ==&lt;br /&gt;
&lt;br /&gt;
Starte in der freigegebenen Offline-Testumgebung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -i ausleihe.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gib danach diese Python-Anweisungen nacheinander ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
s = AusleihService()&lt;br /&gt;
g = Geraet(&amp;quot;G-02&amp;quot;, &amp;quot;Tablet&amp;quot;)&lt;br /&gt;
a = s.anfragen(g, &amp;quot;AZUBI-03&amp;quot;)&lt;br /&gt;
print(a.status.value)&lt;br /&gt;
a.freigeben()&lt;br /&gt;
print(a.status.value)&lt;br /&gt;
a.zurueckgeben()&lt;br /&gt;
print(a.status.value)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartete Statusfolge:&amp;#039;&amp;#039;&amp;#039; angefragt, ausgeliehen, zurueck&lt;br /&gt;
&lt;br /&gt;
Teste danach absichtlich einen ungültigen Übergang:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
a.freigeben()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartung:&amp;#039;&amp;#039;&amp;#039; Ein ValueError wird ausgelöst, weil eine bereits zurückgegebene Ausleihe nicht erneut freigegeben werden darf.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Der Fehler ist hier erwünscht. Das Objekt schützt seine fachlichen Zustandsregeln.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 5: Softwarequalität überprüfen =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 20–25 Minuten&lt;br /&gt;
&lt;br /&gt;
Softwarequalität bedeutet mehr als fehlerfreie Syntax. Ein Modell sollte verständlich, überprüfbar, veränderbar und für den vorgesehenen Zweck geeignet sein.&lt;br /&gt;
&lt;br /&gt;
Die [[ISO/IEC 25010]] beschreibt ein Qualitätsmodell für Softwareprodukte. Für diesen Ausbildungsfall betrachten wir besonders funktionale Eignung, Wartbarkeit und Zuverlässigkeit.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Visualisierte Testdaten ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testfall !! Gerät !! Startstatus !! Aktion !! Erwartung&lt;br /&gt;
|-&lt;br /&gt;
| T1 || G-01 || Kein Vorgang || anfragen || ANGEFRAGT&lt;br /&gt;
|-&lt;br /&gt;
| T2 || G-01 || ANGEFRAGT || freigeben || AUSGELIEHEN&lt;br /&gt;
|-&lt;br /&gt;
| T3 || G-01 || AUSGELIEHEN || zurueckgeben || ZURUECK&lt;br /&gt;
|-&lt;br /&gt;
| T4 || G-01 || ANGEFRAGT || zurueckgeben || ValueError&lt;br /&gt;
|-&lt;br /&gt;
| T5 || G-01 || Bereits vorgemerkt || erneut anfragen || ValueError&lt;br /&gt;
|-&lt;br /&gt;
| T6 || G-01 || ZURUECK || neu anfragen || ANGEFRAGT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenhinweis:&amp;#039;&amp;#039;&amp;#039; G-01 und die Benutzerkennungen sind frei erfundene Beispieldaten.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lokales Testprogramm: test_ausleihe.py ==&lt;br /&gt;
&lt;br /&gt;
Speichere diese zweite Datei im selben Ordner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import unittest&lt;br /&gt;
from ausleihe import AusleihService, Geraet, Status&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class AusleiheTests(unittest.TestCase):&lt;br /&gt;
    def setUp(self):&lt;br /&gt;
        self.service = AusleihService()&lt;br /&gt;
        self.geraet = Geraet(&amp;quot;G-01&amp;quot;, &amp;quot;Beamer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def test_anfrage_startet_im_richtigen_status(self):&lt;br /&gt;
        a = self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        self.assertEqual(a.status, Status.ANGEFRAGT)&lt;br /&gt;
&lt;br /&gt;
    def test_gueltiger_ablauf(self):&lt;br /&gt;
        a = self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        a.freigeben()&lt;br /&gt;
        self.assertEqual(a.status, Status.AUSGELIEHEN)&lt;br /&gt;
        a.zurueckgeben()&lt;br /&gt;
        self.assertEqual(a.status, Status.ZURUECK)&lt;br /&gt;
&lt;br /&gt;
    def test_keine_rueckgabe_vor_freigabe(self):&lt;br /&gt;
        a = self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        with self.assertRaises(ValueError):&lt;br /&gt;
            a.zurueckgeben()&lt;br /&gt;
&lt;br /&gt;
    def test_keine_doppelte_vormerkung(self):&lt;br /&gt;
        self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        with self.assertRaises(ValueError):&lt;br /&gt;
            self.service.anfragen(self.geraet, &amp;quot;AZUBI-02&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def test_neue_anfrage_nach_rueckgabe(self):&lt;br /&gt;
        a = self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        a.freigeben()&lt;br /&gt;
        a.zurueckgeben()&lt;br /&gt;
        b = self.service.anfragen(self.geraet, &amp;quot;AZUBI-02&amp;quot;)&lt;br /&gt;
        self.assertEqual(b.status, Status.ANGEFRAGT)&lt;br /&gt;
&lt;br /&gt;
    def test_offene_ausleihen_zaehlen(self):&lt;br /&gt;
        a = self.service.anfragen(self.geraet, &amp;quot;AZUBI-01&amp;quot;)&lt;br /&gt;
        self.assertEqual(self.service.zaehle_offene(), 1)&lt;br /&gt;
        a.freigeben()&lt;br /&gt;
        a.zurueckgeben()&lt;br /&gt;
        self.assertEqual(self.service.zaehle_offene(), 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    unittest.main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Automatisierte Tests starten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python -m unittest -v test_ausleihe.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Soll-Ergebnis:&amp;#039;&amp;#039;&amp;#039; Sechs erfolgreiche Tests, Abschlussmeldung &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Tests sind wiederholbar und benötigen weder einen Datenbankserver noch ein Netzwerk.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Fehler bewusst erkennen ==&lt;br /&gt;
&lt;br /&gt;
Verändere ausschließlich in einer Kopie des Übungsprogramms die Methode &amp;lt;code&amp;gt;zurueckgeben&amp;lt;/code&amp;gt; so, dass die Zustandsprüfung entfällt.&lt;br /&gt;
&lt;br /&gt;
Starte anschließend erneut die Tests.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartetes Feedback:&amp;#039;&amp;#039;&amp;#039; Der Test &amp;lt;code&amp;gt;test_keine_rueckgabe_vor_freigabe&amp;lt;/code&amp;gt; schlägt fehl. Die fehlende Fehlermeldung zeigt, dass ein unerlaubter Zustandsübergang zugelassen wird.&lt;br /&gt;
&lt;br /&gt;
Stelle danach die ursprüngliche Methode wieder her.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtig:&amp;#039;&amp;#039;&amp;#039; Erfolgreiche Unit-Tests belegen nur die getesteten Eigenschaften. Sie beweisen nicht, dass ein Programm insgesamt fehlerfrei oder produktionsreif ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 6: Modelle bewerten und verbessern =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 15–20 Minuten&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Qualität beurteilen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Prüfkriterium !! Leitfrage !! Ausbildungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Verständlichkeit || Sind Klassen und Verantwortlichkeiten klar? || Geraet und Ausleihe sind getrennt&lt;br /&gt;
|-&lt;br /&gt;
| Korrektheit || Werden ungültige Abläufe verhindert? || Statusprüfungen&lt;br /&gt;
|-&lt;br /&gt;
| Testbarkeit || Können Regeln automatisch geprüft werden? || unittest&lt;br /&gt;
|-&lt;br /&gt;
| Wartbarkeit || Sind Änderungen lokal möglich? || Übergangsregeln in Methoden&lt;br /&gt;
|-&lt;br /&gt;
| Datenschutz || Werden reale Personendaten vermieden? || Fiktive Aliaswerte&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Grenzen des Modells:&amp;#039;&amp;#039;&amp;#039; Es gibt keine dauerhafte Speicherung, keine Rollenverwaltung, keine Prüfung leerer Aliaswerte und keinen Schutz gegen gleichzeitig ablaufende Anfragen. Der In-Memory-Prototyp ist deshalb keine fertige Produktivanwendung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Gestufte Hilfen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Niveau !! Hilfe 1 !! Hilfe 2 !! Hilfe 3&lt;br /&gt;
|-&lt;br /&gt;
| Basis || Markiere die Substantive des Falls || Unterscheide Objekt und Eigenschaft || Ordne Eigenschaften ihren Klassen zu&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung || Zeichne erlaubte Statuswechsel || Suche die Statusprüfungen im Code || Schreibe für jeden Übergang einen Test&lt;br /&gt;
|-&lt;br /&gt;
| Transfer || Beschreibe eine neue Anforderung || Bewerte Auswirkungen auf Modell und Code || Ergänze positive und negative Tests&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Transferauftrag mit begründetem Feedback ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Neue Anforderung:&amp;#039;&amp;#039;&amp;#039; Eine angefragte Geräteausleihe soll storniert werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deine Aufgabe:&amp;#039;&amp;#039;&amp;#039; Ergänze den Zustand STORNIERT, erlaube die Stornierung nur aus ANGEFRAGT und prüfe, ob das Gerät danach erneut angefragt werden darf.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hilfestufe 1:&amp;#039;&amp;#039;&amp;#039; Zeichne zunächst den neuen Zustand und seine eingehende Transition.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hilfestufe 2:&amp;#039;&amp;#039;&amp;#039; Ergänze einen neuen Enum-Wert und eine Methode stornieren().&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hilfestufe 3:&amp;#039;&amp;#039;&amp;#039; Überprüfe in AusleihService, welche Zustände ein Gerät weiterhin blockieren sollen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Begründetes Feedback:&amp;#039;&amp;#039;&amp;#039; Nur den Enum zu erweitern reicht nicht. Auch die Belegungsregel muss angepasst werden, da sonst ein storniertes Gerät fälschlich reserviert bleibt. Zusätzlich müssen Tests erlaubte Stornierungen und unzulässige Übergänge abdecken.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Interaktive Aufgaben =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Quiz: Teste Dein Wissen ==&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was beschreibt eine Klasse in der objektorientierten Programmierung?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Einen Bauplan für gleichartige Objekte)&lt;br /&gt;
(!Ein konkretes Benutzerkonto)&lt;br /&gt;
(!Eine vollständige Datenbank)&lt;br /&gt;
(!Eine einzelne Programmausgabe)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was ist ein Objekt?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Eine konkrete Instanz einer Klasse)&lt;br /&gt;
(!Ein UML-Zustandsübergang)&lt;br /&gt;
(!Eine Programmiersprache)&lt;br /&gt;
(!Ein automatischer Softwaretest)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was bedeutet die Multiplizität 0..*?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Beliebig viele Objekte einschließlich keines)&lt;br /&gt;
(!Genau ein Objekt)&lt;br /&gt;
(!Mindestens zwei Objekte)&lt;br /&gt;
(!Höchstens ein Objekt)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche UML-Beziehung verwendet eine ausgefüllte Raute?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Komposition)&lt;br /&gt;
(!Assoziation)&lt;br /&gt;
(!Generalisierung)&lt;br /&gt;
(!Abhängigkeit)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welchen Anfangsstatus besitzt eine neue Ausleihe im Python-Beispiel?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(ANGEFRAGT)&lt;br /&gt;
(!AUSGELIEHEN)&lt;br /&gt;
(!ZURUECK)&lt;br /&gt;
(!STORNIERT)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welcher Zustandswechsel ist im Ausgangsmodell erlaubt?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Von AUSGELIEHEN nach ZURUECK)&lt;br /&gt;
(!Von ZURUECK nach AUSGELIEHEN)&lt;br /&gt;
(!Von ANGEFRAGT direkt nach ZURUECK)&lt;br /&gt;
(!Von ZURUECK nach ANGEFRAGT)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warum prüft freigeben den aktuellen Zustand?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Damit nur erlaubte Übergänge stattfinden)&lt;br /&gt;
(!Damit automatisch ein Netzwerk verbunden wird)&lt;br /&gt;
(!Damit alle Attribute öffentlich werden)&lt;br /&gt;
(!Damit das Programm keine Klassen benötigt)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was bewirkt assertRaises in einem Python-Test?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Es prüft das Auftreten einer erwarteten Ausnahme)&lt;br /&gt;
(!Es legt automatisch eine Datenbank an)&lt;br /&gt;
(!Es beendet alle anderen Programme)&lt;br /&gt;
(!Es zeichnet ein UML-Klassendiagramm)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wann blockiert eine vorhandene Ausleihe das Gerät im Ausgangsmodell nicht mehr?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Wenn ihr Status ZURUECK ist)&lt;br /&gt;
(!Sobald die Anfrage erstellt wurde)&lt;br /&gt;
(!Immer unmittelbar nach der Freigabe)&lt;br /&gt;
(!Sobald eine zweite Anfrage eingeht)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Aussage über erfolgreiche Unit-Tests ist richtig?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Sie bestätigen die jeweils geprüften Eigenschaften)&lt;br /&gt;
(!Sie beweisen vollständige Fehlerfreiheit)&lt;br /&gt;
(!Sie ersetzen sämtliche Anforderungen)&lt;br /&gt;
(!Sie garantieren sichere Produktivsysteme)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Memory ==&lt;br /&gt;
&lt;br /&gt;
Ordne die Fachbegriffe ihren passenden Bedeutungen zu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;memo-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Klasse || Bauplan gleichartiger Objekte&lt;br /&gt;
|-&lt;br /&gt;
| Objekt || Konkrete Instanz&lt;br /&gt;
|-&lt;br /&gt;
| Attribut || Gespeicherte Eigenschaft&lt;br /&gt;
|-&lt;br /&gt;
| Methode || Definiertes Verhalten&lt;br /&gt;
|-&lt;br /&gt;
| Assoziation || Allgemeine Objektbeziehung&lt;br /&gt;
|-&lt;br /&gt;
| Komposition || Starke Teil-Ganzes-Beziehung&lt;br /&gt;
|-&lt;br /&gt;
| Guard || Bedingung eines Übergangs&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drag and Drop ==&lt;br /&gt;
&lt;br /&gt;
Ordne jeden Fachbegriff seiner Funktion zu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;lueckentext-quiz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ordne die richtigen Begriffe zu.&lt;br /&gt;
! Funktion&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Klassendiagramm&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Statische Struktur darstellen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Zustandsdiagramm&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Erlaubte Zustandswechsel darstellen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Konstruktor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Objekt initialisieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Enumeration&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Festgelegte Zustandswerte definieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Unit-Test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Einzelne Programmeigenschaften prüfen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Ausnahme&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Ungültige Operation signalisieren&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kreuzworträtsel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;kreuzwort-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Klasse || Wie heißt der Bauplan für gleichartige Objekte?&lt;br /&gt;
|-&lt;br /&gt;
| Objekt || Wie nennt man eine konkrete Instanz?&lt;br /&gt;
|-&lt;br /&gt;
| Attribut || Wie heißt eine gespeicherte Eigenschaft?&lt;br /&gt;
|-&lt;br /&gt;
| Methode || Wie heißt eine Operation einer Klasse?&lt;br /&gt;
|-&lt;br /&gt;
| Assoziation || Wie heißt eine allgemeine Beziehung zwischen Klassen?&lt;br /&gt;
|-&lt;br /&gt;
| Zustand || Wie heißt die aktuelle Phase eines modellierten Objekts?&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== LearningApps ==&lt;br /&gt;
&lt;br /&gt;
Optionale externe Lernangebote zum Thema. Öffne sie nur, wenn die Nutzung des externen Dienstes ausdrücklich erlaubt ist. Verwende dort keine echten Daten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://learningapps.org/index.php?s=Anwendungsentwicklung+und+Softwarequalitaet+Objektorientierte+Modelle+sinnvoll+einsetzen &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lückentext ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;quiz display=simple&amp;gt;&lt;br /&gt;
{&amp;#039;&amp;#039;&amp;#039;Vervollständige den Text.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
|type=&amp;quot;{}&amp;quot;}&lt;br /&gt;
Eine { Klasse } beschreibt die Eigenschaften und Methoden gleichartiger Objekte.&lt;br /&gt;
&lt;br /&gt;
Ein konkretes { Objekt } besitzt individuelle Attributwerte.&lt;br /&gt;
&lt;br /&gt;
Eine gespeicherte Eigenschaft heißt { Attribut } in der objektorientierten Modellierung.&lt;br /&gt;
&lt;br /&gt;
Eine { Methode } definiert eine ausführbare Operation.&lt;br /&gt;
&lt;br /&gt;
Die UML verwendet eine { Assoziation } zur Darstellung allgemeiner Beziehungen.&lt;br /&gt;
&lt;br /&gt;
Die { Multiplizität } gibt die mögliche Anzahl verbundener Objekte an.&lt;br /&gt;
&lt;br /&gt;
Ein { Zustandsdiagramm } visualisiert zulässige Zustandswechsel.&lt;br /&gt;
&lt;br /&gt;
Eine neue Geräteausleihe beginnt im Zustand { ANGEFRAGT } und wartet auf Freigabe.&lt;br /&gt;
&lt;br /&gt;
Bei einem ungültigen Übergang erzeugt unser Python-Programm einen { ValueError } als Fehlersignal.&lt;br /&gt;
&lt;br /&gt;
Das Modul { unittest } ermöglicht automatisierte Tests mit Python.&lt;br /&gt;
&lt;br /&gt;
Ein erfolgreicher { Test } bestätigt eine zuvor festgelegte Erwartung.&lt;br /&gt;
&lt;br /&gt;
Die { Wartbarkeit } erleichtert das Verstehen und Verändern eines Programms.&lt;br /&gt;
&amp;lt;/quiz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Offene Aufgaben =&lt;br /&gt;
&lt;br /&gt;
Bearbeite die Aufgaben in einer lokalen, freigegebenen Lernumgebung. Alle Geräte und Nutzerkennungen sind frei erfunden.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Leicht – Basisaufgaben ===&lt;br /&gt;
&lt;br /&gt;
# [[Klasse (Programmierung)|Klassen erkennen]]: Markiere die Klassen des Ausbildungsfalls und zeichne drei Klassenkarten. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Eine gute Klassenauswahl trennt fachlich unterschiedliche Verantwortlichkeiten.&lt;br /&gt;
# [[Objekt (Programmierung)|Objekte erstellen]]: Erfinde drei Geräteobjekte mit unterschiedlichen Inventarnummern. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Verschiedene Attributwerte bei gleicher Klassenstruktur zeigen, dass Du Klasse und Instanz unterscheidest.&lt;br /&gt;
# [[UML-Klassendiagramm|Klassen skizzieren]]: Zeichne Geraet mit seinen Attributen und ergänze geeignete Typen. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Ein verständliches Diagramm erleichtert die spätere Implementierung.&lt;br /&gt;
# [[Zustandsdiagramm (UML)|Zustände zuordnen]]: Zeichne den zulässigen Weg einer Geräteausleihe. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Jeder Pfeil benötigt ein fachlich nachvollziehbares Ereignis.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Standard – Anwendungsaufgaben ===&lt;br /&gt;
&lt;br /&gt;
# [[Assoziation (UML)|Beziehungen modellieren]]: Zeichne Ausleihe und Geraet mit sinnvoller Multiplizität. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Berücksichtige, dass eine Ausleihe ein Gerät referenziert, ein Gerät aber mehrfach nacheinander ausgeliehen werden kann.&lt;br /&gt;
# [[Python (Programmiersprache)|Programm ausführen]]: Starte das Programm mit zwei unterschiedlichen fiktiven Geräten und protokolliere die Statusfolgen. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die Ergebnisse sind plausibel, wenn jedes Objekt seine eigenen Statuswerte besitzt.&lt;br /&gt;
# [[Softwaretest|Negativtest entwickeln]]: Prüfe eine doppelte Freigabe. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Ein erwarteter ValueError bestätigt, dass ein unzulässiger Übergang abgewiesen wird.&lt;br /&gt;
# [[Code-Review|Code-Review durchführen]]: Untersuche, welche Klasse für die Verhinderung doppelter Anfragen zuständig ist. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; AusleihService ist passend, weil die Regel mehrere Ausleihe-Objekte betrifft.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Schwer – Transferaufgaben ===&lt;br /&gt;
&lt;br /&gt;
# [[Zustandsautomat|Stornierung entwickeln]]: Ergänze STORNIERT mit Übergängen und Tests. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Korrekt ist die Lösung erst, wenn auch die Belegungsprüfung stornierten Vorgängen Rechnung trägt.&lt;br /&gt;
# [[Validierung|Eingaben validieren]]: Verhindere leere Gerätekennungen und Aliaswerte. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Prüfe ungültige Eingaben dort, wo das jeweilige Objekt seine Gültigkeit sicherstellen soll, und sichere die Regeln durch Tests.&lt;br /&gt;
# [[Softwarearchitektur|Modell erweitern]]: Entwirf eine Kategorie für unterschiedliche Gerätetypen. Entscheide zwischen Attribut, eigener Klasse und Vererbung. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die einfachste fachlich ausreichende Struktur ist meist wartungsärmer als eine unnötige Klassenhierarchie.&lt;br /&gt;
# [[Softwarequalität|Gleichzeitige Anfragen beurteilen]]: Entwickle ein Konzept, das doppelte Reservierungen auch bei gleichzeitig eintreffenden Anfragen verhindert. Nutze nur ein lokales Gedankenexperiment oder eine freigegebene Simulation. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die bisherige Listenprüfung reicht bei parallelen Zugriffen nicht zuverlässig aus; erforderlich ist eine atomare Reservierungsentscheidung.&lt;br /&gt;
&lt;br /&gt;
{{:Offene Aufgabe - MOOC erstellen}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernkontrolle =&lt;br /&gt;
&lt;br /&gt;
Die folgenden Aufgaben prüfen Zusammenhänge, Begründungen und Transferleistungen.&lt;br /&gt;
&lt;br /&gt;
# [[Modellierung|Modellentscheidung]]: Vergleiche eine einzige große Klasse mit den drei getrennten Klassen des Ausbildungsfalls. Erkläre die Auswirkungen auf Wartbarkeit und Testbarkeit.&lt;br /&gt;
# [[Zustandsdiagramm (UML)|Zustandsänderung]]: Entwickle einen zusätzlichen Zustand DEFEKT. Erkläre, aus welchen Zuständen er fachlich erreichbar sein darf und welche Tests nötig wären.&lt;br /&gt;
# [[Assoziation (UML)|Beziehungsanalyse]]: Beurteile die Aussage, dass ein Gerät automatisch gelöscht werden müsse, sobald eine Ausleihe beendet wird. Begründe Deine Antwort mithilfe der Objektlebensdauer.&lt;br /&gt;
# [[Softwaretest|Fehlerdiagnose]]: Ein Test zur doppelten Vormerkung schlägt fehl. Entwickle mindestens zwei mögliche Ursachen und beschreibe, wie Du diese lokal eingrenzt.&lt;br /&gt;
# [[Softwarequalität|Qualitätsentscheidung]]: Ein Betrieb möchte aus dem Prototyp ein reales Anwendungssystem machen. Erkläre, warum grüne Unit-Tests alleine nicht genügen, und priorisiere drei notwendige Verbesserungen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bewertung:&amp;#039;&amp;#039;&amp;#039; Fachlich richtige Aussagen müssen durch Modellregeln, Testbeispiele oder nachvollziehbare Architekturargumente begründet werden. Reines Auswendiglernen reicht nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernnachweis =&lt;br /&gt;
&lt;br /&gt;
Erstelle eine kurze Projektdokumentation zur fiktiven Geräteausleihe.&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Klassenmodell:&amp;#039;&amp;#039;&amp;#039; Ein UML-Klassendiagramm mit mindestens drei Klassen, Attributen, Methoden und begründeten Beziehungen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Zustandsmodell:&amp;#039;&amp;#039;&amp;#039; Ein Zustandsdiagramm mit erlaubten und nicht erlaubten Übergängen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Implementierung:&amp;#039;&amp;#039;&amp;#039; Lokal ausführbarer Python-Code mit getrennten Verantwortlichkeiten.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Testnachweis:&amp;#039;&amp;#039;&amp;#039; Automatisierte positive und negative Tests mit dokumentierten Ergebnissen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Qualitätsreflexion:&amp;#039;&amp;#039;&amp;#039; Eine begründete Bewertung von Korrektheit, Testbarkeit und Wartbarkeit.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Transfer:&amp;#039;&amp;#039;&amp;#039; Eine neue fachliche Anforderung mit Modellanpassung und ergänzten Tests.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Sicherheitsnachweis:&amp;#039;&amp;#039;&amp;#039; Ausschließlich fiktive Daten, keine fremden Systeme und keine ungefragte Datenübertragung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erfolgreich abgeschlossen&amp;#039;&amp;#039;&amp;#039; ist der Lernkurs, wenn Modell, Implementierung und Tests zueinander passen und Du Deine Entscheidungen begründen kannst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= OERs zum Thema =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Wikipedia: Unified Modeling Language ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Unified_Modeling_Language &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Wikipedia: Objektorientierte Programmierung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Objektorientierte_Programmierung &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Geprüfte Fachquellen ==&lt;br /&gt;
&lt;br /&gt;
# [https://www.omg.org/spec/UML/2.5.1 Object Management Group: UML 2.5.1] – Normative Grundlage der UML-Modellierung.&lt;br /&gt;
# [https://docs.python.org/de/3.13/tutorial/classes.html Python-Dokumentation: Klassen] – Klassen, Objekte, Attribute und Methoden.&lt;br /&gt;
# [https://docs.python.org/3.11/library/unittest.html Python-Dokumentation: unittest] – Testfälle, Assertions und automatisierte Testausführung.&lt;br /&gt;
# [https://committee.iso.org/standard/78176.html ISO/IEC 25010:2023] – Qualitätsmodell für Softwareprodukte.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Medienquellen und Nutzungsrechte ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wikimedia Commons:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:UML_diagrams_overview.svg UML diagrams overview.svg] – Gemeinfrei.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:UML_class_diagram_example.svg UML class diagram example.svg] – Trashtoy, gemeinfrei.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:Uml-Instance-specification-1.svg Uml-Instance-specification-1.svg] – Stkl, CC BY-SA 3.0.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:UML_class_diagram_with_access_modifiers.svg UML class diagram with access modifiers.svg] – Frap, CC0 1.0.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:Komposition_Aggregation.svg Komposition Aggregation.svg] – Gemeinfrei.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:UML_state_machine_Fig1.svg UML state machine Fig1.svg] – Mirosamek, CC BY-SA 3.0.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Videos auf YouTube:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# [https://www.youtube.com/watch?v=rKCPh9bqgMM Einführung in objektorientierte Programmierung] – Binärverkehr.&lt;br /&gt;
# [https://www.youtube.com/watch?v=Yx5iXeKNbcA UML-Klassendiagramm: Beziehungen] – Programmieren Starten.&lt;br /&gt;
# [https://www.youtube.com/watch?v=5qp0WkU_T-M UML-Zustandsdiagramm für Fachinformatiker Anwendungsentwicklung] – Stefan Macke.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rechtehinweis:&amp;#039;&amp;#039;&amp;#039; Wikimedia-Dateien stehen unter den auf den jeweiligen Dateiseiten ausgewiesenen freien Lizenzen oder Gemeinfreiheitserklärungen. Bei CC BY-SA sind Urhebernennung und Lizenzbedingungen zu beachten. YouTube-Videos sind hier nur als verifizierte externe Bildungsmedien eingebunden; ihre Einbettung bedeutet nicht automatisch eine freie Weiterverwendungslizenz. Die Quellseiten sind für eine erneute Lizenzprüfung vor Weiterverwendung maßgeblich.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Verknüpfte Lernbereiche =&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Objektorientierte Programmierung]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Klasse (Programmierung)|Klassen]]&lt;br /&gt;
# [[Objekt (Programmierung)|Objekte]]&lt;br /&gt;
# [[Attribut (Programmierung)|Attribute]]&lt;br /&gt;
# [[Methode (Programmierung)|Methoden]]&lt;br /&gt;
# [[Kapselung (Programmierung)|Kapselung]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Unified Modeling Language|UML-Modellierung]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[UML-Klassendiagramm|Klassendiagramme]]&lt;br /&gt;
# [[Zustandsdiagramm (UML)|Zustandsdiagramme]]&lt;br /&gt;
# [[Assoziation (UML)|Assoziationen]]&lt;br /&gt;
# [[Aggregation (Informatik)|Aggregation]]&lt;br /&gt;
# [[Komposition (UML)|Komposition]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Softwarequalität]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Softwaretest]]&lt;br /&gt;
# [[Unit-Test]]&lt;br /&gt;
# [[Validierung]]&lt;br /&gt;
# [[Wartbarkeit]]&lt;br /&gt;
# [[Softwarearchitektur]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Anwendungsentwicklung]]&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
[[Kategorie:Softwarequalität]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
[[Kategorie:Unified Modeling Language]]&lt;br /&gt;
[[Kategorie:Python]]&lt;br /&gt;
[[Kategorie:Berufsausbildung]]&lt;br /&gt;
[[Kategorie:Fachinformatiker]]&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= aiMOOC-Projekte =&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AI_MOOC]] [[Kategorie:GPT aiMOOC]]&lt;br /&gt;
{{MT}}&lt;/div&gt;</summary>
		<author><name>Glanz</name></author>
	</entry>
</feed>