<?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=Programmieren_f%C3%BCr_technische_Aufgaben_%E2%80%93_Quellcode_verst%C3%A4ndlich_dokumentieren</id>
	<title>Programmieren für technische Aufgaben – Quellcode verständlich dokumentieren - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Programmieren_f%C3%BCr_technische_Aufgaben_%E2%80%93_Quellcode_verst%C3%A4ndlich_dokumentieren"/>
	<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Programmieren_f%C3%BCr_technische_Aufgaben_%E2%80%93_Quellcode_verst%C3%A4ndlich_dokumentieren&amp;action=history"/>
	<updated>2026-10-10T09:26:18Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MOOCsWiki Staging</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://staging.moocwiki.org/index.php?title=Programmieren_f%C3%BCr_technische_Aufgaben_%E2%80%93_Quellcode_verst%C3%A4ndlich_dokumentieren&amp;diff=63489&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=Programmieren_f%C3%BCr_technische_Aufgaben_%E2%80%93_Quellcode_verst%C3%A4ndlich_dokumentieren&amp;diff=63489&amp;oldid=prev"/>
		<updated>2026-10-09T19:32:23Z</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;
{{BR}}&lt;br /&gt;
= Programmieren für technische Aufgaben – Quellcode verständlich dokumentieren =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zielgruppe:&amp;#039;&amp;#039;&amp;#039; Berufliche Ausbildung in IT und technischen Berufen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Niveau:&amp;#039;&amp;#039;&amp;#039; Grundlagen mit Anwendungs- und Transferaufgaben&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; 5 Lerneinheiten zu je etwa 10 Minuten, zusätzlich Übungs- und Projektzeit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Werkzeug:&amp;#039;&amp;#039;&amp;#039; Python 3.10 oder neuer, lokal installiert&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Leitfrage:&amp;#039;&amp;#039;&amp;#039; Wie dokumentierst Du Programmcode so, dass andere seine Funktion, Beispiele und bekannten Grenzen verstehen?&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Einleitung =&lt;br /&gt;
&lt;br /&gt;
Guter [[Quelltext]] soll nicht nur funktionieren, sondern auch für andere verständlich sein. In diesem Kurs lernst Du, mit sprechenden Namen, sinnvollen [[Kommentar (Programmierung)|Kommentaren]], Docstrings, Beispielen und Tests die [[Softwaredokumentation]] zu verbessern.&lt;br /&gt;
&lt;br /&gt;
Du arbeitest an einem &amp;#039;&amp;#039;&amp;#039;vollständig fiktiven Temperaturprüfstand&amp;#039;&amp;#039;&amp;#039;. Alle Daten sind Übungswerte. Es gibt keine Verbindung zu echten Sensoren, Netzwerken oder Produktionsanlagen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deine Lernziele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Lesbarkeit]]: Du kannst unübersichtlichen Code verständlich benennen und strukturieren.&lt;br /&gt;
# [[Softwaredokumentation]]: Du beschreibst Eingaben, Rückgaben, Regeln, Beispiele und bekannte Grenzen.&lt;br /&gt;
# [[Softwaretest]]: Du prüfst Normalfälle, Grenzwerte und ungültige Eingaben.&lt;br /&gt;
# [[Code-Review]]: Du erkennst Widersprüche zwischen Programmverhalten und Dokumentation.&lt;br /&gt;
# [[Softwarequalität]]: Du kannst begründen, weshalb eine Dokumentation hilfreich oder unzureichend ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Dein Lernweg ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Einheit&lt;br /&gt;
! Inhalt&lt;br /&gt;
! Ergebnis&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Code lesen&lt;br /&gt;
| Verständliche Namen&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Dokumentieren&lt;br /&gt;
| Aussagekräftiger Docstring&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Grenzen verstehen&lt;br /&gt;
| Dokumentierte Testfälle&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Lokal testen&lt;br /&gt;
| Ausführbares Kurslabor&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Prüfen und verbessern&lt;br /&gt;
| Review und Übergabe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 1: Lesbaren Quellcode schreiben =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Merke:&amp;#039;&amp;#039;&amp;#039; Namen sollen den Zweck verraten. Kommentare sollen vor allem wichtige Entscheidungen und nicht offensichtliche Zusammenhänge erklären.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Syntaxhighlighting.png|380px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung: Syntaxhervorhebung verbessert die Orientierung im Quelltext. Das Beispielbild verwendet HTML; das Prinzip gilt auch für Python.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Vorher und nachher ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schwer verständlich:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def f(x):&lt;br /&gt;
    return 18 &amp;lt;= x &amp;lt;= 26&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Besser lesbar:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def temperatur_im_bereich(temp_c):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Pruefe den fiktiven Bereich von 18 bis 26 Grad C.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return 18 &amp;lt;= temp_c &amp;lt;= 26&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante macht den Zweck besser erkennbar. Sie ist allerdings noch kein robustes Prüfprogramm: Ungültige Eingaben können Fehler auslösen oder unerwartete Ergebnisse liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mini-Aufgabe:&amp;#039;&amp;#039;&amp;#039; Benenne die Funktion und ihre Eingabe um. Welche Information liefert der neue Name?&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=CeklBjD3gDg   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: How to Write Good Code Comments. Englischsprachige Vertiefung zum sinnvollen Kommentieren.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 2: Funktionen richtig dokumentieren =&lt;br /&gt;
&lt;br /&gt;
In Python ist ein &amp;#039;&amp;#039;&amp;#039;Docstring&amp;#039;&amp;#039;&amp;#039; eine Dokumentationszeichenkette am Anfang einer Funktion, Klasse oder eines Moduls.&lt;br /&gt;
&lt;br /&gt;
Eine hilfreiche Funktionsdokumentation beantwortet fünf Fragen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Frage&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Was macht die Funktion?&lt;br /&gt;
| Temperatur bewerten&lt;br /&gt;
|-&lt;br /&gt;
| Welche Eingabe erwartet sie?&lt;br /&gt;
| Temperatur in Grad Celsius&lt;br /&gt;
|-&lt;br /&gt;
| Was liefert sie zurück?&lt;br /&gt;
| OK, AUSSERHALB oder UNGUELTIG&lt;br /&gt;
|-&lt;br /&gt;
| Welches Beispiel gilt?&lt;br /&gt;
| 18,0 ergibt OK&lt;br /&gt;
|-&lt;br /&gt;
| Welche Grenzen hat sie?&lt;br /&gt;
| Keine Messunsicherheit oder Sensoranbindung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Merksatz:&amp;#039;&amp;#039;&amp;#039; Dokumentiere das Verhalten und die wichtigen Annahmen, statt lediglich Programmzeilen in Worten zu wiederholen.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=l3084gzo6Eo   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: Python Tutorial: Docstrings. Englischsprachiges Lernvideo.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kommentare oder Docstrings? ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mittel&lt;br /&gt;
! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| Sprechender Name&lt;br /&gt;
| Macht die Absicht direkt erkennbar&lt;br /&gt;
|-&lt;br /&gt;
| Kommentar&lt;br /&gt;
| Erklärt eine wichtige Entscheidung oder Ausnahme&lt;br /&gt;
|-&lt;br /&gt;
| Docstring&lt;br /&gt;
| Beschreibt den Vertrag einer Funktion&lt;br /&gt;
|-&lt;br /&gt;
| Testfall&lt;br /&gt;
| Prüft, ob das tatsächliche Verhalten zum Vertrag passt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nach [[PEP 8]] sollen Kommentare hilfreich und aktuell sein. [[PEP 257]] beschreibt verbreitete Konventionen für Python-Docstrings.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 3: Ausbildungsfall Temperaturprüfstand =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Auftrag:&amp;#039;&amp;#039;&amp;#039; In einer simulierten Ausbildungssituation soll eine Funktion fiktive Temperaturwerte klassifizieren.&lt;br /&gt;
&lt;br /&gt;
Die Werte &amp;#039;&amp;#039;&amp;#039;18,0 °C&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;26,0 °C&amp;#039;&amp;#039;&amp;#039; sind eingeschlossen. Diese Grenzen sind ausschließlich für die Übung gewählt und keine technischen Norm- oder Sicherheitsgrenzen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Die Entscheidungsregel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FIKTIVER TEMPERATURBEREICH&lt;br /&gt;
&lt;br /&gt;
Zu niedrig       Freigegebener Übungsbereich        Zu hoch&lt;br /&gt;
&lt;br /&gt;
     17,9   |18,0 ==================== 26,0|   26,1&lt;br /&gt;
            |                            |&lt;br /&gt;
 AUSSERHALB |             OK             | AUSSERHALB&lt;br /&gt;
&lt;br /&gt;
Darstellung schematisch, nicht maßstabsgetreu.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Flowchart de.svg|300px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung: Allgemeines Flussdiagramm. Nutze dieses Darstellungsmittel, um die eigene Prüflogik zu skizzieren.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Visualisierte Beispieldaten ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fiktiver Wert&lt;br /&gt;
! Erwarteter Status&lt;br /&gt;
! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| 17,9 °C&lt;br /&gt;
| AUSSERHALB&lt;br /&gt;
| Unterhalb der Untergrenze&lt;br /&gt;
|-&lt;br /&gt;
| 18,0 °C&lt;br /&gt;
| OK&lt;br /&gt;
| Untergrenze ist eingeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| 22,0 °C&lt;br /&gt;
| OK&lt;br /&gt;
| Innerhalb des Bereichs&lt;br /&gt;
|-&lt;br /&gt;
| 26,0 °C&lt;br /&gt;
| OK&lt;br /&gt;
| Obergrenze ist eingeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| 26,1 °C&lt;br /&gt;
| AUSSERHALB&lt;br /&gt;
| Oberhalb der Obergrenze&lt;br /&gt;
|-&lt;br /&gt;
| Kein Wert&lt;br /&gt;
| UNGUELTIG&lt;br /&gt;
| Keine auswertbare Messung&lt;br /&gt;
|-&lt;br /&gt;
| NaN&lt;br /&gt;
| UNGUELTIG&lt;br /&gt;
| Keine endliche Zahl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Frage:&amp;#039;&amp;#039;&amp;#039; Warum reicht es nicht, nur den Wert 22,0 °C zu testen?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Ein Normalfall zeigt nicht, ob Grenzwerte eingeschlossen sind oder ungültige Eingaben sicher behandelt werden.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Bekannte Grenzen des Ausbildungsfalls ==&lt;br /&gt;
&lt;br /&gt;
# Die Werte stammen nicht aus echten Messungen.&lt;br /&gt;
# Die Funktion ist nicht für eine Sicherheitssteuerung vorgesehen.&lt;br /&gt;
# Messunsicherheit, Kalibrierung und [[Hysterese]] sind nicht berücksichtigt.&lt;br /&gt;
# Die Simulation steuert keine Aktoren oder technischen Anlagen.&lt;br /&gt;
# Die dokumentierten Beispielgrenzen sind nicht auf reale Anlagen übertragbar.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 4: Lokales Python-Labor =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sicherheitsregel:&amp;#039;&amp;#039;&amp;#039; Arbeite nur auf Deinem eigenen oder ausdrücklich freigegebenen Ausbildungsrechner. Nutze ausschließlich fiktive Werte. Es werden weder Kundendaten noch Zugangsdaten benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vorbereitung:&amp;#039;&amp;#039;&amp;#039; Speichere den folgenden vollständigen Code als &amp;lt;code&amp;gt;kurs.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;Kurslabor: Temperaturcheck an einem fiktiven Pruefstand.&lt;br /&gt;
&lt;br /&gt;
Start: python3 -I -B kurs.py&lt;br /&gt;
Keine echten Messwerte, Dateien, Netze oder Anlagen.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
import unittest&lt;br /&gt;
&lt;br /&gt;
MIN_C = 18.0&lt;br /&gt;
MAX_C = 26.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def temperatur_status(temp_c):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Bewerte einen fiktiven Temperaturwert in Grad Celsius.&lt;br /&gt;
&lt;br /&gt;
    Eingabe: int oder float, jedoch kein bool, NaN oder Unendlich.&lt;br /&gt;
    Rueckgabe: OK fuer 18.0 bis 26.0 einschliesslich,&lt;br /&gt;
    AUSSERHALB fuer andere endliche Zahlen, sonst UNGUELTIG.&lt;br /&gt;
    Beispiel: temperatur_status(18.0) liefert OK.&lt;br /&gt;
    Grenzen: keine Sensoranbindung, Kalibrierung oder Hysterese.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if type(temp_c) not in (int, float):&lt;br /&gt;
        return &amp;quot;UNGUELTIG&amp;quot;&lt;br /&gt;
    if type(temp_c) is float and not math.isfinite(temp_c):&lt;br /&gt;
        return &amp;quot;UNGUELTIG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Im fiktiven Auftrag sind beide Grenzwerte eingeschlossen.&lt;br /&gt;
    if MIN_C &amp;lt;= temp_c &amp;lt;= MAX_C:&lt;br /&gt;
        return &amp;quot;OK&amp;quot;&lt;br /&gt;
    return &amp;quot;AUSSERHALB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class TestTemperaturStatus(unittest.TestCase):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Teste die dokumentierte Regel mit fiktiven Werten.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_normalfall(self):&lt;br /&gt;
        self.assertEqual(temperatur_status(22), &amp;quot;OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def test_grenzen(self):&lt;br /&gt;
        for wert in (18.0, 26.0):&lt;br /&gt;
            with self.subTest(wert=wert):&lt;br /&gt;
                self.assertEqual(temperatur_status(wert), &amp;quot;OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def test_ausserhalb(self):&lt;br /&gt;
        for wert in (17.9, 26.1):&lt;br /&gt;
            with self.subTest(wert=wert):&lt;br /&gt;
                self.assertEqual(&lt;br /&gt;
                    temperatur_status(wert), &amp;quot;AUSSERHALB&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
&lt;br /&gt;
    def test_ungueltig(self):&lt;br /&gt;
        for wert in (None, True, &amp;quot;22&amp;quot;, float(&amp;quot;nan&amp;quot;),&lt;br /&gt;
                     float(&amp;quot;inf&amp;quot;)):&lt;br /&gt;
            with self.subTest(wert=wert):&lt;br /&gt;
                self.assertEqual(&lt;br /&gt;
                    temperatur_status(wert), &amp;quot;UNGUELTIG&amp;quot;&lt;br /&gt;
                )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def labor():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Biete fiktive Konsolenwerte als lokale Uebung an.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Fiktive Beispieldaten:&amp;quot;)&lt;br /&gt;
    for wert in (17.9, 18.0, 22.0, 26.0, 26.1, None):&lt;br /&gt;
        print(f&amp;quot;{str(wert):&amp;gt;5} -&amp;gt; {temperatur_status(wert)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Nur lokale Testwerte eingeben; x beendet die Uebung.&amp;quot;)&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            text = input(&lt;br /&gt;
                &amp;quot;Temperatur in Grad C (x=Ende): &amp;quot;&lt;br /&gt;
            ).strip()&lt;br /&gt;
        except EOFError:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        if text.lower() == &amp;quot;x&amp;quot;:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            wert = float(text.replace(&amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;))&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            print(&amp;quot;UNGUELTIG&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(temperatur_status(wert))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    ergebnis = unittest.TextTestRunner(verbosity=2).run(&lt;br /&gt;
        unittest.defaultTestLoader.loadTestsFromTestCase(&lt;br /&gt;
            TestTemperaturStatus&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
    if not ergebnis.wasSuccessful():&lt;br /&gt;
        raise SystemExit(1)&lt;br /&gt;
    labor()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Programm lokal starten ==&lt;br /&gt;
&lt;br /&gt;
Öffne ein Terminal im Verzeichnis Deiner selbst erstellten Datei.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Linux oder macOS:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 -I -B kurs.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Windows mit Python Launcher:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
py -I -B kurs.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktionstests laufen zuerst. Danach beginnt die interaktive Konsolenübung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartete Testausgabe:&amp;#039;&amp;#039;&amp;#039; Vier Testmethoden, keine Fehler, Status OK. Die anschließende Eingabeübung bleibt lokal.&lt;br /&gt;
&lt;br /&gt;
Die Option &amp;lt;code&amp;gt;-I&amp;lt;/code&amp;gt; schränkt Python-Umgebungseinflüsse ein; &amp;lt;code&amp;gt;-B&amp;lt;/code&amp;gt; unterdrückt die Erzeugung von Bytecode-Cachedateien. &amp;#039;&amp;#039;&amp;#039;Diese Optionen sind keine vollständige Sicherheits-Sandbox.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Interaktives Experiment ==&lt;br /&gt;
&lt;br /&gt;
Gib im lokalen Labor nacheinander folgende Testwerte ein:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Eingabe&lt;br /&gt;
! Erwartete Antwort&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| OK&lt;br /&gt;
|-&lt;br /&gt;
| 26,1&lt;br /&gt;
| AUSSERHALB&lt;br /&gt;
|-&lt;br /&gt;
| abc&lt;br /&gt;
| UNGUELTIG&lt;br /&gt;
|-&lt;br /&gt;
| NaN&lt;br /&gt;
| UNGUELTIG&lt;br /&gt;
|-&lt;br /&gt;
| x&lt;br /&gt;
| Programm beenden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Forscherauftrag:&amp;#039;&amp;#039;&amp;#039; Verändere einen fiktiven Eingabewert. Vergleiche die tatsächliche Ausgabe mit Deiner Vorhersage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Achtung:&amp;#039;&amp;#039;&amp;#039; Eine Konsoleneingabe wie &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; wird in dieser Übung in eine Fließkommazahl umgewandelt. Ein direkt als Zeichenkette an die Funktion übergebenes &amp;lt;code&amp;gt;&amp;quot;22&amp;quot;&amp;lt;/code&amp;gt; wird dagegen bewusst zurückgewiesen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Optional: stärker abgeschottete Testumgebung ==&lt;br /&gt;
&lt;br /&gt;
Nur für freigegebene Ausbildungssysteme mit bereits lokal vorhandener, vertrauenswürdig bereitgestellter Docker-Umgebung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Voraussetzung:&amp;#039;&amp;#039;&amp;#039; Das Image &amp;lt;code&amp;gt;python:3.12-alpine&amp;lt;/code&amp;gt; ist schon lokal installiert. Der Befehl lädt ausdrücklich kein Image herunter.&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Linux-/macOS-Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker run --rm -it --pull=never \&lt;br /&gt;
  --network=none --read-only \&lt;br /&gt;
  --cap-drop=ALL \&lt;br /&gt;
  --security-opt=no-new-privileges \&lt;br /&gt;
  --pids-limit=64 --memory=256m \&lt;br /&gt;
  -v &amp;quot;$PWD/kurs.py:/app/kurs.py:ro&amp;quot; \&lt;br /&gt;
  python:3.12-alpine python -I -B /app/kurs.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Übung verwendet kein Netzwerk, bindet nur die lokale Kursdatei schreibgeschützt ein und entfernt den Container nach Beendigung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtig:&amp;#039;&amp;#039;&amp;#039; Container-Isolation ersetzt keine Sicherheitsprüfung durch die Ausbildungsorganisation. Verwende keine fremden Docker-Images, Anlagenverbindungen, Host-Zugangsdaten oder produktiven Volumes.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 5: Testen, Review und Übergabe =&lt;br /&gt;
&lt;br /&gt;
[[Datei:Testing Pyramid.svg|450px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung: Testpyramide. Die Übung konzentriert sich auf Unit-Tests; sie ersetzt keine Integrations- oder Systemprüfung.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ein [[Unit-Test]] überprüft eine kleine Programmeinheit automatisiert. Die dokumentierten Regeln liefern die Grundlage für geeignete Testfälle.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=6tNS--WetLI   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: Python Tutorial: Unit Testing Your Code with the unittest Module. Englischsprachige Vertiefung.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Fünf Fragen für ein Code-Review ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Prüffrage&lt;br /&gt;
! Qualitätsmerkmal&lt;br /&gt;
|-&lt;br /&gt;
| Versteht eine andere Person den Zweck?&lt;br /&gt;
| Klare Namen und Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Sind Ein- und Ausgaben beschrieben?&lt;br /&gt;
| Nachvollziehbarer Funktionsvertrag&lt;br /&gt;
|-&lt;br /&gt;
| Stimmen Beispiele mit dem Code überein?&lt;br /&gt;
| Ausführbare Testfälle&lt;br /&gt;
|-&lt;br /&gt;
| Sind Einschränkungen sichtbar?&lt;br /&gt;
| Dokumentierte bekannte Grenzen&lt;br /&gt;
|-&lt;br /&gt;
| Ist die Testumgebung sicher?&lt;br /&gt;
| Fiktive Daten, keine externen Systeme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Datei:Code Review photo-1.jpg|480px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung: Schulung zu Code-Reviews. Prüfe auch die Verständlichkeit für andere Personen.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Dokumentation ist Teil der Wartung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Software Development Life cycle.png|380px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung: Allgemeiner Softwareentwicklungszyklus. Ändert sich das Verhalten, müssen auch Dokumentation und Tests überprüft werden.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Gestufte Hilfen ==&lt;br /&gt;
&lt;br /&gt;
Versuche jede Aufgabe zunächst selbst. Lies die nächste Hilfe erst, wenn Du sie benötigst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Hilfestufe&lt;br /&gt;
! Unterstützung&lt;br /&gt;
|-&lt;br /&gt;
| Hilfe 1 – Denkanstoß&lt;br /&gt;
| Frage Dich, was hineingeht, was herauskommt und wann ein Ergebnis gültig ist.&lt;br /&gt;
|-&lt;br /&gt;
| Hilfe 2 – Struktur&lt;br /&gt;
| Schreibe im Docstring Zweck, Eingabe, Rückgabe, Beispiel und Grenzen auf.&lt;br /&gt;
|-&lt;br /&gt;
| Hilfe 3 – Konkreter Ansatz&lt;br /&gt;
| Prüfe zuerst den Datentyp, danach endliche Zahlen und zuletzt die beiden eingeschlossenen Grenzwerte.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Begründetes Feedback zu den Lernstufen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stufe&lt;br /&gt;
! Tragfähige Lösung&lt;br /&gt;
! Warum?&lt;br /&gt;
|-&lt;br /&gt;
| Basis&lt;br /&gt;
| Ein sprechender Funktionsname ersetzt eine unklare Abkürzung.&lt;br /&gt;
| Der Zweck wird ohne zusätzliche Erklärung erkennbar.&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung&lt;br /&gt;
| Tests prüfen beide Grenzwerte und ungültige Werte.&lt;br /&gt;
| Die dokumentierte Regel wird an kritischen Stellen überprüft.&lt;br /&gt;
|-&lt;br /&gt;
| Transfer&lt;br /&gt;
| Eine neue Anforderung führt zur Anpassung von Code, Dokumentation, Beispielen und Tests.&lt;br /&gt;
| Nur so bleiben die verschiedenen Beschreibungen des Programmverhaltens konsistent.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negativbeispiel:&amp;#039;&amp;#039;&amp;#039; Eine Kommentarzeile behauptet, 26,0 °C sei ungültig, während der Code OK zurückgibt. Das ist unzureichend, weil die Dokumentation eine falsche Erwartung erzeugt.&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;Welches Ziel hat gute Quellcodedokumentation?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Das Verhalten und die Grenzen des Programms verständlich machen)&lt;br /&gt;
(!Möglichst viele Kommentare schreiben)&lt;br /&gt;
(!Alle Tests ersetzen)&lt;br /&gt;
(!Die Ausführung des Programms verlangsamen)&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 in Python ein Docstring?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Eine Dokumentationszeichenkette am Anfang einer Funktion oder Klasse)&lt;br /&gt;
(!Ein beliebiger Variablenname)&lt;br /&gt;
(!Eine automatisch ausgeführte Testdatei)&lt;br /&gt;
(!Ein Ersatz für Python selbst)&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 ist ein Kommentar besonders hilfreich?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Wenn er eine nicht offensichtliche Entscheidung erklärt)&lt;br /&gt;
(!Wenn er jeden einzelnen Operator wiederholt)&lt;br /&gt;
(!Wenn er veraltete Regeln enthält)&lt;br /&gt;
(!Wenn er unverständliche Namen grundsätzlich beibehält)&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 ergibt im Ausbildungsfall die Eingabe 18,0 Grad Celsius?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(OK)&lt;br /&gt;
(!AUSSERHALB)&lt;br /&gt;
(!UNGUELTIG)&lt;br /&gt;
(!Programmabbruch)&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;Wie bewertet das Programm 26,1 Grad Celsius?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(AUSSERHALB)&lt;br /&gt;
(!OK)&lt;br /&gt;
(!UNGUELTIG)&lt;br /&gt;
(!Keine Ausgabe)&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;Wie behandelt die Funktion den fehlenden Wert None?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(UNGUELTIG)&lt;br /&gt;
(!OK)&lt;br /&gt;
(!AUSSERHALB)&lt;br /&gt;
(!Als Null Grad Celsius)&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 wird math.isfinite bei Fließkommazahlen verwendet?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Um NaN und unendliche Werte zu erkennen)&lt;br /&gt;
(!Um automatisch Sensoren zu kalibrieren)&lt;br /&gt;
(!Um Kommentare zu erzeugen)&lt;br /&gt;
(!Um Dateien im Internet abzurufen)&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 wird True im Kurs nicht als Messwert akzeptiert?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Weil boolesche Werte keine zulässigen Temperaturmessungen sind)&lt;br /&gt;
(!Weil True immer unendlich ist)&lt;br /&gt;
(!Weil True größer als 26 ist)&lt;br /&gt;
(!Weil True grundsätzlich ein Syntaxfehler ist)&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 zur lokalen Python-Option I trifft zu?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Sie isoliert Teile der Python-Umgebung ohne vollständige Betriebssystemabschottung)&lt;br /&gt;
(!Sie deaktiviert garantiert jede Netzwerkverbindung)&lt;br /&gt;
(!Sie ersetzt alle Tests)&lt;br /&gt;
(!Sie macht jede beliebige Datei ungefährlich)&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 sollte nach einer Änderung der Temperaturgrenzen passieren?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Code, Dokumentation, Beispiele und Tests gemeinsam überprüfen)&lt;br /&gt;
(!Nur den Dateinamen ändern)&lt;br /&gt;
(!Alle Docstrings löschen)&lt;br /&gt;
(!Nur die Bildgröße anpassen)&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;
Finde die zusammengehörenden Begriffe.&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;
| Docstring || Dokumentationszeichenkette einer Funktion&lt;br /&gt;
|-&lt;br /&gt;
| Grenzwerttest || Prüfung am Rand des erlaubten Bereichs&lt;br /&gt;
|-&lt;br /&gt;
| Unit-Test || Automatisierte Prüfung einer kleinen Programmeinheit&lt;br /&gt;
|-&lt;br /&gt;
| Sprechender Name || Bezeichnung mit erkennbarem Zweck&lt;br /&gt;
|-&lt;br /&gt;
| Bekannte Grenze || Dokumentierte Einschränkung der Lösung&lt;br /&gt;
|-&lt;br /&gt;
| Code-Review || Fachliche Prüfung durch eine andere Person&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 die Dokumentationselemente ihren Aufgaben 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;
! Thema&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Funktionsname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Verständliche Benennung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Docstring&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Beschreibung der Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Grenzfall&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Prüfung eines Randwertes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Unit-Test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Automatischer Ergebnisvergleich&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Warnhinweis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Erklärung einer bekannten Einschränkung&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;
| Docstring || Wie heißt die Dokumentationszeichenkette am Anfang einer Python-Funktion?&lt;br /&gt;
|-&lt;br /&gt;
| Kommentar || Wie heißt eine erläuternde Anmerkung innerhalb des Quellcodes?&lt;br /&gt;
|-&lt;br /&gt;
| Grenzwert || Wie nennt man einen Randwert eines erlaubten Bereichs?&lt;br /&gt;
|-&lt;br /&gt;
| Testfall || Wie nennt man eine einzelne Prüfung mit Eingabe und erwartetem Ergebnis?&lt;br /&gt;
|-&lt;br /&gt;
| Lesbarkeit || Welche Eigenschaft beschreibt, wie gut Menschen Quelltext erfassen können?&lt;br /&gt;
|-&lt;br /&gt;
| Hysterese || Wie heißt eine Umschaltdifferenz, die häufiges Hin- und Herschalten vermeiden kann?&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;
&amp;#039;&amp;#039;&amp;#039;Externe Ergänzung:&amp;#039;&amp;#039;&amp;#039; LearningApps darf nur genutzt werden, wenn die Ausbildungsorganisation die Verwendung und Datenübertragung ausdrücklich freigegeben hat. Für alle Kernaufgaben genügt das lokale Kurslabor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://learningapps.org/index.php?s=Programmieren+f%C3%BCr+technische+Aufgaben+Quellcode+verst%C3%A4ndlich+dokumentieren &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;
Verständliche Variablennamen verbessern die { Lesbarkeit } eines Programms.&lt;br /&gt;
&lt;br /&gt;
Eine Dokumentationszeichenkette am Anfang einer Python-Funktion heißt { Docstring }.&lt;br /&gt;
&lt;br /&gt;
Ein Kommentar kann erläutern, { warum } eine Entscheidung getroffen wird.&lt;br /&gt;
&lt;br /&gt;
Die fiktiven Temperaturen werden in Grad { Celsius } angegeben.&lt;br /&gt;
&lt;br /&gt;
Die beiden Grenzwerte sind im Ausbildungsfall { eingeschlossen }.&lt;br /&gt;
&lt;br /&gt;
Fehlende oder unzulässige Eingaben liefern den Status { UNGUELTIG }.&lt;br /&gt;
&lt;br /&gt;
Mit einem { Grenzwerttest } prüfst Du eine Bereichsgrenze.&lt;br /&gt;
&lt;br /&gt;
Die Python-Bibliothek { unittest } ermöglicht automatisierte Funktionstests.&lt;br /&gt;
&lt;br /&gt;
Der Wert { NaN } ist keine endliche Zahl.&lt;br /&gt;
&lt;br /&gt;
Die Beispieldaten müssen im Kurs ausschließlich { fiktiv } sein.&lt;br /&gt;
&lt;br /&gt;
Nach Programmänderungen müssen auch die { Tests } überprüft werden.&lt;br /&gt;
&lt;br /&gt;
Bekannte technische { Grenzen } gehören in die Dokumentation.&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;
&amp;#039;&amp;#039;&amp;#039;Arbeitsweise:&amp;#039;&amp;#039;&amp;#039; Bearbeite die Aufgaben mit fiktiven Daten. Leicht entspricht der Basisstufe, Standard der Anwendung und Schwer dem Transfer. Prüfe Deine Ergebnisse anhand der Feedbackkriterien.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Leicht ===&lt;br /&gt;
&lt;br /&gt;
# [[Quelltext|Code lesen]]: Unterstreiche in einem selbst erfundenen kurzen Programm unklare Bezeichner und erkläre ihre Bedeutung. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Gut gelöst, wenn eine andere Person die Funktion ohne Rückfrage erkennt.&lt;br /&gt;
# [[Programmierstil|Namen verbessern]]: Ersetze mindestens vier unklare Variablennamen durch sprechende Namen. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Gute Namen beschreiben einen Zweck statt nur einen Datentyp.&lt;br /&gt;
# [[Kommentar (Programmierung)|Kommentare prüfen]]: Formuliere zwei sinnvolle und zwei unnötige Kommentare. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Sinnvoll ist eine Erklärung besonders dann, wenn der Code die Entscheidung allein nicht verständlich macht.&lt;br /&gt;
# [[Softwaredokumentation|Docstring schreiben]]: Beschreibe Eingabe, Rückgabe, Beispiel und Grenze einer eigenen Mini-Funktion. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Vollständig ist die Lösung, wenn diese Angaben das tatsächliche Verhalten treffen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Standard ===&lt;br /&gt;
&lt;br /&gt;
# [[Softwaretest|Testtabelle erstellen]]: Erstelle für den fiktiven Prüfstand sechs Testfälle samt erwarteter Ergebnisse. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Berücksichtige beide Grenzen, mindestens einen Normalfall und ungültige Eingaben, weil dort unterschiedliche Fehler entstehen können.&lt;br /&gt;
# [[Python (Programmiersprache)|Funktion erweitern]]: Ergänze im lokalen Kurslabor einen weiteren fiktiven Testwert und die zugehörige Prüfung. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Der neue Test soll eine klar begründete Regel nachweisen und wiederholbar sein.&lt;br /&gt;
# [[Code-Review|Partnerprüfung]]: Tausche Deinen selbst geschriebenen Code mit einer anderen lernenden Person und sammle drei konkrete Verbesserungsvorschläge. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Gute Kritik benennt Fundstelle, Wirkung und mögliche Änderung.&lt;br /&gt;
# [[Programmablaufplan|Ablauf visualisieren]]: Zeichne die Entscheidungen für gültige Eingabe, Bereichsprüfung und Rückgabe. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Jeder mögliche Rückgabestatus benötigt einen nachvollziehbaren Pfad.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Schwer ===&lt;br /&gt;
&lt;br /&gt;
# [[Refactoring|Regeländerung durchführen]]: Ändere ausschließlich im lokalen Übungsprojekt die fiktiven Grenzen auf 19 und 25 Grad Celsius. Aktualisiere Code, Docstring, Testfälle und Grafik. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Alle vier Darstellungen müssen widerspruchsfrei sein.&lt;br /&gt;
# [[Softwarequalität|Messunsicherheit analysieren]]: Entwickle einen schriftlichen Vorschlag, wie eine fiktive Messunsicherheit beschrieben werden könnte, ohne eine reale Steuerung zu programmieren. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die Lösung ist tragfähig, wenn offene Annahmen und Entscheidungsbedarf deutlich werden.&lt;br /&gt;
# [[Softwaredokumentation|Übergabedokument erstellen]]: Erstelle eine einseitige Anleitung mit Zweck, Nutzung, Beispielen, Tests und bekannten Grenzen. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Eine neue Person soll die Übung ohne mündliche Nachhilfe nachvollziehen können.&lt;br /&gt;
# [[Softwarewartung|Dokumentationsaudit gestalten]]: Erfinde drei veraltete Aussagen in einer Dokumentation und zeige, wie Du sie durch lokale Tests überprüfen würdest. &amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Begründete Korrekturen verweisen auf beobachtbares Verhalten statt Vermutungen.&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;
Bearbeite die folgenden Aufgaben schriftlich oder mit selbst erstellten fiktiven Testdaten.&lt;br /&gt;
&lt;br /&gt;
# [[Softwarewartung|Änderungsfolgen]]: Erkläre, weshalb das bloße Ändern der Grenzwerte im Code keine ausreichende Wartungsmaßnahme ist. Beschreibe die Auswirkungen auf Dokumentation und Tests.&lt;br /&gt;
# [[Softwaretest|Grenzfallanalyse]]: Vergleiche eine Teststrategie mit ausschließlich Normalwerten mit einer Strategie aus Normal-, Grenz- und ungültigen Fällen. Begründe, welche Fehler die zweite Strategie zusätzlich aufdecken kann.&lt;br /&gt;
# [[Softwarequalität|Widerspruch erkennen]]: Ein Docstring bezeichnet 26 Grad Celsius als ungültig, der Code liefert OK. Entwickle ein Verfahren, mit dem Du den Widerspruch lokal nachweisen und beheben kannst.&lt;br /&gt;
# [[Anforderungsanalyse|Unklare Spezifikation]]: Ein Ausbildungsauftrag nennt nur einen zulässigen Temperaturbereich, aber keine Regel für fehlende Werte. Formuliere zwei notwendige Rückfragen und begründe sie.&lt;br /&gt;
# [[Technische Dokumentation|Grenzen bewerten]]: Erkläre, weshalb ein bestandener Unit-Test keine Aussage über Kalibrierung, Messunsicherheit oder die Sicherheit einer echten Anlage beweist.&lt;br /&gt;
# [[Informationssicherheit|Sicher übertragen]]: Entwirf einen Ablauf, mit dem Du eine Programmierübung aus einem Ausbildungsbetrieb an eine andere lernende Person weitergeben kannst, ohne vertrauliche Daten oder produktive Zugänge preiszugeben.&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;
Für einen erfolgreichen Lernnachweis benötigst Du:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Kommentierten Quellcode:&amp;#039;&amp;#039;&amp;#039; Eine lokal lauffähige Python-Funktion mit verständlicher Benennung und zutreffendem Docstring.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Funktionsvertrag:&amp;#039;&amp;#039;&amp;#039; Angaben zu Zweck, Eingaben, Rückgaben, Beispielen und bekannten Grenzen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Testnachweis:&amp;#039;&amp;#039;&amp;#039; Mindestens sechs fiktive Testfälle, darunter beide Grenzwerte und ungültige Eingaben.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Testprotokoll:&amp;#039;&amp;#039;&amp;#039; Erwartete und tatsächlich ermittelte Ergebnisse mit kurzer Begründung bei Abweichungen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Visualisierung:&amp;#039;&amp;#039;&amp;#039; Eine eigene Tabelle oder ein Flussdiagramm zur dokumentierten Entscheidungsregel.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Review:&amp;#039;&amp;#039;&amp;#039; Mindestens drei nachvollziehbare Qualitätsprüfungen und eine begründete Verbesserung.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Transferleistung:&amp;#039;&amp;#039;&amp;#039; Eine dokumentierte Änderung der fiktiven Anforderung einschließlich angepasster Tests.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Sicherheitsnachweis:&amp;#039;&amp;#039;&amp;#039; Bestätigung, dass ausschließlich lokale oder ausdrücklich freigegebene Testumgebungen und fiktive Daten verwendet wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bewertungsvorschlag:&amp;#039;&amp;#039;&amp;#039; Lesbarkeit 20 Prozent, Dokumentation 25 Prozent, Tests 25 Prozent, Transfer und Begründung 20 Prozent, sichere Durchführung 10 Prozent.&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;
== Fachlich überprüfte Quellen ==&lt;br /&gt;
&lt;br /&gt;
# [https://peps.python.org/pep-0008/ PEP 8 – Style Guide for Python Code]: Offizielle Empfehlungen zu Lesbarkeit, Benennungen und Kommentaren.&lt;br /&gt;
# [https://peps.python.org/pep-0257/ PEP 257 – Docstring Conventions]: Konventionen für Dokumentationszeichenketten.&lt;br /&gt;
# [https://docs.python.org/de/3.12/library/unittest.html Python-Dokumentation – unittest]: Offizielle Erläuterung des Testframeworks.&lt;br /&gt;
# [https://docs.python.org/de/3.12/library/math.html Python-Dokumentation – math]: Beschreibung mathematischer Funktionen einschließlich isfinite.&lt;br /&gt;
# [[Softwaredokumentation]]: Überblick über Formen und Ziele der Softwaredokumentation.&lt;br /&gt;
# [[Programmierstil]]: Hintergrund zu lesbarem und wartbarem Programmcode.&lt;br /&gt;
# [[Kommentar (Programmierung)]]: Erläuterung von Kommentaren in Programmiersprachen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht jede frei abrufbare Fachquelle und nicht jedes YouTube-Video ist automatisch eine frei lizenzierte OER.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Geprüfte Medien und Nutzungsrechte ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Medium&lt;br /&gt;
! Urheberangabe&lt;br /&gt;
! Lizenz laut Wikimedia Commons&lt;br /&gt;
|-&lt;br /&gt;
| [https://commons.wikimedia.org/wiki/File:Syntaxhighlighting.png Syntaxhighlighting.png]&lt;br /&gt;
| Geany-Entwickler, Screenshot bereitgestellt von Kreuzschnabel&lt;br /&gt;
| GPL ab Version 2&lt;br /&gt;
|-&lt;br /&gt;
| [https://commons.wikimedia.org/wiki/File:Flowchart_de.svg Flowchart de.svg]&lt;br /&gt;
| Erik Streb&lt;br /&gt;
| CC BY-SA 3.0&lt;br /&gt;
|-&lt;br /&gt;
| [https://commons.wikimedia.org/wiki/File:Testing_Pyramid.svg Testing Pyramid.svg]&lt;br /&gt;
| Abbe98&lt;br /&gt;
| CC BY-SA 4.0&lt;br /&gt;
|-&lt;br /&gt;
| [https://commons.wikimedia.org/wiki/File:Code_Review_photo-1.jpg Code Review photo-1.jpg]&lt;br /&gt;
| Matthew (WMF)&lt;br /&gt;
| CC BY-SA 3.0&lt;br /&gt;
|-&lt;br /&gt;
| [https://commons.wikimedia.org/wiki/File:Software_Development_Life_cycle.png Software Development Life cycle.png]&lt;br /&gt;
| Tazlavi&lt;br /&gt;
| CC BY-SA 4.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Dateien sind unverändert eingebunden. Beachte bei einer Weiterverwendung die jeweilige Lizenz, die Namensnennung und gegebenenfalls die Weitergabe unter gleichen Bedingungen. Die verlinkten Commons-Dateibeschreibungen enthalten die maßgeblichen Lizenzdetails.&lt;br /&gt;
&lt;br /&gt;
Die eingebetteten YouTube-Videos sind externe Angebote. Die Rechte verbleiben bei den jeweiligen Berechtigten. Eine frei verfügbare Wiedergabe bedeutet keine Erlaubnis zur beliebigen Kopie oder Bearbeitung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenschutz:&amp;#039;&amp;#039;&amp;#039; Externe Videos, LearningApps und Wikipedia-Einbettungen können beim Aufruf Verbindungen zu Drittanbietern auslösen. Verwende sie nur im Rahmen der Freigaben Deiner Ausbildungsorganisation. Keine Übungs- oder Kundendaten an solche Dienste übertragen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Wikipedia-Einbettung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Softwaredokumentation &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative bei gesperrter Einbettung:&amp;#039;&amp;#039;&amp;#039; [[Softwaredokumentation]] auf Wikipedia direkt aufrufen, sofern externe Webseiten freigegeben sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&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;[[Softwaredokumentation]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Quelltext]]&lt;br /&gt;
# [[Kommentar (Programmierung)]]&lt;br /&gt;
# [[Programmierstil]]&lt;br /&gt;
# [[Lesbarkeit]]&lt;br /&gt;
# [[Python (Programmiersprache)]]&lt;br /&gt;
# [[Softwaretest]]&lt;br /&gt;
# [[Unit-Test]]&lt;br /&gt;
# [[Code-Review]]&lt;br /&gt;
# [[Softwarequalität]]&lt;br /&gt;
# [[Refactoring]]&lt;br /&gt;
# [[Softwarewartung]]&lt;br /&gt;
# [[Informationssicherheit]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Softwaretechnik]]&lt;br /&gt;
[[Kategorie:Python]]&lt;br /&gt;
[[Kategorie:Berufsausbildung]]&lt;br /&gt;
[[Kategorie:Technische Bildung]]&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= aiMOOC-Projekte =&lt;br /&gt;
[[Kategorie:AI_MOOC]] [[Kategorie:GPT aiMOOC]]&lt;br /&gt;
{{MT}}&lt;/div&gt;</summary>
		<author><name>Glanz</name></author>
	</entry>
</feed>