Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Dieser Kurs ist auf 5 Tage ausgelegt, ob diese Tage in einer Reihe oder auf verschiedene Wochen verteilt liegen spielt dabei keine Rolle. Die einzelnen Tage wurden in 45min-Blöcke unterteilt:
Die detaillierte Modulidentifikation inkl. beschriebenen Handlungskompetenzen kann auf der Website von ict-berufsbildung.ch nachgelesen werden.
Eine Aufgabe analysieren mit einer Entwicklungsumgebung mit integriertem GUI-Designer implementieren, dokumentieren und testen
Ab Tag 2 werdet ihr an einem Projekt arbeiten. Dieses Projekt und die dazugehörige Dokumentation wird bewertet und ergeben die Modulnote.
Die Bewertung stellt sich aus folgenden Bestandteilen zusammen:
Name
Gewichtung
Praktische Umsetzungsarbeit
100%
Anaylse und Design
25%
Implementation
40%
Clean Code und Dokumentation
20%
Testing, Testfälle
15%
Mittels Debugging kannst du die Applikation während des laufenden Betriebs anhalten und Einblick in Variabeln usw. erhalten.
Klicke neben einer Codezeile auf die graue Fläche, dann erscheint ein roter Kreis, das ist ein Break-Point. Sobald das Programm auf dieser Zeile landet, wird es unterbrochen.
Starte jetzt das Programm mit dem Start Button.
Der Break-Point im Beispiel hier ist in der Methode label1_Click(...) gesetzt, das heisst, wenn ich auf das label klicke, wird das Programm angehalten.
Visual Studio sollte jetzt so aussehen, auf dem roten Kreis befindet sich jetzt ein gelber Pfeil, dieser zeigt, auf welcher Linie sich die Ausführung des Programms gerade befindet.
Oben sollten jetzt folgende Schaltflächen auftauchen:
Mit ihnen kann jetzt der Programmablauf gesteuert werden:
: Stoppt die Ausführung des Programms
: Stoppt die Ausführung und startet sie erneut.
: Führt die aktuelle Zeile aus und hält wieder bei der nächsten Zeile.
Unten im Watcher sieht man die Werte von Variabeln im aktuellen Kontext:
Seitlich in den Diagnostic Tools sieht man die aktuelle Auslastung des Speichers und der CPU:
: Führt den aktuellen Kontext aus und sprint eine Ebene hinaus (z.B. aus der Methode) und der gelbe Pfeil springt dort auf die nächste Zeile.
: Führt das Programm weiter aus (bis zum nächsten Break-Point)
Was bedeutet "ein Projekt ist gescheitert"?
Gemäss der CHAOS-Studie sind 1994 84% gescheitert.
erfolgreich: Projekt wurde innerhalb der vorgegebenen Zeit und Budget abgeschlossen. Projektergebnis ist im Einsatz und erfüllt alle Anforderungen.
nicht erfolgreich: Das Projekt wurde vorzeitig abgebrochen oder das Projektergebnis wurde nie eingesetzt. Verluste 1994: $ 80 Mrd.
teilweise erfolgreich: Projekt ist abgeschlossen. Projektergebnis ist im Einsatz. Zeit, Budget oder Leistung sind aber nicht im vorgegebenen Umfang erreicht worden. Verluste 1994: $ Billionen (Schätzung, nicht messbar)
Seither ist aber eine Besserung sichtbar:
In 2er-Gruppen diskutiert Ihr, warum IT-Projekte schief gehen können. Schreibt mögliche Gründe auf die roten Kärtchen und mögliche Gegenmittel auf grüne Kärtchen.
Präsentiert anschliessend eure Erkenntnisse der Klasse.
Du bist ein selbständiger Softwareentwickler und erhältst folgende Nachricht via LinkedIn:
Guten Tag Herr Schuler
Mein Name ist Hans Kunde, ich bin Leiter der Aussendienst-Reparaturabteilung für dampfbetriebene Vakuumiergeräte bei der Firma SteamVac AG in Buttisholz.
Aus Ökologischen Gründen steht unseren Aussendienstmitarbeitenden kein Geschäftsauto zur Verfügung und sie gehen mit dem öffentlichen Verkehr zu Kundenbesuchen. Da wir vor zwei Jahren einige Fälle von Industriespionage erlebten, dürfen die Mitarbeitenden kein Smartphone mit sich tragen. Ihr einziges Arbeitsgerät ist ein Windows Tablet mit einer Spezialversion von Windows, die aus Sicherheitsgründen keinen Browser installiert hat.
Dadurch müssen sie jeweils vor Abreise im Büro die ÖV-Verbindungen ausdrucken. Bei spontanen Einsätzen oder Planänderungen können sie erst am Bahnhof sehen, welchen Zug sie nehmen müssen.
Um diese Situation zu verbessern, möchten wir für unsere Aussendienstmitarbeitenden eine Software erstellen lassen, die es ihnen ermöglicht, schnell eine ÖV-Verbindung zu suchen. Sie soll auf ihren Windows 10 Tablets benutzt werden können.
Können wir uns mal zu einem Gespräch treffen?
Freundliche Grüsse Hans Kunde
Du triffst dich mit Herrn Kunde zu einem Interview um gemeinsam die Anforderungen zu erarbeiten. Nachfolgend findest du die transkribierten Aussagen von Herrn Kunde, die er im Gespräch gemacht hat.
Ich möchte Verbindungen suchen zwischen Start- und Endstationen, sicher die nächsten vier Verbindungen sollen angezeigt werden. Natürlich muss das auch funktionieren, wenn ich den Namen der Station nicht komplett kenne. Es wäre gut, wenn vielleicht bereits Vorschläge erschienen würden, während ich den Namen der Station am eintippen bin, sowie wenn ich bei Facebook jemanden markiere, da schlägt es ja auch Namen vor während ich noch am tippen bin. Oh, und ich möchte auch unbedingt eine Art Abfahrtstafel haben, dass ich nur eine Station eingeben kann und dann zeigt es alle Verbindungen an, die von dort weg gehen. Gut wäre auch, man könnte ein Datum und eine Uhrzeit eingeben, um Verbindungen in der Zukunft zu suchen. Super praktisch wäre auch noch, wenn man auf einer Karte sehen könnte, wo sich die Station befindet, geht das? Könnte man auch machen, dass man vom aktuellen Standort die nächsten Stationen anzeigen könnte? Wäre aber nicht so schlimm wenn das nicht machbar wäre. Toll wäre noch, wenn man direkt per Mail jemanden über die Zugverbindung informieren könnte.
Auch zu den Prioritäten hat sich Herr Kunde geäussert:
Prioritäten? Ja also ich möchte ja am liebsten alles haben haha, aber wenn die Zeit nicht reicht, möchte ich ganz sicher die Verbindungen, Stationssuche und das mit der Abfahrtstafel. Diese Funktionen sind ein muss! Dann zweite Priorität wäre dass mit den Vorschlägen während dem tippen und die zukünftigen Verbindungen mit Datum- und Zeiteingabe. Der Rest ist nice to have, aber wäre super, wenn Sie das auch umsetzen könnten.
Du konntest Herrn Kunde eine erste Konzeptphase verkaufen, in welcher deine Aufgabe ist, die Anforderungen zu analysieren und ein Konzept zu erstellen. Teil des Konzepts ist es, User Stories zu schreiben, welche einerseits die Kundenbedürfnisse und Anforderungen gut abbilden, andererseits für die spätere Umsetzung direkt als Arbeitspakete dienen werden.
Bereite deine vor und füge die User Stories und das Aktivitätsdiagramm direkt in deine Dokumentation ein.
Formuliert zu zweit die User Stories.
Granularität: Es sollte etwa 8 User Stories ergeben
Jede User Story hat
Häufig gestellte Fragen werden hier beantwortet.
Wenn die Toolbox nicht aufgetaucht ist, kannst du sie im Menü unter "Ansicht > Toolbox" öffnen.
Ist der Menüpunkt nicht vorhanden oder sind in der Toolbox keine Elemente vorhanden, musst du eventuell noch .
Rechtsklick auf das Projekt, welches dein Form enthält > "Set as StartUp Project". Tipp: Der Name des gewählten Startprojekts wird fett geschrieben, alle anderen nicht.
Überprüfe, dass das gewählte Startprojekt (das, wo der Name fett ist) deine Form enthält. Wenn nicht, folge den Anweisungen von (Wie kann ich wählen, welches meiner Projekte ausgeführt wird?).
Die Dokumentation im Projektordner unter /doc einfügen.
Lasset euch von der Microsoft Dokumentation inspirieren:
Weil du dich für eine Informatiker-Lehre entschieden hast.
Kommt ganz drauf an, ob du Software entwickeln oder Hamburger braten willst.
Du brauchst mich nicht siezen.
Ihr könnt in der Pause am Morgen Pizza bestellen. Die Mittagspause beginnt normalerweise um 11:45.
Fragt euren Instruktor, ob er auch eine Pizza bestellen möchte.
Binaries sind die Dateien, welche zur Ausführung des Programmes benötigt werden. Bei WinForms sind folgende Dateitypen in den Binaries zu finden:
.exe - Ausführbare Datei
.dll - Code-Library
.pdb - Debug-Informationen
.exe.config - Config-Datei für .exe
.xml - Hier: XML-Kommentare
Diese Binaries liegen, nachdem man im Visual Studio den Build ausgeführt hat, entweder unter bin\Debug oder bin\Release. Der Ort hängt von der Build-Konfiguration ab. Diese kann wie folgt eingestellt werden:
Der Release-Build ist besser optimiert als der Debug-Build, kann jedoch weniger gut debugged werden. Empfohlen für die Abgabe ist der Release Build.
Der Installer ist ein Bonuspunkt für schnelle. Dieser muss ohne Unterstützung des Kursleiters/der Kursleiterin umgesetzt werden.
Die Binaries oder der Installer müssen für den Kursleiter/die Kursleiterin öffentlich zugänglich zur Verfügung gestellt werden. Die Empfohlene Variante ist GitHub Release. kann eine Anleitung dazu gefunden werden. Die Binaries oder der Installer sollen in einer .zip-Datei hochgeladen werden.
Um Regelmässig deine Änderungen auf den Git Server zu pushen, kannst du direkt im Visual Studio committen und pushen.
Öffne den Team Explorer. Wenn er noch nicht da ist, findest du ihn unter "View" > "Team Explorer".
Klicke auf "Git Changes".
Nun erscheint eine Auflistung aller Änderungen seit dem letzten Commit. Um diese zu committen, musst du sie zuerst stagen.
Hier findet ihr alle Details zur Projektarbeit.
In diesem ÜK geht es darum, eine Applikation zu programmieren, welche die Fahrplandaten des Schweizerischen öffentlichen Verkehrs benutzt. Mit der Applikation soll es möglich sein, Verkehrsverbindungen zwischen zwei Stationen zu suchen. Aus der Bewertung dieser Projektarbeit ergibt sich die ÜK-Note.
Stelle sicher, dass die Dokumentation im /doc Ordner deines Repositories liegt und dieses committed und gepusht ist.
Überprüfe, ob deine komplett ist.
Stelle sicher, dass die Binaries oder der Installer released ist (siehe )
Bei mir gibt es kein "Windows Forms Projekt" zur Auswahl.
Du musst noch ein Zusatzpaket installieren. Gehe dazu in Visual Studio unter Tools auf "Get Tools and Features"
Eventuell muss sich jetzt noch der "Visual Studio Installer" updaten:
Auf "Update" klicken und warten.
Anschliessend das Paket ".NET desktop development" auswählen und installieren.
Wenn das fertig ist, sollte es funktionieren.
Einzelarbeit
Mindestens die User Stories der Priorität 1 müssen davon abgedeckt sein.
Achte dabei auf die Gestaltprinzipien
Füge das fertige Mockup in deine Dokumentation ein.
Zeit: 40min
🎓 Das Mockup ist Teil des Projektes und wird bewertet.
ID und Titel
Beschreibung nach dem Schema Als <Nutzer> möchte ich <Funktion>, um <Wert>
Abnahmekriterien
Priorität (1 - 3, wobei 1 die höchste Priorität ist)
Formuliert noch eine User Story mit einer eigenen Idee, welche Ihr dem Kunden vorschlagen könnt.
Zu einer Story mit Priorität 1:
Zeichnet ein Aktivitätsdiagramm
Zeigt die User Stories eurem Instruktor früh genug, damit ihr allfälliges Feedback noch umsetzen könnt.
Zeit: 90min
Führe ein letztes mal ein commit und push durch.
Abgabeschluss für das Projekt und die Dokumentation ist Tag 5 um 16:15 Uhr. Commits nach 16:15 Uhr werden nicht mehr berücksichtigt.
Zuerst musst du einen Fork des Repos in deinem eigenen Github Account erstellen. Über diesen Account wirst du das Projekt am Ende des Kurses abgeben.
Falls du noch keinen github account erstellt hast, erstelle jetzt einen.
Gehe zur Projektvorlage auf Github und erstelle einen Fork in deinen Account:
Jetzt sollte github automatisch auf das frisch geforkte Projekt in deinem github Profil wechseln.
Klicke auf den grünen Button Code und anschliessend kopierst du die URL im Textfeld.
Jetzt musst du das Repo auf deinen Rechner klonen, damit du daran arbeiten kannst.
Öffne jetzt Visual Studio und wähle "Clone a repository"
Gib die kopierte URL bei "Repository Location" ein und wähle ausserdem aus, wo auf deinem Rechner du das Projekt speichern willst. Klicke zum Schluss auf "Clone".
Nach dem Klonen sollte die Solution modul-318-student geöffnet werden. Sie beinhaltet zwei Projekte "SwissTransport" und "SwissTransportTest".
SwissTransport ist das Projekt, welches uns den Zugriff auf die API bietet, über die wir Stationen und Verbindungen abfragen können.
SwissTransportTest beinhaltet die Unit Tests, mit welchen die Methoden der SwissTransport-Library getestet werden.
Damit du das GUI programmieren kannst, musst du ein neues Projekt zur Solution hinzufügen. Wähle dazu das Project Template "Windows Forms App".
Rechtsklick im Solution Explorer auf die Solution und dann > "Add" > "New Project..." (deutsch: "Hinzufügen" > "Neues Projekt...").
Suche nach "Windows Forms" und wähle "Windows Forms App".
Kliche auf "Next" und gib dem Windows Forms Projekt einen sinnvollen Namen, z.B. "MyTransportApp" oder "SwissTransportGUI". Klicke zu Schluss auf "Create".
Jetzt sollten in deiner Solution drei Projekte angezeigt werden.
Damit das neu erstellte Projekt das Startprojekt ist, rechtsklicke auf dein neu erstelltes Projekt und wähle "Set as Startup Project" (deutsch: "Als Startprojekt festlegen"). Du erkennst das Projekt, das beim Start aktiviert wird daran, dass es im Solution Explorer fett geschrieben ist:
Als nächstes müssen wir eine Referenz zum SwissTransport Projekt erstellen, damit wir auf die Klassen in diesem Projekts zugreifen können.
Rechtsklicke dazu auf "Dependencies" direkt unter deinem Projekt und dann klicke auf "Add Project Reference"
Wähle den Eintrag "SwissTransport" an und klicke OK.
Fahre auf der nächsten Seite fort, um den ersten Commit und Push durchzuführen.
Klicke auf das + Icon, um die Änderungen zu stagen.
Gebe in die Textbox (1) einen Text ein, der gut und knapp beschreibt, was du seit dem letzten Commit gemacht hast.
Klicke dann auf den kleinen Pfeil neben "Commit Staged" (2) und wähle "Commit Staged and Push"
Diesen Vorgang solltest du regelmässig wiederholen!
Dies war eine Anleitung, um Git direkt in Visual Studio zu verwenden. Wenn du lieber git in der Konsole verwenden möchtest, findest du in diesem Dokument eine Hilfestellung:

Im Kapitel Projektanforderungen analysieren müsst ihr aus den Aussagen des Kunden die User Stories erstellen. Bei der Umsetzung müsst ihr euch an diese User Stories halten und diese Umsetzen.
Es wird keine Dokumentation im eigentlichen Sinne verlangt. Es braucht jedoch im Minimum ein Dokument, das die folgenden Informationen enthält.
Autor, Datum.
Inhaltsverzeichnis
Eine Einleitung (Management Summary).
Zweck des Dokuments.
Falls bestimmte Funktionen nur teilweise umgesetzt wurden: Welche? Welcher Teil der
Funktionalität fehlt noch? Bekannte Fehler/Bugs?
für alle Formulare/Dialoge (GUI) , die benötigt werden um die Anforderungen mit Priorität 1 abzudecken.
User Stories mit Abnahmekriterien und Status (ob sie umgesetzt wurden oder nicht)
Aktivitätsdiagramm für eine User Story mit der höchsten Priorität.
(Systemtests), verständlich und eindeutig nachvollziehbar geschrieben, so dass ein Tester diese ohne weiteren Erklärungen durchführen kann.
mit Durchführungsdatum der Tests, Name des Testers und Protokollierung der tatsächlichen Testresultate.
Installationsanleitung: Wie wird die Software installiert? Wie wird die Software deinstalliert?
Andere spannende Informationen für die Bewertung.
Die Dokumentation soll sauber gestaltet, inhaltlich korrekt und übersichtlich strukturiert sein. Achte auf Typographie und Rechtschreibung!
Das Dokument soll zusammen mit dem Source Code im git in einem Ordner doc abgegeben werden.
Dieses Script wurde im Rahmen des Moduls 318 "Analysieren und objektbasiert programmieren mit Komponenten" für ICT Berufsbildung Zentralschweiz von Michael Zurmühle erstellt. In 5 Tagen soll ein Verständnis für das objektbasierte Programmieren mit GUI Komponenten, die Sprache C# sowie ein Überblick über die Objektorientierte Programmierung erlangt werden.
Symbol
Bedeutung / Einsatz
🗓
Plan
🛠
Dieses Symbol taucht da auf, wo ihr selbst Hand anlegen könnt. Es wird gewerkelt.
❓
Da, wo Fragen beantwortet werden oder Schritt für Schritt-Anleitungen stehen, findet ihr dieses Symbol.
📖
Hier findet ihr Theorie und Wissen.
💡
Ihr seid gefragt! Hier wird geknobelt und probiert, denn Ihr löst Aufgaben oder programmiert euer Projekt.
Als Entwickler müssen wir immer mehrere Ziele verfolgen. Unsere Programme sollten benutzerfreundlich sein, sie müssen die Kundenanforderungen erfüllen und sie sollten einfach zu warten und zu erweitern sein. Wir sollten sie kostengünstig erstellen können und nicht zuletzt wollen wir Spass dabeihaben.
Kann Euch dieser ÜK dabei helfen, ein besserer, benutzer-naher und effizienter(er) Entwickler zu werden? Einer, der Spass bei der Arbeit hat?
Wir haben versucht den Kurs auf diese Ziele auszurichten - im Folgenden werdet Ihr sehen was es mit diesem Kurs auf sich hat.
Wenn man die Modul Identifikation und die handlungsnotwendigen Kenntnisse des Modules anschaut, sieht er auf den ersten Blick wie jeder andere ÜK aus. Schaut man aber genauer hin, dann wird klar, dass dieser Kurs extrem viel Potential hat. Es geht um die Analyse einer Aufgabenstellung, es geht um die Gestaltung einer Benutzeroberfläche, also um GUI-Ergonomie. Und es geht um Programmierung, um Eventsysteme und sogar das Konzept der Objektorientierung wird gestreift. Auch die Qualität und das Testen werden thematisiert und wir werden Komponenten-Bibliotheken benutzen, die uns von den modernen Frameworks und Entwicklungsumgebungen zur Verfügung gestellt werden. Last but not least werden wir auch noch lernen, wie man Source Code mit GIT verwalten kann. Wir hoffen, dass Euch dieser ÜK schmecken wird.
Es gibt verschiedene Arten, wie Reihen dem Grid hinzugefügt werden können. Hier werden zwei Varianten gezeigt.
Dies ist die simpelste Variante. Pro Reihe wird ein String-Array dem Rows-Liste auf der DataGridView hinzugefügt. Diese werden in der Reihenfolge des Arrays in den jeweiligen Spalten angezeigt. Falls die Reihenfolge der Spalten sich ändert muss man das beachten.
Für eine Liste mit Objekten eignet sich die leicht kompliziertere Variante der BindingList und DataSource. Nachdem die DataSource zugewiesen wurde können die Reihen des Grids durch die Liste verwaltet werden.
Zur optimalen Vorbereitung auf dieses Modul, solltet Ihr Zugriff auf die Kursunterlagen haben, und die benötigten Tools installieren.
Dieses Gitbook findet Ihr unter m318.ict-bz.ch
Theorieinputs und Aufgaben sind hier nach Tag gruppiert. Da sich die Projektarbeit über mehrere Tage zieht, hat sie ihre eigene Gruppe bekommen in der Navigation.
Zusätzlich gibt es Unterlagen auf Moodle unter:
Im Verlauf dieses Kurses werden einige Tools benötigt, die Ihr jetzt installieren könnt:
Zudem benötigt Ihr einen Account für . Wer noch keinen besitzt, kann ihn nun erstellen.
"Ein Programmierstil (engl. code conventions, coding conventions, coding standards) ist in der Programmierung das Erstellen von Quellcode nach bestimmten vorgegebenen Regeln. Er gilt als Teilaspekt von Softwarequalität, der insbesondere die Verständlichkeit und Wartbarkeit von Software, dies sind Kriterien für Softwarequalität gem. ISO/IEC 9126 (aktualisiert durch ISO/IEC 25000) unterstützen soll." - Wikipedia 2020
In einem Team muss man sich auf einen bestimmten Programmierstil einigen, damit der ganze Source Code einigermassen einheitlich daher kommt und man sich gut zurechtfindet. Oft wird das über Coderichtlinien gelöst. Es gibt z.B. firmenweite Coderichtlinien für eine Sprache, oder im Fall von C# gibt es sogar von Microsoft selbst empfohlene Richtlinien, an welche sich immer mehr Teams versuchen zu halten.
Die Bewertung stellt sich aus folgenden Bestandteilen zusammen:
Funktionalität
Welche Anforderungen wurden erfüllt?
Die Anforderungen mit der höchsten Priorität geben die meisten Punkte.
Wurde eine eigene User Story/Idee implementiert?
Code
Wie effizient läuft das Programm? Keine langen Reaktionszeiten oder lange Netzwerkcalls. Nicht optimieren, wenn nicht nötig
Ist der Code wartbar? Hält er sich an die Coding-Guidelines von Microsoft? Sprechende und konsistente Namen für Variablen, Methoden, Klassen, UI Controls?
Wurden Techniken der Objektorientierten Programmierung eingesetzt? Gibt es eine eigene Klasse?
Kompilliert der Code? Keine Warnungen?
Wurde der Code wie erwartet in Github zur Verfügung gestellt?
Sind alle Unit Tests immer noch grün? Zusatzpunkt für eigenen Unit Test.
GUI / Benutzerfreudnlichkeit
Ist die Software gut und konsistent benutzbar, d.h. ist das GUI übersichtlich, selbsterklärend und logisch? Werden UI Standards eingehalten?
Werden Eingaben validiert?
Funktioniert die Software zuverlässig? Werden Fehler behandelt oder stürzt die Software ab? Sind die Fehlermeldungen verständlich formuliert?
Kann ich die Software mit einem Installer installieren und deinstallieren?
Dokumentation
Wurden alle Anforderungen in den User Stories abgebildet?
Sind die User Stories mit guter Granularität getrennt oder steckt zuviel Funktionalität in einer einzelnen User Story? (Richtgrösse: ca. 8 User Stories)
Sind alle User Stories korrekt formuliert und besitzen eine ID, Titel, Beschreibung nach dem korrekten Schema und Abnahmekriterien?
Sind die User Stories sinnvoll priorisiert?
Ist eine eigene User Story vorhanden?
Hat jede User Story einen Status (umgesetzt / nicht umgesetzt)?
Sind die Mockups vorhanden und gut/vollständig?
Ist das Aktivitätsdiagramm vorhanden, sinnvoll und kurz beschrieben? Wurden die korrekten UML-Elemente verwendet?
Ist beschrieben, wo die Software heruntergeladen und installiert werden kann?
Ist die Dokumentation vollständig und übersichtlich strukturiert? Ist Rechtschreibung und Grammatik einigermassen OK?
Sind die Testfälle (Testplan) vorhanden und sinnvoll, verständlich und nachvollziehbar formuliert? Lassen sie sich mit dem abgegebenen Code auch wirklich durchführen?
Ist das Testprotokoll vorhanden und wurden die Tests durchgeführt?



Hier findet ihr die kompletten Coding Guidelines von Microsoft:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions
Heute gibt es Tools, die es einem erleichtern, Code zu schreiben, der sich an Coderichtlinien hält. Mit ReSharper und StyleCop lässt sich der Code analysieren und teilweise sogar automatisch korrigieren, sodass er den Richtlinien entspricht, gut eingerückt ist, keine ungebrauchten Usings hat usw.
Hier findet ihr weitere infos zu Resharper: https://www.jetbrains.com/resharper/
Hier zu StyleCop: https://blog.submain.com/stylecop-detailed-guide/
Nachfolgend findest du einige Codeschnipsel, welche sich nicht an die Richtlinien halten. Bestimme, was nicht gut ist und wie man es besser machen könnte.
💬
In der Klasse oder in kleineren Gruppen diskutiert ihr ein Thema.
🚩
Dies ist ein Meilenstein.








Klassische vs. Agile Vorgehensweise
In klassischen Prozessmodellen, wie dem Wasserfallmodell wurde oft zu Beginn eines Projektes ein sogenanntes Pflichtenheft erstellt, wo alle möglichen Anforderungen aufgeschrieben wurden. Dieses musste dann von Auftraggeber und Auftragnehmer unterschrieben werden und galt als Vereinbarung für das Produkt, welches aus dem Projekt entstehen sollte.
Das Problem: Oft, oder gar fast immer, haben Programmierer und Kunden nicht die gleiche Vorstellung von einer Lösung.
Daher kam es oft vor, dass zu Beginn eines Projektes mit dem Kunden dieses Pflichtenheft angeschaut wurde und unterschrieben, und dann nach Monaten der Entwicklung das Programm "fertig" war und dem Kunden übergeben wurde. Darauf folgte dann auch immer die Ernüchterung. "Das habe ich so nicht bestellt".
Eine der schwersten Aufgaben in der Softwareentwicklung ist es, die Bedürfnisse des Kunden zu verstehen. In der Regel sind Kunden technisch nicht versiert und wissen nicht, was technisch möglich ist.
Der Kunde kennt nur, was er hat. Wenn er sagt, "ich möchte ein schnelleres Pferd", muss man zuerst das Bedürfnis verstehen. Das schnellere Pferd ist nämlich nicht wirklich das Bedürfnis, sondern bereits ein Lösungsvorschlag basierend auf den Kenntnissen des Kunden. Tatsächlich will er schneller von A nach B kommen.
Wenn man die Wünsche des Kunden zu wörtlich nimmt, kann das die Lösungsfindung wesentlich einschränken.
Unzureichende Kommunikation
Zeitdruck / Zeitmanagement
Ressourcen-Planung
Ziele falsch gesetzt
Im klassischen Wasserfallmodell haben die Aktivitäten eine klare Reihenfolge.
Analyse: Projektplan, Offerte, Kalkulation, Pflichtenheft
Design: Technische Dokumentation, GUI-Styleguide
Codierung: Umsetzung der Software
Test: Testdokumentation (Testszenarien), Testumgebung/-einrichtung
Erst am Ende kommt das Resultat zum Kunden. Es liegt auf der Hand, dass das Resultat meist nicht den Erwartungen des Kunden entsprach ().
Die Welt, die Leute und damit auch die Anforderungen ändern sich laufend. In einem klassischen Projektvorgehen hat man aber nicht die Möglichkeit, sich an neue Gegebenheiten, Erkenntnisse oder Wünsche anzupassen.
Fehler werden spät erkannt. (späte Entdeckung von Anforderungs-, Analyse- und Designfehlern, oft erst während Integrationstest)
Risiken werden lange mitgeschleppt («weil jetzt noch nicht codiert/getestet werden darf»)
Nachträgliche Anforderungen können nicht berücksichtigt werden.
Projektfortschritt ist über lange Zeit nicht messbar.
Mit einer agilen Vorgehensweise kann man diese Probleme grösstenteils umgehen.
Das Team von Softwareentwicklern arbeitet in kleinen Iterationen von 2 bis 4 Wochen. Nach jeder Iteration (auch Sprint genant), findet ein Release der funktionsfähigen Software statt, welcher getestet und dem Kunden zur Verfügung gestellt werden oder sogar bereits veröffentlicht werden kann.
Dadurch kann der Kunde von Beginn an der Entwicklung des Produktes teilnehmen und aktiv einschreiten. So werden Missverständnisse sehr schnell erkannt und können korrigiert werden.
Wenn wir das Bild oben nochmal betrachten, kann man auf der Fahrradtour mit einer agilen Vorgehensweise jede Etappe separat planen und sich den neuen Gegebenheiten anpassen.
Die Entwicklung findet in Iterationen / Sprints statt. Die Aktivitäten des Entwicklungszyklus werden in jeder Iteration von neuem durchlaufen. Analyse, Design, Implementierung, Test, Validation, (Release).
Durch die iterative Vorgehensweise entsteht am Ende jeder Iteration ein Produkt. Die Funktionalität der Software nimmt somit inkrementell zu.
Wird eine neue Software entwickelt, kann nach jeder Iteration geprüft werden, ob die Software bereits veröffentlicht und kommerziell genutzt werden kann. So kann ein Produkt potentiell viel früher finanzielle Einnahmen generieren und mit den Einnahmen weiterentwickelt werden.
Potentiell hat man in einer agilen Vorgehensweise also schon früher etwas brauchbares und am Ende durch die ständige Reflexion und Überarbeitung vielleicht sogar ein besseres Resultat.
Weitere Vorteile sind:
Fortlaufendes Kundenfeedback -> verbesserte Kommunikation
Probleme / Risiken werden früher erkannt
Greatest Risk first: Reduktion von Projektrisiken: wenn das Projekt scheitert, dann wenigstens früh (bevor viel Geld ausgegeben wurde)
Im Sommer 2016 veröffentlichte Nintendo gemeinsam mit Niantic das Smartphone Game "Pokemon Go", wobei die Entwickler agil vorgingen.
Die erste Version, die im Frühsommer 2016 erschien, war alles andere als "fertig". Viele Features, die beworben wurden, waren gar nicht vorhanden und kamen später mit regelmässigen Software-Updates nach.
Trotzdem hat das Spiel bereits 30 Tage nach Veröffentlichung 100 Millionen Downloads im Google Play Store verzeichnet und den Entwicklern durch In-App-Käufe rund $160 Millionen eingebracht (Quelle: ).
Im Projekt SwissTransport, das bereits in eurer Solution vorhanden ist, befindet sich Code, der es euch erlaubt, auf die SwissTransport API zuzugreifen.
Eine (optionale) Anforderung erfordert es, dass eine zusätzliche Methode in Transport programmiert wird, welche zusätzlich Datum und Uhrzeit entgegennimmt.
Dafür wird sicher die API Dokumentation hilfreich sein.
Um die Transport API zu verwenden, musst du in deiner Klasse eine Instanz der Transport Klasse erstellen.




GUI Ergonomie
Ein "gutes GUI" wird heute als Selbstverständlich angeschaut.
Die Gewohnheiten von heute haben sich über lange Zeit entwickelt und früher war nicht alles besser:
Das Konzept von GUIs im heutigen Sinne stammt aus den 1970er Jahren.
Seit 1973 erarbeitete man am Xerox PARC in Kalifornien den Xerox Alto (erster Computer mit einem GUI)
Den ersten kommerziellen Einsatz zeigte 1981 der Xerox Star. Einen grösseren Kreis von Anwendern erreichte das Konzept erst durch die populäreren Computer von Apple (Apple Lisa, 1983).
1985 begann Microsoft mit Windows mitzumischen. Der grosse Durchbruch erfolgte erst Anfang der 90er Jahre mit Windows 3.1.
Softwareentwickler sind Menschen und Menschen machen Fehler. So liegt nahe, dass auch jede Software Fehler enthält. Mit Testing-Methoden stellen wir sicher, dass Fehler so früh wie möglich erkannt und behoben werden können.
Es gibt verschiedene Arten, Software zu testen. Manuell, Automatisiert, Black-Box, White-Box Tests. Das Ziel dieser Lektion ist es, die verschiedenen Test-Arten zu kennen und einige davon anwenden zu können.
public class Person
{
private Point _position;
public void Walk()
{
this._position.x += 10;
}
}public class Person
{
public Person[] _children;
public string Name { get; set; }
public void SayChildrensNames() {
foreach (Person child in this._children) {
Console.WriteLine(child.Name);
}
}
}public class person
{
public string name { get; private set; }
public void rename(string newname)
{
this.name = newname;
}
}public static class Program
{
public static void Main()
{
var a = new Person();
var b = new Car();
b.Owner = a;
var c = b.Breaks;
var d = c.Material;
Console.WriteLine($"{a.Name} drives a {b.Brand} with {c.Name} breaks made of {d}");
}
}public static class Program
{
public static void Main()
{
var person=new Person();
var children=person.Children;
for(i=0;i<children.Count;i++){
children[i].Walk();
}
}
}balanceChangesGrid.Rows.Add(new[]
{
"15:00:00",
"1.00",
"20.00"
});// Member-Variable mit Binding List
private BindingList<BalanceChangelogEntry> balanceChangelogEntries = new BindingList<BalanceChangelogEntry>();
// Im FormLoad
balanceChangesGrid.DataSource = balanceChangelogEntries;
// Beim Hinzüfugen der Reihe
balanceChangelogEntries.Add(new BalanceChangelogEntry
{
BalanceChange = 1,
NewBalance = 20,
Time = DateTime.Now
});









Unpräzise, stetig ändernde Anforderungen
Ungenügendes Testen
Projektstatus ungenügend verfolgt
Integration: Benutzerhandbuch , fertiges System
Was versteht ihr unter "Ergonomie"?
Was bedeutet Ergonomie im Bezug auf Software?
Die Norm EN ISO 9241 ist ein internationaler Standard, der Richtlinien der Mensch-Computer-Interaktion beschreibt. Die Normenreihe trägt seit 2006 den deutschen Titel Ergonomie der Mensch-System-Interaktion und löst damit den bisherigen Titel Ergonomische Anforderungen für Bürotätigkeiten mit Bildschirmgeräten ab, um die frühere Einschränkung auf Büroarbeit aufzulösen.
„The difference lies in whether people are regarded as extensions of the machine or the machine is designed as an extension of people.“ Czaja (1987)
"Dumme" Benutzer gibt es nicht, es gibt nur schlecht gestaltete Benutzungsschnittstellen.
Usability steht für die Benutzbarkeit oder Bedienungsfreundlichkeit eines interaktiven Systems. Interaktive Systeme sind Systeme, die eine Benutzungsschnittstelle aufweisen und auf Benutzeraktionen reagieren. Dazu gehören einfache Maschinen ebenso wie komplexe Softwaresysteme.
Der Begriff Usability bedeutet, dass ein System:
leicht erlernbar
eine geringe Fehlerrate aufweist (effektiv)
effizient benutzbar
Benutzerbefriedigung bewirken
Im Zusammenhang mit Usabilty werden die folgenden 5 E's oft verwendet:
Effective:
How completely and accurately the work or experience is completed or goals are reached
Efficient:
How quickly this work can be completed
Engaging:
How well the interface draws the user into the interaction and how pleasant and satisfying it is to use
Error Tolerant:
How well the product prevents errors and can help the user recover from mistakes that do occur
Easy to Learn: How well the product supports both the initial orientation and continuous learning throughout its complete lifetime of use
Das User Interface oder auch Benutzerschnittstelle ist die Art wie ein Mensch mit einer Maschine in Kontakt tritt. Daher wird es in Fachliteratur oft auch Mensch-Maschine-Schnittstelle genannt. Damit eine Benutzerschnittstelle für den Menschen nutzbar und sinnvoll ist, muss sie seinen Bedürfnissen und Fähigkeiten angepasst sein. Die Grundlagenkenntnisse für eine ergonomische und benutzerfreundliche Schnittstellen-Gestaltung werden in der Wissenschaftsdisziplin der Ergonomie erarbeitet.
Der Erfolg eines technischen Produktes hängt nicht nur von den Faktoren Preis, Zuverlässigkeit und Lebensdauer ab, sondern auch vom Faktor Handhabbarkeit bzw. Bedienungsfreundlichkeit. Idealerweise erklärt sich eine Benutzerschnittstelle intuitiv von selbst, also ohne Schulungsaufwand. Der Lichtschalter ist trotz seiner Beliebtheit und Einfachheit keine ideale Benutzerschnittstelle, sondern der Kompromiss eines Zielkonflikts. Dieser besteht darin, dass der Schalter einerseits direkt am einzuschaltenden Gerät angebracht sein sollte, also an der Lampe selbst (damit man ihn nicht suchen muss). Andererseits sollte er in der Nähe der Tür sein (wo er in der Regel auch ist), damit man nicht im Dunklen erst nach der Lampe tasten muss.
Die User Experience oder wörtlich Deutsch Nutzererfahrung umschreibt alle Aspekte der Erfahrungen eines Nutzers bei der Interaktion mit einem Produkt, Dienst, einer Umgebung oder Einrichtung. Der Begriff „User Experience“ kommt meist im Zusammenhang mit der Gestaltung von Websites oder Apps zur Anwendung, umfasst jedoch jegliche Art der Produktinteraktion, also unter anderem auch die nicht-digitale, physische Nutzung. Festigkeit bzw. Stabilität, Nützlichkeit und Schönheit können gemessen werden. Bei der Stabilität oder einer minimalen Antwortzeit ist das noch relativ einfach. Das Messen der beiden anderen Kriterien ist aufwändiger. Es stehen verschiedene Methoden zur Verfügung, u. a. die Blickerfassungsmethode, bei der die spontane Wahrnehmung der Website über die Augenbewegung des Benutzers gemessen wird. Auch Benutzerbefragungen anhand standardisierter Fragebögen sind üblich. Bei der Validierung der User Experience in der Praxis sind Fragen wichtig wie: „Wie schnell vermittelt sich dem User Sinn, Konzept und Zweck einer Website?“
Wie beurteilt ihr die UI, UX und Usability dieser zwei Varianten der Ketchup-Flasche?
Bislang wurden über 100 Gestaltprinzipien formuliert, die sich teilweise überschneiden. Insofern beschränke ich mich exemplarisch auf die Wichtigsten:
Das Gesetz der Ähnlichkeit besagt, dass wir ähnliche Elemente als zusammengehörig wahrnehmen. Es spielt dabei keine Rolle, auf welche Eigenschaft sich die Ähnlichkeit bezieht. Es kann beispielsweise die Farbe, Form, Textur, Größe, Geschwindigkeit, Bewegungsrichtung etc. als Gruppe wahrgenommen werden. Je mehr Gemeinsamkeiten ein Element hat, umso deutlicher nehmen wir die Gruppierung wahr.
Als Beispiel haben wir eine Grafik mit Punkten. Jeder Punkt hat denselben Abstand zum anderen. In der Grafik verändere ich zuerst nur die Farbe einiger Elemente und unser Auge verarbeitet dies sofort zu einer Gruppierung. In einem nächsten Schritt ändere ich die Form. Obwohl die Farbe hier wieder einheitlich ist, sehen wir die Zusammengehörigkeit. Diesen Effekt erzielen wir allein durch die Veränderung einer einzigen Eigenschaft.
Elemente, die räumlich näher beieinander liegen, werden als zusammengehörig wahrgenommen. Unsere Wahrnehmung gruppiert diese Elemente automatisch. Im folgenden Beispiel sieht man, wie sich dieses Gesetz mit einfachen Punkten, deren Abstand zueinander variiert, zeigen lässt.
Nur durch leichte Anpassungen der Abstände der Punkte zueinander, gruppiert unser Gehirn diese Punkte entweder zu einer vertikalen oder zu einer horizontalen Einheit. Dieses Gesetz ist eines der stärksten und wichtigsten Gesetze in der Gestaltung und sollte daher immer berücksichtigt werden.
Dieses Gestaltgesetz besagt, dass Komponente in umschlossenen Gebieten als Einheit empfunden werden. Dinge, die durch Linien getrennt sind, wirken nicht als zusammengehörig. Besonders für Webseiten mit viel Fremdwerbung ist es wichtig, das Gesetz der gemeinsamen Region zu nutzen, um die Vielfalt der Produkte voneinander sichtbar abzugrenzen.
Elemente, die sich gemeinsam verändern oder bewegen, werden als zusammengehörig wahrgenommen. Bekannt aus Animationen, Leuchtreklamen, Paraden uvm. Auch nehmen wir Vogelschwärme nicht als tausende einzelner Vögel wahr, sondern als einen sich bewegenden Schwarm.
Teilt euch in 3 Gruppen auf und erläutert bezogen auf eure Aspekte
Kriterien für eine benutzerfreundliche Oberfläche (GUI)
je ein gutes und ein schlechtes Beispiel
Gruppe 1: Aspekt Übersichtlichkeit und Sebsterklärend Gruppe 2: Aspekt Logischer Aufbau und Komfortabilität Gruppe 3: Fehlerbewusstheit und Gewohnheit
Zeit: 20min
In diesem Beispiel gehen wir das Beispiel aus Aufgabe 11 der Übung C# Grundlagen durch und zeichnen Schritt für Schritt ein Objektdiagramm. Wichtig dabei, das Objektdiagramm ist immer eine Momentaufnahme, es ändert sich also nach jeder Zeile Code, die ausgeführt wurde.
Gegeben sind folgende Klassen:
Beachte, dass das Objekt nicht kopiert wird. Es gibt jetzt lediglich eine zweite Referenz auf dieses Objekt. Es existiert aber nur einmal im Speicher.
So ergibt sich schlussendlich dieses Objektdiagramm:
Zeichne das Objektdiagramm auf Papier nach der Ausführung des folgenden Codes:
Syntax
Kompiliert vs. Interpretiert -> Was bedeutet das?
Objektorientiert vs. Prozedural -> Was ist der Unterschied?
Welches ist "die beste" Sprache?
Viele Sprachen haben sehr ähnliche Syntax. Nachfolgend stehen einige Konstrukte von C/C++, Java, VB und C# im Vergleich.
Funktionieren die beiden Beispiele? Warum? Warum nicht?
C# ist sehr vielseitig einsetzbar. Früher war es eher auf Desktopanwendungen für die Windowsplattform fokussiert, heute ist es mit .NET Core universell einsetzbar.
Mit WinForms, WPF oder Konsolenanwendungen können mit C# und dem .NET Framework seit eh und je Desktopanwendungen entwickelt werden. Sie sind noch immer weit verbreitet.
Mit Frameworks wie Mono und Avalonia können auch Desktop Apps für Linux und macOS in C# entwickelt werden.
Seit Microsoft .NET Core lanciert hat, welches neben Windows auch unter Linux und macOS läuft, eignet sich C# noch mehr für die Programmierung von Web-Backends und REST APIs.
Mit Xamarin können mobile Apps für Android und iOS in C# entwickelt werden. Früher kostete eine Lizenz etwa CHF 1500.- pro Entwickler pro Jahr. Das war vielen kleineren Herstellern zu viel. Seit Microsoft Xamarin 2016 aufgekauft hat, steht es den Entwicklern kostenlos zur Verfügung und wird von Microsoft selbst weiterentwickelt. Damit entwickelt man sogenannte Cross-Platform Native Apps. Die Apps werden zu plattformspezifischem Maschinencode kompiliert und laufen auf den Plattformen dann wie native Apps.
Da .NET Core sogar auf ARM Prozessoren läuft, kann es auch für die Entwicklung auf kleinen Prozessoren wie dem Raspberry Pi verwendet werden. Dies ermöglicht die Realisation vieler IoT Anwendungen mit C#.
Lies das folgende Dokument (ab Kapitel 2.) durch, um deine Kenntnisse mit der C# Syntax aufzufrischen.
Diskutiert gemeinsam in der Klasse:
Was bedeuten die Einträge in der Testpyramide?
Was sind Blackbox / Whitebox Tests?
Welche Einträge in der Pyramide sind Blackbox, welche Whitebox Tests?
Bei Manuellen Tests handelt es sich meist um Systemtests, da man das komplette System testet. Es gibt zwei Arten, eine Software manuell zu testen. Einerseits ist es das informelle Testen, andererseits das formelle Testen.
Bei einem Informellen Tests sitzt jemand vor der Software und probiert die Software aus, gibt schwachsinnige Eingaben ein und versucht so, Fehler in der Software zu finden, ohne einem bestimmten Schema zu folgen.
Bei formellen Tests wird vorher in einer Testplan Schritt für Schritt niedergeschrieben, was ein Tester klicken und eintippen muss und wie darauf die Software reagieren sollte.
Der Testplan gibt Schritt für Schritt-Anweisungen, welche von der Testenden Person durchgeführt werden sollen. Der Testplan sollte während der Entwicklung wachsen und jeweils neue Testfälle definiert oder Testfälle erweitert werden, damit neue Funktionalität abgedeckt ist.
Ein Testfall besteht immer aus:
Vorbedingungen
Testszenario, pro Schritt:
Schritt-Id
Aktivität
Erwartetes Resultat
Siehe hier ein Beispiel eines Testplans
Das Testprotokoll zeichnet die Durchführung eines Tests durch einen Tester oder eine Testerin auf. Das Testprotokoll ist grundsätzlich eine Kopie des aktuellen Testplans zum Zeitpunkt der Testdurchführung, mit Ergänzung der tatsächlichen Resultate.
Ein Testprotokoll benötigt:
Dokumentversion (Testplan)
Durchführungsdatum
Name der testenden Person
App Version / Umgebung
Anweisungen, wie auf die Applikation zugegriffen werden kann / wie sie installiert wird.
Ergänzung jedes Schrittes mit dem Tatsächlichen Resultat und dem Erfüllungsgrad.
Siehe hier ein Beispiel eines Testprotokolls
Im Gegensatz zu manuellen Tests können automatisierte Tests vom Computer selbst und regelmässig durchgeführt werden, z.B. bei jedem Commit & Push.
Automatisierte Tests können auf allen Stufen der Testpyramide vorkommen. Die häufigste Form ist der Unit Test, der jeweils eine individuelle Klasse / Methode Testet.
Ein Unit Test ist ein automatisierter Test, welche die kleinste Einheit einer Software testet. Normalerweise gibt es für jede Klasse auch eine Unit Test Klasse und für jede Methode, die getestet wird, mehrere Unit Tests.
Das Ziel ist es, diese Klasse abgekoppelt von jeglichen Abhängigkeiten testen zu können.
Anschliessend sieht man einen Beispielhaften Unit Test:
In einer Visual Studio Solution kann mittels Rechtsklick > Add > New Project > Unit Test Project ein neues Unit Test Projekt hinzugefügt werden.
Im neu erstellten Projekt kann nun eine neue Klasse erstellt werden nach dem oben abgebildeten Schema.
Um die Tests auszuführen, klickt man im Menü auf Test > Run All Tests.
Component- , Integration- und Systemtests sind ebenfalls automatisiert. Anstatt sich auf eine Klasse zu fokussieren, geht es hier immer mehr auch um das Zusammenspiel mehrerer Klassen, mehrerer Komponenten und auch des kompletten Systems.
Ein Automatisierter UI Test hat das Potential, je nach Projekt alle manuellen Tests zu ersetzen. Er simuliert einen Tester, der vor dem Programm sitzt und darin Maus- und Tastatureingaben macht und kann überprüfen, ob die Software wie erwartet reagiert.
Da automatisierte Tests ohne menschliche Interaktion durchgeführt werden können, ist es möglich, diese regelmässig durchzuführen. Ein Build Server kann beispielsweise bei jedem Commit & Push den neusten Source Code herunterladen und die Unit Tests ausführen.
In einem Nightly Build könnte er die automatisierten UI Tests jede Nacht durchführen, weil diese vielleicht etwas länger dauern (je nach Grösse des Projekts auch einige Stunden).
ITransport transport = new Transport();
Unten stehen sechs Aufgaben. Es ist empfohlen, dass alle Aufgaben in der selben Projektmappe (Solution) gelöst werden. In der Projektmappe soll pro Aufgabe ein Projekt angelegt werden. Du kannst wählen, welches Projekt ausgeführt wird, indem du folgenden Anweisungen folgst: ❓FAQ (Wie kann ich wählen, welches meiner Projekte ausgeführt wird?).
TextBox Control
Button Control
ListBox Control
Es soll ein Text eingegeben werden können. Dieser Text wird der Liste hinzugefügt, sobald die Eingabe bestätigt wird. Die Listeneinträge sollen nummeriert werden ("1: _", "2: _", ...).
Namensgebung
Angenehme Benutzeroberfläche gestalten
Folgendes soll bei der generellen Namensgebung beachtet werden:
Priorisiere Lesbarkeit über Kürze (CanScrollHorizontally anstatt ScrollableX)
Auch keine Abkürzungen, ausser in Ausnahmefällen mit allgemein bekannten Abkürzungen
Wähle eine einfache Reihenfolge (CanScrollHorizontally anstatt HorizontalCanScroll)
Folgendes soll bei der Namensgebung für WinForms beachtet werden:
Projektmappen sollen sinnvolle Namen haben (z.B. "M318Exercises" anstatt "MySolution")
Projekte sollen sinnvolle Namen haben (z.B. "M318Exercise1" anstatt "MyFormsProject")
Der Name kann auf Deutsch oder Englisch sein, solange alle Namen in derselben Sprache sind.
Folgendes soll Für die Benutzerfreundlichkeit beachtet werden:
Die Tab-Reihenfolge soll sinnvoll sein
TabIndex-Eigenschaft
Zusammengehörige Controls nacheinander
Etwa in der Reihenfolge, wie man liest
Folgendes sollte zur allgemeinen Codequalität beachtet werden:
Magic Strings: Strings, welche direkt in einer Statement hart kodiert sind und das Verhalten der Anwendung steuern. Diese sollen via Konstanten oder Variablen abgebildet werden. Mehr, siehe:
Redundante Strings: Wenn ein String doppelt in der Anwendung vorkommt soll er via Konstanten oder Variablen ausgelagert und nur einmalig deklariert werden. Dies gilt doppelt für Magic Strings.
Die Einrückung soll immer gleich sein (Standard im Visual Studio: 4 Tabs pro geschachteltem Codeblock)
Diese Grundsätze sollen ab jetzt immer umgesetzt werden. Bei der Projektarbeit zählt das zu Benutzerfreundlichkeit und Code-Qualität!
ComboBox Control
Buttons korrekt einschalten oder ausschalten
Doppelklick
Erstelle eine Anwendung, in welcher du auswählen kannst, was du frühstücken möchtest. Diese Anwendung soll aus folgenden Teilen bestehen:
Combobox, welche alle nicht gewählten Nahrungsmittel enthält
Listbox, welche die gewählten Nahrungsmittel enthält
Ein Button ">>", welcher das in der Combobox markierte Nahrungsmittel wählt
Ein Button "<<", welcher das in der Listbox markierte Nahrungsmittel entwählt
Ein Doppelklick auf ein Nahrungsmittel in der Listbox hat dieselbe Funktionalität wie der Button "<<", das Nahrungsmittel soll also entwählt werden.
Ein wichtiges Feature ist, dass die Buttons korrekt ein- und ausgeschalten werden. Wichtig zu beachten ist, dass jedes Nahrungsmittel entweder in der Combobox oder in der Listbox ist, aber nicht an beiden Orten zugleich.
RadioButton Control
CheckBox Control
GroupBox Control
Erstelle eine Anwendung mit drei Gruppen (GroupBox). In der ersten zwei Gruppen sollen je drei RadioButton-Controls sein. In der dritten Gruppe sollen drei CheckBox-Controls sein. Beim Klick auf einen Button soll eine MessageBox gezeigt werden, welche ausgibt, was ausgewählt wurde.
Eingabevalidierung
Status der Anwendung merken
Erstelle ein Form, welches ein Eingabefeld, einen Einzahlen-Button, einen Abheben-Button und ein Label mit dem aktuellen Kontostand hat. Man darf nur positive Zahlen eingeben. Das Abheben soll nur dann passieren, wenn man auch genügend Geld auf dem Konto hat. Ansonsten soll eine Fehlermeldung gezeigt werden. Die Anzeige soll immer den aktuellen Kontostand anzeigen.
DataGridView Control
Neu soll ein Protokoll erstellt werden. Verwende dafür eine DataGridView mit drei Spalten: Uhrzeit, Änderung des Kontostands und neuer Kontostand.
Logik in eine Klasse auslagern
Erstelle eine Klasse, welche die Logik für dein Bankkonto enthält. Sie soll folgende Methoden enthalten:
Lagere nun alle Logik in diese Klasse aus. Beachte, dass du keine redundante Logik hast. Die Klasse soll für alle möglichen Eingaben korrekt reagieren, sprich negative Eingaben ablehnen.
Datei-Interaktionen
Der aktuelle Kontostand soll nun nicht nur angezeigt, sondern auch in einer Datei gespeichert werden. Wenn die Anwendung gestartet wird soll der Kontostand aus der Datei geladen werden. Diese Datei soll im Ordner der Temporären App-Daten sein (Umgebungsvariable %TEMP%).
Timer
Anwendung mit mehreren möglichen Zuständen abbilden
Entwickle eine Stoppuhr. Sie soll aus einer Zeitanzeige (hh:mm:ss), zwei Buttons und einer ListBox bestehen. Sie soll den folgenden Ablauf abbilden können:
Komplexere Anwendung realisieren
Erstelle eine Adressverwaltung. Die wichtigsten Funktionen sind:
Erfassen, Löschen und Bearbeiten von Adressen
Speichern und Laden der Adressen in/aus einer Datei
Suchen von Adressen
Anforderungen:
Klasse, z.B. Address, welche die Daten einer Adresse enthält. Sie soll folgende Eigenschaften haben:
Vorname
Nachname
Strasse
Grundlagen der Objektorientierten Programmierung
Wo liegt der Unterschied zur prozeduralen Programmierung?
Was ist der Unterschied zwischen einer Klasse und einem Objekt?
Was bewirkt das Schlüsselwort new ?
Was sind Eigenschaften?
Was sind Methoden?
1970 hat Alan Key im XEROX Forschungszentrum die erste OO Sprache "Smalltalk" entwickelt. Sie beeinflusste die Entwicklung vieler späterer Programmiersprachen (auch Java und C#).
Prinzipien von Smalltalk (und Objektorientierung):
Alles ist ein Objekt
Objekte kommunizieren durch das Senden und Empfangen von Nachrichten
Objekte haben ihren eigenen Speicherbereich
Jedes Objekt ist die Instanz einer Klasse.
Bereits 1985 wurde die erste Version des ISO/IEC 2382-15 Standards beschrieben. Die aktuellste Version wurde 2015 veröffentlicht.
Objektorientierung bezieht sich auf eine Technik oder Programmiersprache, welche Objekte, Klassen und Vererbung unterstützt.
Die komplette ISO kann hier gefunden werden:
Zwei Autos werden einem Bauplan erstellt, können dann aber unterschiedliche Eigenschaften haben (z.B. Farbe, Geschwindigkeit, usw.). Genauso können zwei Objekte einer bestimmten Klasse erstellt werden, aber unterschiedliche Eigenschaften haben.
Analogie "Kuchen backen": Ausgehend von einem bestimmten Kuchenrezept (vgl. Klasse) lassen sich beliebig viele gleichartige Kuchen (vgl. Objekte) backen (vgl. erzeugen).
Grundaufbau einer Klasse:
Ein Konstruktor ist eine spezielle Methode. Sie wird immer bei der Erzeugung eines Objektes mit dem new Keyword aufgerufen.
Dieses Beispiel hat einen Konstruktor ohne Parameter:
Mithilfe des new Keywords wird hier ein neues Objekt der Klasse Person erzeugt.
Dieses Beispiel hat einen Konstruktor mit einem Parameter:
Hier wird mithilfe des new Keywords ein neues Objekt der Klasse Baum erzeugt. Dabei wird ein Parameter übergeben.
Attribute, auch "Felder" oder "Membervariabeln" genannt, sind Variabeln, welche nur innerhalb des Objektes bekannt sind und auch nur von da verwendet werden sollten. Daher sollten Sie immer mit private gekennzeichnet sein.
Eigenschaften sind (in der Regel) nach aussen verfügbar. Im Grunde machen sie Felder nach aussen verfügbar:
Eigenschaften bestehen immer aus einem getter und einem setter (oder nur einem getter, falls es eine readonly-Eigenschaft ist).
Die getter und setter sind quasi eigene Methoden.
In Java beispielsweise gibt es keine Eigenschaften. Da wird jeweils eine Getter-Methode GetAlter() und eine Setter-Methode SetAlter(int alter)programmiert.
C# bietet die Möglichkeit sogenannter Auto-Properties. Dies wird dann verwendet, wie im Beispiel oben, wo eine Eigenschaft lediglich als Wrapper eines Feldes dient.
Wenn eine Klasse existiert, erstellen wir mittels des new Keywords eine Instanz (also ein Objekt) dieser Klasse:
Die Eigenschaften und Methoden werden dann mit einem . aufgerufen.
Klassen modularisieren eine Anwendung in unabhängige Einheiten. Sie verwalten zusammengehörende Daten und gruppieren ähnliche Methoden. Klassen können bausteinähnlich in verschiedenen Programmen – in der .NET-Laufzeitumgebung sogar vollkommen unabhängig von der verwendeten Programmiersprache – gleichwertig eingesetzt werden. Als Konsequenz dessen ändert sich auch der Arbeitsablauf der Programmierung: Programme müssen nicht mehr in allen Einzelheiten neu geschrieben werden, sie werden zu einem großen Teil aus fertigen Komponenten zusammengesetzt – vergleichbar mit der Entwicklung und dem Zusammenbau eines Motors, bei dem im Wesentlichen genormte Maschinenteile (Schrauben, Bolzen etc.) zum Einsatz kommen.
Eine Klasse kapselt ihre Daten sowie die interne Implementierung ihrer Methoden gegenüber der Aussenwelt und kann daher problemlos an neue Anforderungen angepasst werden. Anwendungsprogramme, welche die Dienste einer Klasse nutzen, bemerken davon nichts. Eine Klasse kann als eigene, separate und unabhängige Einheit getestet werden. Damit ist es auch vollkommen ausreichend, die Klassenimplementierung nur einmal ausgiebig zu testen. Verläuft der Test positiv, wird die Klasse mit jeder Anwendung zufrieden stellend zusammenarbeiten. Das Testen im Umfeld mehrerer Anwendungsprogramme entfällt und stellt damit die Effizienz der Programmierung sicher.
Die Kapselung bewirkt, dass Objekte den Zugriff auf die Daten selbst kontrollieren und eine fehlerhafte Datenmanipulation und die daraus resultierende Inkonsistenz abwehren können.
Versucht zu zweit die Antworten auf die folgenden Fragen zu finden, ohne hoch zu scrollen. Diskutiert eure Antworten und vergleicht sie mit der Antwort, die sich hinter dem Antwort Tab versteckt.
Was ist der Unterschied zwischen einer Klasse und einem Objekt?
In der Analogie in der Architektur und dem Häuserbau, was wäre da eine Klasse bzw. ein Objekt?
Die Klasse ist der Bauplan, das Objekt eine einzelne Instanz dieser Klasse.
Die Klasse wäre der Bauplan eines Hauses, das Objekt wäre ein fertig erbautes Haus.
Was programmiert man als Softwareentwickler? Klassen oder Objekte?
Klassen.
Was ist eine Methode?
Eine Methode ist eine Aktion, welche ein Objekt durchführen kann.
Wie erstellt man ein Objekt?
Mit dem new Keyword.
Öffne Visual Studio und erstelle ein neues Projekt.
Wähle Windows Forms App (.NET Framework).
Wähle nicht den Eintrag mit .NET Core, denn das funktioniert nicht (stand Mai 2020).
Gib dem Projekt einen Namen und Klicke auf "Erstellen"
Im Visual Studio sollte jetzt die neue Form1 und eine Toolbox ersichtlich sein.
Wenn die Toolbox nicht aufgetaucht ist, kannst du sie im Menü unter "Ansicht > Toolbox" öffnen.
Mit der kleinen Pin-Nadel auf der Seite kann die Toolbox geöffnet bleiben, ansonsten klappt sie immer zu.
In der Toolbox befinden sich alle verfügbaren GUI-Elemente. Von hier kann jetzt z.B. ein Button mit Drag'n'Drop auf die Form gezogen werden.
Mit Rechtsklick auf den Button > Eigenschaften erscheint das Eigenschaftenfenster des Buttons.
Das Eigenschaftenfenster sollte geöffnet bleiben. Es zeigt jeweils die Eigenschaften des selektierten GUI-Elements an. Nachfolgend sind einige Eigenschaften eines Elements erläutert:
Mit einem Klick auf das Icon öffnet sich die Event-Ansicht. Hier sind alle Events aufgelistet, die das gewählte Element aussenden kann, bzw. auf welche wir im Code reagieren können.
Wenn man direkt auf ein Event in dieser Liste doppelklickt, wechselt Visual Studio zur Code-Ansicht und erstellt eine Methode, welche aufgerufen wird, wenn dieser Event ausgelöst wird. Wenn man direkt auf den Button doppelklickt, erstellt Visual Studio eine Methode für den Click-Event.
Wenn man diese Methode im Code löscht, kann man den GUI-Designer nicht mehr öffnen! Man sollte immer zuerst in der Event Liste den Event löschen, danach kann die Methode gelöscht werden.
Wenn in der Event-Toolbox ein Event ausgewählt wird, steht unten die Erklärung dazu. Hier sind einige wichtige Events aufgeführt:
In diesem Beispiel wird Schritt für Schritt beschrieben, wie man ein Hello World programmiert, in welchem "Hello World" in ein Label geschrieben wird, wenn ein Button geklickt wird.
Visual Studio sollte jetzt zur Code-Ansicht wechseln und die folgende leere Methode erstellen:
Das ist schon alles. Starte das Programm, indem du auf den Button klickst. Probiere es aus!
string s = "abcd";
int[] a1 = { 1, 2, 3, 4 };
byte b = 56;
Punkt p = new Punkt(a1[0], 100);
Baum[] ba = new Baum[3];
Baum baum = new Baum(80, 2);string s = "abcd";public class Baum
{
int _hoehe, _breite;
public Baum(int hoehe, int breite)
{
_hoehe = hoehe;
_breite = breite;
}
public int Hoehe
{
get { return _hoehe; }
}
public int Breite
{
get { return _breite; }
}
}
public class Punkt
{
int _x, _y;
public Punkt(int x, int y)
{
_x = x;
_y = y;
}
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
}a1[0] = b;ba[1] = new Baum(2, 3); ba[2] = baum;Baum neuerBaum = ba[0];a1[0] = baum.Hoehe;p.Y = baum.Hoehe;ba = null;p.X = s.Length;ba = new Baum[] { neuerBaum, baum, new Baum(50, 8) };// Beispiel 1
int intNumber = 12000;
long longNumber = intNumber;// Beispiel 2
long longNumber = 12000;
int intNumber = longNumber;var i = 5;
var s = $"Die Zahl ist {i}.";[TestClass]
public class TransportTest {
[TestMethod]
public void TestGetStation() {
// arrange
var testee = new Transport();
// act
var stations = testee.GetStations("luz");
// assert
Assert.AreEqual(10, stations.StationList.Count);
Assert.AreEqual("Luzern", stations.StationList[0].Name);
}
}








Keine _ und andere Sonderzeichen
Keine Typ-Prefixe (name anstatt sName) (Ausnahme siehe Controls)
Keine Umlaute
Die Controls (z.B. Label, TextBox, ListBox) sollen sinnvolle Namen haben
Beispiel 1: titleLabel anstatt label1
Beispiel 2: connectionsGrid anstatt dataGridView1 oder connectionsDataGridView
Wichtig: Alle Controls sollen gute Namen haben, nicht nur die, welche im Code verwendet werden.
Die Events sollen sinnvolle Namen haben
Option 1: Korrekte Namensgebung verwenden
_ entferenen
Umformulierung
Beispiel: ConnectionsSelectedIndexChanged
Option 2: Generierte Namen verwenden
Achtung: Wenn ein Control umbenennt wird, müssen auch die dazugehörigen Events umbenennt werden.
Beispiel: connectionsGrid_SelectedIndexChanged
Bestätigungsfunktion (AcceptButton-Eigenschaft von Form)
Stellt ein, was passiert, wenn man Enter drückt
Sollte beinahe immer gesetzt sein
Abbrechenfunktion (CancelButton-Eigenschaft von Form)
Stellt ein, was passiert, wenn man Escape drückt
Soll bei Dialogen gesetzt sein
Anchoring korrekt gesetzt
Wenn man bei einem Form die Grösse verändern kann, muss die Anchor-Eigenschaft der Controls gesetzt werden. So werden die Controls sauber angezeigt.
Tipp: Controls, welche den Anchor links haben, sollen nur links von Controls sein, welche den Anchor rechts haben. Controls, welche den Anchor sowohl links als auch rechts haben, soll rechts nur rechts-Anchored und links nur links-Anchored Controls haben.
Mit GroupBox.Controls kann man auf die Buttons und Boxes zugreifen
Mit List<T>.OfType() kann man eine Liste nach Typ filtern
Für schnelle:
Streams sind eine robuste Alternative zur File-Klasse, die ihr wahrscheinlich noch antreffen werdet. Hier wäre eine Gelegenheit, das einzubauen. Siehe Dokumentation dazu.
System.TimeSpan kann für Zeitdauern verwendet werden und DateTime.Now liefert das aktuelle Datum mit UhrzeitBeachte, dass Runden unterbrochen werden können und noch immer die richtige Zeit haben müssen.
Schaue genau, ob deine Sekunde eine Sekunde lang ist. Es ist einfach, hier und da ein paar Millisekunden zu verlieren.
Postleitzahl
Ort
UI
Suchfeld
DataGridView mit der Liste der Adressen
Eingabefelder für die Eigenschaften der neuen oder zu bearbeitenden Adresse
Toolbar mit einer Option "Datei" mit den Optionen "Speichern" und "Laden"
Die Suche soll alle Eigenschaften der Adresse beinhalten.
Das Speichern und Laden der Adressen in einer Datei soll nur via Optionen in der Toolbar passieren, nicht beim Start der Anwendung.
Das Datei für das Speichern und Laden soll mit einem Datei-Dialog gewählt werden können.
Typ, Klassentyp
Name
Objekt
Klasse
Beschreibung
Objekte repräsentieren "Dinge" der realen Welt oder eines Problembereichs. Beispiel "der rote Wagen da unten im Parkhaus".
Klassen sind Baupläne für Objekte. Beispiel "Bauplan für einen Wagen".
Bild
C# Code
Auto auto = new Auto();
public class Auto {
// ...
}
Synonyme
Instanz
Wird ausgelöst, wenn der Mauszeiger das Element verlassen hat.
TextChanged
Wird ausgelöst, wenn sich der Text eines Elements geändert hat.
und viele mehr...
Eigenschaft
Bedeutung
(Name)
Der Name des Elements, wie es anschliessend im Code verwendet werden kann. Dies ist ein Variabelname und sollte entsprechend gut gewählt werden!
Text
Der Text, welcher im Element angezeigt wird.
Anchor
Hier kann konfiguriert werden, wie sich das Element bei der Veränderung der Fenstergrösse verhält.
Er dockt an einer bestimmten Seite an. Wenn z.B. Links und Rechts ausgewählt sind, vergrössert sich der Button mit dem Fenster.
TabIndex
Dies entscheidet die Reihenfolge des Fokus, wenn der Benutzer in einem Textfeld ist und die Tab Taste drückt, wird das Feld mit dem nächsthöheren TabIndex-Wert fokussiert.
Event
Bedeutung
Click
Event, der ausgelöst wird, wenn der Benutzer auf das Element klickt.
Enter
Wird ausgelöst, wenn der Fokus in ein Element geht. z.B. Wenn der Cursor (blinkende Linie im Textfeld) in ein Textfeld kommt.
Leave
Wird ausgelöst, wenn der Fokus aus einem Element verschwindet.
KeyUp
Wird ausgelöst, wenn eine Taste auf der Tastatur gedrückt wurde, während der Fokus in diesem Element ist.
MouseEnter
Wird ausgelöst, wenn der Mauszeiger sich auf das Element bewegt hat.
MouseLeave
Besprecht gemeinsam in der Klasse:
Wie bekomme ich Qualität in den Code?
Warum wollen wir Qualität?
Was heisst Qualität?
Die Interne Qualität beeinflusst die externe Qualität. Wenn beispielsweise der Motor eines Autos aufgrund von Qualitätsproblemen (interne Qualität) nicht mehr läuft, fährt es auch nicht mehr von A nach B. Hat eine Software schlechte interne Qualität, kann das nach extern mehr Kosten verursachen, da es vielleicht schwer erweiterbar ist, früher abgelöst werden muss etc.
➔ Schlüsselfaktor Interne Qualität!
Funktionierende Software (Korrektheit):
Die Software tut, was sie soll.
Performance ist akzeptabel
User Experience / Usability
Die externe Qualität kann hauptsächlich mittels überprüft werden, was später im Kurs noch behandelt wird.
Code veränderbar halten:
Readability
Simplicity
Testability
Damit Änderungen möglich sind, muss die Software eine innere Struktur haben, die solche Änderungen begünstigt. Dies bezeichnen wir als Evolvierbarkeit. Software wird in der Regel über lange Zeiträume betrieben. Während dieser Zeit ändern sich die Rahmenbedingungen, müssen Features ergänzt werden. Im Idealfall kostet die Implementierung eines Features einen festen Betrag, der unabhängig davon ist, wann das Feature realisiert wird.
Oft ist es auch heute noch so, dass in der Praxis der Preis für ein Feature steigt, je später es realisiert wird. Am Anfang sind Features preiswert, am Ende ist es teilweise gar nicht mehr möglich Features zu ergänzen, weil niemand mehr durchblickt. Die Software wird weggeworfen und neu entwickelt. Bis man an diesem Punkt ankommt, steigen die Kosten exponentiell. Das gemeine an exponentiellem Wachstum sind zwei Dinge:
Anfangs erkennt man kaum, dass die Kosten anwachsen. Die Steigerungen sind moderat.
Wenn man dann erkennt, dass die Kosten steigen, ist es zu spät. Die Steigerung schreitet dann plötzlich so schnell voran, dass ein Gegensteuern nicht mehr möglich ist.
Je einfacher die Software an geänderte Rahmenbedingungen angepasst werden kann, desto höher ist ihre Evolvierbarkeit. Doch Evolvierbarkeit erhält man nicht nachträglich. Evolvierbarkeit muss von Anfang an berücksichtigt werden! Die Software muss darauf ausgelegt sein.
Software muss funktional korrekt sein. Ein Buchhaltungsprogramm muss die Buchungen ordnungsgemäss verbuchen, eine Tabellenkalkulation muss richtig rechnen. Und auch die nicht-funktionalen Anforderungen müssen erfüllt sein. Das Programm muss schonend mit Ressourcen wie Speicher, Prozessorzeit, Plattenplatz, etc. umgehen, die Antwortzeiten müssen in einem definierten Rahmen liegen. Erst wenn alle Anforderungen erfüllt sind, ist die erstellte Software korrekt.
Dass Korrektheit erforderlich ist, wird niemand bestreiten. Doch die Frage ist, was konkret dafür getan wird. Es reicht unserer Ansicht nach nicht aus, Software nach deren Erstellung durch eine Testabteilung zu leiten, deren Aufgabe es ist, Fehler zu finden. Wir meinen, Korrektheit muss bereits während der Entwicklung berücksichtigt werden. Bereits die Entwickler müssen sich mit der Frage der Korrektheit auseinandersetzen. Und damit sie das überhaupt können, muss ihnen klar sein, was die Anforderungen sind. Schon daran mangelt es zu oft! Entwickler werden beauftragt, ein Feature zu implementieren, ohne ihnen präzise zu sagen, was die Abnahmekriterien für das Feature sind. Doch hier geht es nicht darum, Schwarzer Peter zu spielen und einen Schuldigen außerhalb der Entwicklungsabteilungen zu suchen. Schließlich ist es die Aufgabe der Entwickler, bei unklaren Anforderungen nachzufragen, statt in ihre Glaskugel zu schauen.
Um Software in guter Qualität zu schreiben, sind drei Schlüsselfaktoren sehr wichtig: Fokus, Qualität regelmässig messen und gute Teamarbeit.
Auf einzelnen Task konzentrieren.
Klares Ziel und klare Anforderungen - sonst wird falsches gebaut.
Abschluss des Tasks in Sichtweite, Tasks von kleiner .
Regelmässiges Messen der Qualität führt zu guter Qualität am Ende.
Reflexion: Ohne Rückschau ist keine Weiterentwicklung möglich. Nur wer reflektiert, wie er eine Aufgabenstellung gelöst hat, kann feststellen, ob der gewählte Weg einfach oder beschwerlich war.
Neue Erkenntnisse berücksichtigen: In einer jungen Wissenschaft wie der Informatik ist es wichtig, stets neue Erkenntnisse zu berücksichtigen. Dazu ist Reflexion auf allen Ebenen erforderlich. Angefangen beim Reflektieren über die Implementation beim Pair Programming oder Code Review, das tägliche Reflektieren des Teams, die Reflexion nach jeder Iteration, bis hin zur Reflexion der gesamten Branche über ihr Tun. Ohne Reflexion keine Weiterentwicklung!
Team nach Fähigkeiten aufstellen und diese Fähigkeiten bewusst nutzen (UI, Database, Multi-Threading, Kommunikation, Testing, Automation, Prozess, Social Skills usw.)
Spezialisten arbeiten als Team
Darauf achten, dass keine Tätigkeit nur von einem einzigen Teammitglied abhängig ist -> Bottleneck, wenn Spezialist nicht verfügbar, überlastet oder vom Zug überrollt wurde.
Die Clean Code Prinzipien leiten Clean Code Developer in ihrer täglichen Arbeit!
Das mag sich nun in der Kürze etwas antiquiert oder sektiererisch anhören. Sollen Softwareentwickler sich eine Zunftordnung geben oder gar einen Treueeid schwören? Nein, so meinen wir es natürlich nicht. Dennoch: In Ermangelung eines Konsenses darüber, was denn genau „gute Softwareentwicklung“ sei, glauben wir, dass ein „kleinster gemeinsamer Nenner“ Not tut. Die Branche – wobei wir hier zunächst nur die .NET Softwareentwicklung meinen – braucht einen Qualitätsmaßstab oder zumindest einen Erwartungshorizont für Professionalität. Die Zeiten, in denen jeder, der schon mal etwas in BASIC programmiert hatte, ausreichend qualifiziert war, um in einem Team mitzuarbeiten, sind vorbei. Genauso ist aber noch nicht die Zeit gekommen, in der die Vorlage eines Informatik Diploms wirklich etwas über die Befähigung zur Softwareentwicklung aussagen würde.
Wer nicht das ganze Buch lesen möchte, kann mal mit dem Cheat Sheet beginnen, welches die Wichtigsten Prinzipien und Praktiken abbildet:
Nachfolgend werden ein paar Beispiele abgehandelt.
Zwei Klassen, Komponenten oder Module sind gekoppelt, wenn wenigstens einer den anderen verwendet. Umso weniger Abhängigkeiten zwischen den Elementen bestehen, desto weniger sind sie gekoppelt.
Eine Komponente, die lose gekoppelt ist, kann viel einfacher geändert oder ausgetauscht werden, als eine stark gekoppelte Komponente.
Namen müssen abbilden, wofür eine Variable, eine Eigenschaft oder eine Klasse abbildet. Namen müssen präzise sein!
Der Name einer Methode muss beschreiben, was sie macht, nicht wie sie es macht.
Namen müssen die komplette Funktionalität reflektieren.
Keine Präfixes (wie m_Variable), keine Typeninformationen (wie string sName ).
Zwei Entwickler lösen ein Problem gemeinsam an einem Arbeitsplatz. Jemand ist der Fahrer, der andere der Navigator. Der Fahrer ist verantwortlich dafür, den Code zu schreiben, der Navigator ist verantwortlich, die Lösung an die Architektur und die Coding Richtlinien zu halten und schaut, wo es als nächstes hin geht. Beide fordern ihre Ideen und Herangehensweisen heraus.
Red – green – refactor. Test a little – code a little.
TDD ist ein Prinzip, in welchem man wann immer möglich zuerst einen Test programmiert und erst anschliessend die Funktionalität. Hier sprechen wir von sehr kleinen Schritten mit etwas Test-Code und etwas Production Code.

var name = "Bob";
var text = "Name: " + name;
// => text == "Name: Bob"public class BankAccount // Oder ‘Bankkonto’, je nach gewählter Sprache
{
public decimal Balance { get; private set; }
public bool Deposit(decimal amount) {...}
public bool Withdraw(decimal amount) {...}
}// Klassendefinition
public class Person
{
// Felder
private string _name;
// Eigenschaften
public string Name {
get {
return _name;
}
}
public DateTime Birthday { get; }
// Konstruktor ohne Parameter
public Person()
{
Name = "unknown";
}
// Konstruktor, der einen Namen und ein Geburtsdatum entgegennimmt
public Person(string name, DateTime birthday)
{
this.Name = name;
this.Birthday = birthday;
}
// Methode, die das aktuelle Alter berechnet.
public int GetAge() {
return (new DateTime()).Year - this.Birthday.Year;
}
// Methode, die welche die Imlementation der Basisklasse überschreibt.
public override string ToString()
{
return this.Name + " (" + this.GetAge() + ")" ;
}
}public class Person
{
// Eigenschaften
public string Name { get; }
// Konstruktor ohne Parameter
public Person()
{
Name = "unknown";
}
}
Person p1 = new Person();public class Baum
{
private int _hoehe;
public Baum (int hoehe) {
this._hoehe = hoehe;
}
}
Baum b1 = new Baum(55);public class Baum
{
private int _hoehe;
// ...
}private string _name;
public string Name {
get {
return _name;
}
}public int Alter {
get {
// Getter code
}
set {
// Setter code
}
}// Auto-Property mit Getter und Setter
public string Name { get; set; }
// Read only Auto-Property (nur mit Getter)
public int Alter { get; }Person p1 = new Person();var alter = p1.Alter;
var asText = p1.ToString();private void button1_Click(object sender, EventArgs e)
{
}private void helloWorldButton_Click(object sender, EventArgs e)
{
}ausgabeLabel.Text = "Hello World";int[] a1 = { 1, 2, 3, 4 };byte b = 56;Punkt p = new Punkt(a1[0], 100); Baum[] ba = new Baum[3];Baum baum = new Baum(80, 2);


Externe Qualität
Interne Qualität
Was der User sieht.
Features
Performance
Look & Feel
Zuverlässigkeit
Unter der Motorhaube.
Art und Weise, wie Subsysteme, Komponenten, Klassen, Methoden usw. gebaut und programmiert sind










































Software ist installiert unter <URL>
Die Folgenden Browser sind auf dem System jeweils in der aktuellsten Version verfügbar:
Chrome
Edge
Firefox
Die Folgenden Schritte mit allen oben genannten Browsern durchführen.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
Ein Browser Fenster öffnen und <URL> eingeben (ohne ‘/de’ usw.).
Die eingegebene URL ändert sich zu “<URL>/de/pricelist”.
Die Applikation wird auf deutsch angezeigt und die Preisliste wird angezeigt.
2
Den Menü-Button anklicken.
Das Menü öffnet sich.
Es beinhaltet die Abschnitte Preisliste, Produktverwaltung, Partnerverwaltung, Sonstiges und unterhalb die Sprachauswahl und die Versionsnummern.
Der initiale Import der Daten wurde durchgeführt.
Es sind mehr als 50 Produkte vorhanden.
Rabatte für die Partner Levels wurden definiert.
Produktbilder wurden für alle Produkte eingestellt.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
<URL> in einem Google Chrome Fenster öffnen.
Die Preisliste öffnet auf deutsch.
2
In der Top Bar unter Ansicht auf das Listen-Icon klicken.
Unterhalb der Top Bar ändert sich die Ansicht zu einer Tabelle mit Item-Nr, Name, Bezeichnung, Kategorie und Preis.
In der Tabelle werden 10 Einträge angezeigt.
Unten an der Tabelle wird angezeigt, wie Viele Elemente es total gibt, es hat eine Auswahl, um die Anzahl Elemente pro Seite festzulegen und Navigationselemente um auf die nächste / vorherige Seite zu wechseln.
Die Tabelle ist initial nach Item Nr. sortiert.
Oberhalb der Tabelle hat es zwei Tabs für Produkte und Optionen, initial ist das Produkte-Tab geöffnet.
Der initiale Import der Daten wurde durchgeführt.
Es sind mehr als 50 Produkte vorhanden.
Rabatte für die Partner Levels wurden definiert.
Für ECOSYS Produkte für das Partner Level “Special” wurde ein Rabatt von 50% festgelegt. (Menü - Rabatte - den Rabatt einstellen)
Produktbilder wurden für alle Produkte eingestellt.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
<URL> in einem Google Chrome Fenster öffnen.
Die Preisliste öffnet auf deutsch.
Es werden 5 Produkte angezeigt.
Für jedes Produkt wird Bild, Titel, Untertitel, Beschreibung mit roten dreieckingen Auflistungszeichen, Item Nr, Name, Bezeichnung Preis, Produktkategorie und Einsatzort angezeigt.
Für jedes Produkt sind die dazugehörigen Optionen nach Optionengruppe gruppiert angezeigt sowie deren ItemNr, Name, Bezeichnung und Preis.
Unten an der Seite wird angezeigt, wie Viele Elemente es total gibt, es hat eine Auswahl, um die Anzahl Produkte pro Seite festzulegen und Navigationselemente um auf die nächste / vorherige Seite zu wechseln.
2
Unten auf der Seite das Pfeil-Icon klicken, um auf die nächste Seite zu wechseln. ()
Es werden die nächsten 5 Produkte angezeigt.
Die Seite scrollt automatisch ganz nach oben.

















Einführung in C# und die Grundlagen dieser Programmiersprache.





Software ist installiert unter <URL>
Die Folgenden Browser sind auf dem System jeweils in der aktuellsten Version verfügbar:
Chrome
Edge
Firefox
Die Folgenden Schritte mit allen oben genannten Browsern durchführen.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
Ein Browser Fenster öffnen und <URL> eingeben (ohne ‘/de’ usw.).
Die eingegebene URL ändert sich zu “<URL>/de/pricelist”.
Die Applikation wird auf deutsch angezeigt und die Preisliste wird angezeigt.
✅✅✅
2
Den Menü-Button anklicken.
Das Menü öffnet sich.
Es beinhaltet die Abschnitte Preisliste, Produktverwaltung, Partnerverwaltung, Sonstiges und unterhalb die Sprachauswahl und die Versionsnummern.
Der initiale Import der Daten wurde durchgeführt.
Es sind mehr als 50 Produkte vorhanden.
Rabatte für die Partner Levels wurden definiert.
Produktbilder wurden für alle Produkte eingestellt.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
<URL> in einem Google Chrome Fenster öffnen.
Die Preisliste öffnet auf deutsch.
✅
2
In der Top Bar unter Ansicht auf das Listen-Icon klicken.
Unterhalb der Top Bar ändert sich die Ansicht zu einer Tabelle mit Item-Nr, Name, Bezeichnung, Kategorie und Preis.
In der Tabelle werden 10 Einträge angezeigt.
Unten an der Tabelle wird angezeigt, wie Viele Elemente es total gibt, es hat eine Auswahl, um die Anzahl Elemente pro Seite festzulegen und Navigationselemente um auf die nächste / vorherige Seite zu wechseln.
Die Tabelle ist initial nach Item Nr. sortiert.
Oberhalb der Tabelle hat es zwei Tabs für Produkte und Optionen, initial ist das Produkte-Tab geöffnet.
Der initiale Import der Daten wurde durchgeführt.
Es sind mehr als 50 Produkte vorhanden.
Rabatte für die Partner Levels wurden definiert.
Für ECOSYS Produkte für das Partner Level “Special” wurde ein Rabatt von 50% festgelegt. (Menü - Rabatte - den Rabatt einstellen)
Produktbilder wurden für alle Produkte eingestellt.
Schritt
Aktivität
Erwartetes Resultat
Abw. Resultat
Erfüllt
1
<URL> in einem Google Chrome Fenster öffnen.
Die Preisliste öffnet auf deutsch.
Es werden 5 Produkte angezeigt.
Für jedes Produkt wird Bild, Titel, Untertitel, Beschreibung mit roten dreieckingen Auflistungszeichen, Item Nr, Name, Bezeichnung Preis, Produktkategorie und Einsatzort angezeigt.
Für jedes Produkt sind die dazugehörigen Optionen nach Optionengruppe gruppiert angezeigt sowie deren ItemNr, Name, Bezeichnung und Preis.
Unten an der Seite wird angezeigt, wie Viele Elemente es total gibt, es hat eine Auswahl, um die Anzahl Produkte pro Seite festzulegen und Navigationselemente um auf die nächste / vorherige Seite zu wechseln.
✅
2
Unten auf der Seite das Pfeil-Icon klicken, um auf die nächste Seite zu wechseln. ()
Es werden die nächsten 5 Produkte angezeigt.
Die Seite scrollt automatisch ganz nach oben.
Was ist der Wert der Variablen i und c nach Durchlauf des Code-Abschnittes?
int i = 0;
int c;
for (c = 1; c <= 4; c++) {
i += c - 0;
}Was ist der Wert der Variablen b , m und n nach Durchlauf des Code-Abschnittes?
int n, m;
bool b;
n = 0;
m = 1;
b = true;
while (b && n < m) {
++
Was ist der Wert der Variabel i nach Durchlauf des Code-Abschnittes?
Was ist der Wert der Variabel j nach Durchlauf des Code-Abschnittes?
Was ist jeweils der Wert der Variable b nach Durchlauf des Code-Abschnittes?
Was ist jeweils der Wert der Variable b nach Durchlauf des Code-Abschnittes?
Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?
Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?
Was ist der Wert der Variable j nach Durchlauf des Code-Abschnittes?
Folgende Variablen seien definiert:
Betrachten Sie die folgenden Anweisungen und entscheiden Sie, welche korrekt und welche falsch sind. Fehlerhafte Programmzeilen sind durchzustreichen. Begründen Sie, wieso eine Anweisung falsch ist, z.B. nicht kompatibler Typ. Korrekte Programmzeilen müssen Sie mit einem OK bezeichnen.
Folgende Variablen seien definiert:
Betrachten Sie die folgenden Anweisungen und entscheiden Sie, welche korrekt und welche falsch sind. Fehlerhafte Programmzeilen sind durchzustreichen. Begründen Sie, wieso eine Anweisung falsch ist, z.B. nicht kompatibler Typ. Korrekte Programmzeilen müssen Sie mit einem OK bezeichnen.
Folgende Klassen, Variablen und Zuweisungen seien definiert:
Betrachten Sie nun die folgenden Anweisungen und entscheiden Sie, welche korrekt sind und welche falsch sind. Fehlerhafte Programmzeilen sind durchzustreichen. Begründen Sie, wieso eine Anweisung falsch ist, z.B. nicht kompatibler Typ. Korrekte Programmzeilen bezeichnen Sie mit einem OK.
Folgende Klassen, Variablen und Zuweisungen seien definiert:
Betrachten Sie nun die folgenden Anweisungen und entscheiden Sie, welche korrekt sind und welche falsch sind. Fehlerhafte Programmzeilen sind durchzustreichen. Begründen Sie, wieso eine Anweisung falsch ist, z.B. nicht kompatibler Typ. Korrekte Programmzeilen bezeichnen Sie mit einem OK.
int i = 0;
int a = 2;
i = a++;3
Bei der Sprachauswahl auf FR klicken.
Die Seite aktualisiert sich, die URL wechselt auf “<URL>/fr/pricelist” und der Text auf der Seite ist in Französisch.
(während der Entwicklungsphase ist einiger Text hier noch auf englisch, da die Applikation noch nicht auf französisch übersetzt wurde).
4
Im Menü auf “Partner Levels” navigieren.
Die Partner Level Verwaltungsseite öffnet sich, immer noch auf französisch. Die URL ändert sich zu “<URL>/fr/partnerlevels”.
5
In der Sprachauswahl wieder DE wählen.
(Informelle Zusatztests: Verschiedene Seiten in der Navigation öffnen und die Sprache ändern, dabei sollte immer dieselbe Seite geöffnet bleiben und nur die Sprache wechseln.)
Die Seite aktualisiert sich, die URL ändert sich zu “<URL>/de/partnerlevels”.
Es ist weiterhin die Partner Level Verwaltungsseite geöffnet, jetzt aber auf deutsch.
6
Im Menü auf “Exporte” klicken.
Die Seite “Exporte” öffnet sich.
6
Im Menü auf “Produkte” klicken.
Die Seite der Produktverwaltung öffnet sich.
7
Im Menü auf “Optionen” klicken.
Die Seite der Optionenverwaltung öffnet sich.
8
Im Menü auf “Preise verwalten” klicken.
Die Seite der Preisverwaltung öffnet sich.
9
Im Menü auf “Definitionen” klicken.
Die Seite der Definitionen öffnet sich.
10
Im Menü auf “Preise genehmigen” klicken.
Die Seite der Preisgenehmigung öffnet sich.
11
Im Menü auf “Partnerlevels” klicken.
Die Seite der Partnerlevels öffnet sich.
12
Im Menü auf “Rabatte” klicken.
Die Seite der Rabattdefinitionen öffnet sich.
13
Im Menü auf “Partnerverwaltung” klicken.
Der Menüeintrag kann nicht angeklickt werden, da dieses Feature noch nicht umgesetzt ist.
14
Im Menü auf “Dokumentvorlage” klicken.
Die Seite der Dokumentvorlage öffnet sich.
3
Unten an der Tabelle einstellen, dass man 50 Elemente pro Seite sehen möchte.
Die Tabelle lädt, anschliessend werden 50 Elemente angezeigt.
4
Unten an der Tabelle auf die nächste Seite wechseln.
Es werden die nächsten 50 Einträge angezeigt. Wenn es insgesamt weniger als 100 Einträge hat, werden nur die übrigen Einträge ab Nr. 51 angezeigt.
5
Im Tabellenheader auf “Name” klicken.
Die Tabelle ist jetzt nach Name sortiert, man befindet sich wieder auf der ersten Seite.
Dabei wird nicht nur die aktuelle Seite neu sortiert, sondern die kompletten Daten sortiert.
6
Oberhalb der Tabelle das Optionen-Tab öffnen.
In der Tabelle werden nun Optionen angezeigt.
Die Anzahl Elemente pro Seite ist wieder auf 10 gestellt
7
Im Tabellenheader auf “Optionengruppe” klicken.
Die Optionen in der Tabelle sind jetzt nach Optionengruppe sortiert / gruppiert.
Dabei wird nicht nur die aktuelle Seite neu sortiert, sondern die kompletten Daten sortiert.
8
Auf die erste Option in der Tabelle klicken.
In einem Dialog werden die zugehörigen Produkte angezeigt
9
Den Dialog schliessen und auf das Tab “Produkte” wechseln.
In der Liste werden wieder Produkte angezeigt.
10
Auf das erste angezeigte Produkt in der Tabelle klicken.
In der Top Bar steht nun die Item Nr des angeklickten Produkts in der Textsuche.
Die Ansicht wurde auf die Detailansicht umgestellt. Auf der Seite wird die Detailansicht des angeklickten Produkts angezeigt. Nur dieses Produkt ist sichtbar.
11
In der Top Bar unter Ansicht auf das Listen-Icon klicken und auf das X rechts im Suchfeld klicken.
Der Text im Suchfeld verschwindet und es werden wieder die Produkte in der Tabelle angezeigt.
3.1
Im Suchfeld den Text “Standard: Duplexfunktion LCD Display / 5-zeilig” eingeben
Die Preisliste aktualisiert und es werden nur noch zwei Produkte angezeigt.
Damit wird getestet, dass auch die Beschreibung durchsucht wird.
3.2
Auf die Listenansicht wechseln
In der Listenansicht wird kein Ergebnis angezeigt, da hier die Beschreibung nicht durchsucht wird.
3.3
Zurück zur Detailansicht wechseln.
-
4
Rechts in der Top Bar das Icon für den erweiterten Filter anklicken ().
Ein Feld mit dem Titel “Filter” erscheint. Es beinhaltet weitere Filter für Druckfarbe, Druckformat, Umgebung, Produktkategorie und Produktgruppe. Ebenfalls ist ein Reset Button vorhanden (“Zurücksetzen”).
5
Den Suchtext löschen
Partnerlevel “Special” wählen
Den erweiterten Filter öffnen, bei Produktgruppe nur “ECOSYS” auswählen und den erweiterten Filter wieder schliessen..
Jetzt bei Preismodell zwischen “Verkaufspreis” und “Partnerpreis” wechseln.
Wenn das Preismodell “Verkaufspreis” gewählt ist, wird als Überschrift der Preise “VP CHF exkl. MwSt” angezeigt.
Wenn das Preismodell “Partnerpreis“ gewählt ist, wird als Überschrift der Preise “Ihr Preis CHF exkl. MwSt” angezeigt. Die Preise für ECOSYS Produkte sind halb so gross, wie unter “Verkaufspreis”.
6
Im erweiterten Filter den Reset Button klicken.
Alle Checkboxen im Filter sind nicht mehr ausgewählt und es werden wieder alle Produkte angezeigt.
7
(Informeller Test)
Die Filter Testen. Checkboxen wählen und sehen ob die entsprechenden Produkte ein / ausgeblendet werden. In der Detailansicht wie auch in der Listenansicht testen.
Zusätzlich auch das Suchfeld testen.
Die Seite sollte bei jeder Änderung des Filters oder der Suchbox sofort aktualisiert werden.
8
Folgende Filtereinstellungen wählen:
Es sollten drei Produkte in der Listenansicht angezeigt werden.
In der URL des Browsers sind die Filtereinstellungen sichtbar, etwa so (Statt X stehen lange UUIDs):
<URL>/de/pricelist?partnerLevelId=X&viewMode=list&priceModel=selling-price&printingColors=X&printingFormats=X&printingEnvironments=X&productCategories=X&productGroups=X
9
Die URL des Browsers kopieren in einem neuen Browserfenster einfügen und öffnen.
Auf der neu geöffneten Seite sind dieselben Filtereinstellungen gesetzt und die selben Produkte sichtbar.
int i = 10;
while (true)
{
if (i != 9)
{
i += 2;
break;
}
}int i = 10;
while (true)
{
if (i != 9)
{
i += 2;
break;
}
}i = 12;int j = 0;
int i = 2;
switch (i) {
case 1:
j = 1;
break;
case 2:
case 3:
j = 3;
break;
case 4:
j = 4;
break;
default:
j = 100;
break;
}int j = 0;
int i = 2;
switch (i) {
case 1:
j = 1;
break;
case 2:
case 3:
j = 3;
break;
case 4:
j = 4;
break;
default:
j = 100;
break;
}j = 3;// a)
int j = 1;
int i = 1;
bool b = !(j == 3) || ( i > j && j <= i);
// b)
bool b = true || false;
// c)
bool b = 1 == 1 && 10 == 10 || 100 == 100;
// d)
bool x = true;
bool b = !x;
b = !b && b;
// e)
bool x = false;
bool b = false;
if (x && b)
{
b = !x || x;
}// a)
int j = 1;
int i = 1;
bool b = !(j == 3) || ( i > j && j <= i); // b = true
// b)
bool b = true || false; // b = true
// c)
bool b = 1 == 1 && 10 == 10 || 100 == 100; // b = true
// d)
bool x = true;
bool b = !x;
b = !b && b; // b = false
// e)
bool x = false;
bool b = false;
if (x && b)
{
b = !x || x;
} // b = falseint[] a = new int[4];
for (int i = 0; i < a.Length - 1; i++)
{
if (i == 1)
{
a[i] = 3;
}
if (i == 2)
{
a[i] = 2;
}
if (i == 3)
{
a[i] = 1;
}
if (i == 4)
{
a[i] = i;
}
}int[] a = new int[4];
for (int i = 0; i < a.Length - 1; i++)
{
if (i == 1)
{
a[i] = 3;
}
if (i == 2)
{
a[i] = 2;
}
if (i == 3)
{
a[i] = 1;
}
if (i == 4)
{
a[i] = i;
}
}a[0] = 0
a[1] = 3
a[2] = 2
a[3] = 0string[] a = new string[3];
int b = 10;
for (int i = 0; i < a.Length; i++) {
a[i] = (b / 2);
b *= 2;
}string[] a = new string[3];
int b = 10;
for (int i = 0; i < a.Length; i++) {
a[i] = (b / 2);
b *= 2;
}List<string> list = new List<string>();
int j = 10;
list.Add("Hallo Welt");
for (int i = 0; i < list.Count; i++)
{
list.Add(i.ToString());
}
j = Convert.ToInt32(list[1]);List<string> list = new List<string>();
int j = 10;
list.Add("Hallo Welt");
for (int i = 0; i < list.Count; i++)
{
list.Add(i.ToString());
}
j = Convert.ToInt32(list[1]);int[,] a = new int[2, 5];
int[] c = { 1, 2, 3, 4 };
int i = 10;a[0, 0] = i;
a[1, 5] = c[0];
a[0, 1] = 15;
i = a[0, 1];
a[1, 1] = 8;int[,] a = new int[2, 5];
int[] c = { 1, 2, 3, 4 };
int i = 10;public class Baum
{
int _hoehe, _breite;
public Baum(int hoehe, int breite)
{
_hoehe = hoehe;
_breite = breite;
}
public int Hoehe
{
get { return _hoehe; }
}
public int Breite
{
get { return _breite; }
}
}
public class Punkt
{
int _x, _y;
public Punkt(int x, int y)
{
_x = x;
_y = y;
}
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
}
string s = "abcd";
int[] a1 = { 1, 2, 3, 4 };
byte b = 56;
Punkt p = new Punkt(a1[0], 100);
Baum[] ba = new Baum[3];
Baum baum = new Baum(80, 2);a1[0] = b;
a1[4] = p.X;
ba[1] = new Baum(2, 3);
ba[2] = baum;
Baum neuerBaum = ba[0];
baum = p;
a1[0] = baum.Hoehe;
p.Y = baum.Hoehe;
baum.Breite = 0;
b = (byte)ba[0].Breite;
ba = null;
p.X = s.Length;public class Baum
{
int _hoehe, _breite;
public Baum(int hoehe, int breite)
{
_hoehe = hoehe;
_breite = breite;
}
public int Hoehe
{
get { return _hoehe; }
}
public int Breite
{
get { return _breite; }
}
}
public class Punkt
{
int _x, _y;
public Punkt(int x, int y)
{
_x = x;
_y = y;
}
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
}
string s = "abcd";
int[] a1 = { 1, 2, 3, 4 };
byte b = 56;
Punkt p = new Punkt(a1[0], 100);
Baum[] ba = new Baum[3];
Baum baum = new Baum(80, 2);




✅✅✅
3
Bei der Sprachauswahl auf FR klicken.
Die Seite aktualisiert sich, die URL wechselt auf “<URL>/fr/pricelist” und der Text auf der Seite ist in Französisch.
(während der Entwicklungsphase ist einiger Text hier noch auf englisch, da die Applikation noch nicht auf französisch übersetzt wurde).
✅✅✅
4
Im Menü auf “Partner Levels” navigieren.
Die Partner Level Verwaltungsseite öffnet sich, immer noch auf französisch. Die URL ändert sich zu “<URL>/fr/partnerlevels”.
✅✅✅
5
In der Sprachauswahl wieder DE wählen.
(Informelle Zusatztests: Verschiedene Seiten in der Navigation öffnen und die Sprache ändern, dabei sollte immer dieselbe Seite geöffnet bleiben und nur die Sprache wechseln.)
Die Seite aktualisiert sich, die URL ändert sich zu “<URL>/de/partnerlevels”.
Es ist weiterhin die Partner Level Verwaltungsseite geöffnet, jetzt aber auf deutsch.
✅✅✅
6
Im Menü auf “Exporte” klicken.
Die Seite “Exporte” öffnet sich.
Export / Import
✅✅✅
6
Im Menü auf “Produkte” klicken.
Die Seite der Produktverwaltung öffnet sich.
✅✅✅
7
Im Menü auf “Optionen” klicken.
Die Seite der Optionenverwaltung öffnet sich.
✅✅✅
8
Im Menü auf “Preise verwalten” klicken.
Die Seite der Preisverwaltung öffnet sich.
✅✅✅
9
Im Menü auf “Definitionen” klicken.
Die Seite der Definitionen öffnet sich.
✅✅✅
10
Im Menü auf “Preise genehmigen” klicken.
Die Seite der Preisgenehmigung öffnet sich.
✅✅✅
11
Im Menü auf “Partnerlevels” klicken.
Die Seite der Partnerlevels öffnet sich.
✅✅✅
12
Im Menü auf “Rabatte” klicken.
Die Seite der Rabattdefinitionen öffnet sich.
✅✅✅
13
Im Menü auf “Partnerverwaltung” klicken.
Der Menüeintrag kann nicht angeklickt werden, da dieses Feature noch nicht umgesetzt ist.
✅✅✅
14
Im Menü auf “Dokumentvorlage” klicken.
Die Seite der Dokumentvorlage öffnet sich.
✅✅✅
✅
3
Unten an der Tabelle einstellen, dass man 50 Elemente pro Seite sehen möchte.
Die Tabelle lädt, anschliessend werden 50 Elemente angezeigt.
✅
4
Unten an der Tabelle auf die nächste Seite wechseln.
Es werden die nächsten 50 Einträge angezeigt. Wenn es insgesamt weniger als 100 Einträge hat, werden nur die übrigen Einträge ab Nr. 51 angezeigt.
✅
5
Im Tabellenheader auf “Name” klicken.
Die Tabelle ist jetzt nach Name sortiert, man befindet sich wieder auf der ersten Seite.
Dabei wird nicht nur die aktuelle Seite neu sortiert, sondern die kompletten Daten sortiert.
✅
6
Oberhalb der Tabelle das Optionen-Tab öffnen.
In der Tabelle werden nun Optionen angezeigt.
Die Anzahl Elemente pro Seite ist wieder auf 10 gestellt
✅
6.1
Auf einen Eintrag in der Tabelle klicken.
In einem Dialog werden die zugehörigen Produkte angezeigt.
✅
7
Im Tabellenheader auf “Optionengruppe” klicken.
Die Optionen in der Tabelle sind jetzt nach Optionengruppe sortiert / gruppiert.
Dabei wird nicht nur die aktuelle Seite neu sortiert, sondern die kompletten Daten sortiert.
✅
8
Auf die erste Option in der Tabelle klicken.
Nichts passiert.
Es öffnet sich ein Dialog in welchem die zugehörigen Produkte von “KL3: KYOlife auf 3 Jahre vort Ort, inkl. Optionen” angezeigt werden
🚫
9
Auf das Tab “Produkte” wechseln und anschliessend auf das erste angezeigte Produkt in der Tabelle klicken.
In der Top Bar steht nun die Item Nr des angeklickten Produkts in der Textsuche.
Die Ansicht wurde auf die Detailansicht umgestellt.
Auf der Seite wird die Detailansicht des angeklickten Produkts angezeigt. Nur dieses Produkt ist sichtbar..
Es öffnet sich die Preisliste im Tab “Produkte”. Es wird die Listenansicht angezeigt. Das Produkt steht nicht in der Textsuche.
🚫
10
In der Top Bar unter Ansicht auf das Listen-Icon klicken und auf das X rechts im Suchfeld klicken.
Der Text im Suchfeld verschwindet und es werden wieder die Produkte in der Tabelle angezeigt.
✅
✅
3.1
Im Suchfeld den Text “Standard: Duplexfunktion LCD Display / 5-zeilig” eingeben
Die Preisliste aktualisiert und es werden nur noch zwei Produkte angezeigt.
Damit wird getestet, dass auch die Beschreibung durchsucht wird.
✅
3.2
Auf die Listenansicht wechseln
In der Listenansicht wird kein Ergebnis angezeigt, da hier die Beschreibung nicht durchsucht wird.
✅
3.3
Zurück zur Detailansicht wechseln.
-
4
Rechts in der Top Bar das Icon für den erweiterten Filter anklicken ().
Ein Feld mit dem Titel “Filter” erscheint. Es beinhaltet weitere Filter für Druckfarbe, Druckformat, Umgebung, Produktkategorie und Produktgruppe. Ebenfalls ist ein Reset Button vorhanden (“Zurücksetzen”).
✅
5
Den Suchtext löschen
Partnerlevel “Special” wählen
Den erweiterten Filter öffnen, bei Produktgruppe nur “ECOSYS” auswählen und den erweiterten Filter wieder schliessen..
Jetzt bei Preismodell zwischen “Verkaufspreis” und “Partnerpreis” wechseln.
Wenn das Preismodell “Verkaufspreis” gewählt ist, wird als Überschrift der Preise “VP CHF exkl. MwSt” angezeigt.
Wenn das Preismodell “Partnerpreis“ gewählt ist, wird als Überschrift der Preise “Ihr Preis CHF exkl. MwSt” angezeigt. Die Preise für ECOSYS Produkte sind halb so gross, wie unter “Verkaufspreis”.
✅
6
Im erweiterten Filter den Reset Button klicken.
Alle Checkboxen im Filter sind nicht mehr ausgewählt und es werden wieder alle Produkte angezeigt.
✅
7
(Informeller Test)
Die Filter Testen. Checkboxen wählen und sehen ob die entsprechenden Produkte ein / ausgeblendet werden. In der Detailansicht wie auch in der Listenansicht testen.
Zusätzlich auch das Suchfeld testen.
Die Seite sollte bei jeder Änderung des Filters oder der Suchbox sofort aktualisiert werden.
✅
8
Folgende Filtereinstellungen wählen:
Es sollten drei Produkte in der Listenansicht angezeigt werden.
In der URL des Browsers sind die Filtereinstellungen sichtbar, etwa so (Statt X stehen lange UUIDs):
<URL>/de/pricelist?partnerLevelId=X&viewMode=list&priceModel=selling-price&printingColors=X&printingFormats=X&printingEnvironments=X&productCategories=X&productGroups=X
✅
9
Die URL des Browsers kopieren in einem neuen Browserfenster einfügen und öffnen.
Auf der neu geöffneten Seite sind dieselben Filtereinstellungen gesetzt und die selben Produkte sichtbar.
✅
Was versteht ihr unter Analyse & Design?
Wer hat schon an Kundensoftware gearbeitet?
Analyse: WAS muss das System können? Design: WIE soll das System gebaut werden?
Wie wir bereits gestern besprochen haben, ist eines der essentiellen Aufgaben, zu verstehen, was der Kunde oder die Kundin wirklich möchte.
Kommunikation ist alles! Wenn der Kunde von Anfang an miteinbezogen wird und durch eine auch in jedem Schritt beteiligt ist, sind Missverständnisse viel unwahrscheinlicher oder können schon sehr früh aus dem Weg geräumt werden.
In der Anforderungsanalyse findet aber bereits sehr viel Kommunikation statt. Es gibt Diskussionen, grobe Besprechungen in Workshops, Interviews oder sogar Beobachtung von Endbenutzern am Arbeitsplatz. Das alles muss auch dokumentiert sein.
Nun geht es darum, Anforderungen von Kunden zu analysieren und in Formen zu bringen bzw. so Abzubilden, wie sie uns für die Umsetzung möglichst nützlich sind. Dafür gibt es zahlreiche Tools und Methoden.
Eine Möglichkeit, um sehr schnell und abstrakt einen Überblick über die Anforderungen zu erhalten, ist das UML Use Case Diagramm.
Dieses Use Case Diagramm zeigt die Use Cases eines Online Shops, der zwei verschiedene Anwendertypen hat. Ein Verkäufer, der Artikel erfasst und Bestellungen verarbeitet und einen Kunden, welcher Artikel auswählt und bestellt.
Ein Use Case Diagramm stellt keine Logik dar, z.B. dass der Kunde zuerst Artikel auswählen muss, bevor er eine Bestellung abschicken kann. Darum geht es aber auch nicht im Use Case Diagramm. Es geht nur darum, schnell einen Überblick über die Funktionen einer Software zu erhalten.
"User Stories beschreiben die Anforderungen an ein Produkt oder Service aus Sicht des Nutzers. Als Format ist die User Story ein zentrales Werkzeug in der Zusammenarbeit agiler Teams. Ihr Einsatzgebiet reicht von der Validierung von Kundenbedürfnissen bis zur Anforderungsformulierung in Scrum Teams." - Andreas Diehl
User Stories sind einerseits dazu da, die Kundenbedürfnisse / Anforderungen abzubilden, dienen zugleich aber auch als Arbeitspakete für die Entwickler, und können durch Aufwandschätzung auch als Basis einer Offerte dienen. Das macht sie sehr wertvoll.
Nachfolgende Texte sind (z.T, leicht angepasste) Ausschnitte aus dem Artikel:
User Stories (dt. Nutzer- oder Anwendererzählung) haben ihren Ursprung in der agilen Softwareentwicklung. Im Gegensatz zu einer klassischen Spezifikation beschreibt die User Story ausschließlich die Erwartungen des Nutzers an die Funktionalität einer Software und nicht etwa WIE die Anforderung umzusetzen ist.
Heute sind User Stories auch über die Softwareentwicklung hinaus eines der zentralen Werkzeuge, um Anforderungen zu formulieren und zu diskutieren. Dabei bilden mehrere User Stories gemeinsam einen Use Case.
Der User Case ist wiederum, was wir im Use Case Diagramm modellierten.
Die Beschreibung einer User Story ist wie folgt aufgebaut:
Als <Nutzer> möchte ich <Funktion>, um <Wert>
Das heißt, eine User Story beantwortet die Fragen WER möchte WAS und WARUM. Lass uns auf die drei Bestandteile im Einzelnen schauen.
Den Platzhalter <Nutzer> füllst Du mit Rollen bzw. deinen Personas. Eine . Die Rolle des Nutzers kann auch durch den jeweiligen Kontext definiert sein. So kann die gleiche Rolle z.B. für unterschiedliche Personas gelten und das Verhältnis zu deinem Produkt beschreiben.
Wie detailliert Du den Platzhalter <Nutzer> füllst, ist von der User Story selbst, aber auch von der Reife deines Vorhabens abhängig. Für den passenden Detaillierungsgrad gibt es kein richtig oder falsch. Das Wichtigste ist, dass für Dich und dein Team mit dem gewählten <Nutzer> eine für Dich aussagekräftige User Story entsteht.
Den Platzhalter <Funktion> ersetzt Du mit der Erwartung, den Zielen und Wünschen des <Nutzers>. Damit beantwortest Du die Frage, WAS der Kunde braucht und erwartet. Wenn du bereits ein Produkt am Markt anbietest, erhältst Du sicher viele gewünschte Funktionen direkt vom Nutzer. In früheren Phasen deines Projektes kannst Du basierend auf deiner Erfahrung Annahmen formulieren, welche <Funktion> der <Nutzer> erwartet.
Der Platzhalter <Wert> beantwortet die Frage nach dem WARUM. Auch wenn der Satzbau dazu verleitet diesen Nebensatz weg zu lassen, ist eine User Story ohne diesen Zusatz nicht komplett.
Das heißt, erst mit dem <Wert> bringst Du zum Ausdruck, warum die Erreichung der <Funktion> für den <Nutzer> überhaupt wichtig ist und welchen Mehrwert die Erfüllung der User Story schafft. Spätestens an dieser Stelle bietet Dir die User Story eine ehrliche Reflektion, wie gut Du Dich bereits mit den Anforderungen deiner Kunden auseinander gesetzt hast. Anforderungen aufzunehmen ist einfach (z.B. weil der Kunde nach einer Funktion schreit). Zu verstehen warum es für ihn wichtig ist, gibt Dir und deinem Team aber erst den notwendigen Kontext.
In der Praxis trifft man meist auf User Stories, die nebst der Beschreibung nach dem obigen Schema auch Abnahmekriterien (auch Akzeptanzkriterien oder Acceptance Criteria genannt) definiert haben. Sie dienen dazu, während eines Sprints die Story als "Abgeschlossen" anzuschauen, nämlich dann, wenn die Punkte unter Abnahmekriterien alle zutreffen.
Beispiel:
Die Abnahmekriterien können teilweise etwas das "WIE" (Design) beschreiben, denn sie werden meist erst kurz vor der Umsetzung verfasst, wenn mehr technische Informationen vorhanden sind. Das ist der Moment, in dem die User Story auch als Arbeitspaket verwendet werden kann.
Wenn ein Entwickler eine Story für sich abgeschlossen hat, wird im Code Review meist auch auf die Abnahmekriterien eingegangen, um zu sehen, ob die Story auch wirklich abgeschlossen ist.
Es ist wichtig, Funktionalität in einer guten Granularität auf User Stories aufzuteilen. Eine User Story pro Funktionalität.
Ist Beispielsweise ein Login in einem System gewünscht, in welchem man auch gleich einen neuen Benutzer hinzufügen kann und das Passwort zurücksetzen kann, wenn man es vergessen hat, macht es keinen Sinn, das alles in eine User Story zu packen.
Hier könnte man Beispielsweise drei User Stories erstellen:
Story 1: Login Als registrierter Benutzer möchte ich mich im System einloggen können, damit ich das System mit meinen Berechtigungen verwenden kann.
Story 2: Passwort Vergessen Als registrierter Benutzer möchte ich mein Passwort zurücksetzen können, damit ich das System weiterhin verwenden kann, wenn ich das Passwort vergessen habe.
Story 3: Benutzer Erstellen Als nicht registrierter Benutzer
Das macht auch später für die Umsetzung Sinn. Gibt es mehrere Entwickler im Team, könnten diese drei Stories parallel entwickelt werden.
Wie auch das Use Case Diagramm, ist das Aktivitätsdiagramm ein UML Diagramm.
Aktivitätsdiagramme sind eine Möglichkeit, um Programmabläufe zu dokumentieren. Diese Diagrammart wird nun kurz vorgestellt:
Die Ausführung einer Aktivität beginnt beim Startknoten und endet beim Endknoten (Eselsbrücke: wie eine Zielscheibe). Es sind auch mehrere Endknoten möglich.
Der wichtigste Baustein im Aktivitätsdiagramm ist die Aktion, als Rechteck mit abgerundeten Ecken dargestellt. Aktionen stellen die einzelnen Schritte dar, aus denen eine Aktivität besteht. Man könnte sagen, sie sind die kleinste, nicht mehr zerlegbare Einheit einer Aktivität.
Alle Aktionen zusammengenommen stellen einen schrittweisen Ablauf dar wie etwa den eines Use-Case oder einer Funktion (oder einer User Story). Im Rechteck mit den abgerundeten Ecken wird jeweils eine kurze Beschreibung der Aktion angegeben. Diese Beschreibung sollte wie bei Use-Cases kurz, knapp und präzise sein.
Verzweigungen ermöglichen es je nach Situation als nächsten Schritt verschiedene Aktionen auszuführen. Die Bedingung für die jeweilige Verzweigung kann direkt auf den entsprechenden Pfeil geschrieben werden (sh. Beispiel im nächsten Slide).
Eine Gabelung synchronisiert zwei oder mehrere separate Pfade (oder teilt sie).
Quelle:
Zu was für einem Use Case könnte dieses Aktivitätsdiagramm gehören?
Wie könnte eine User Story dazu und die dazugehörigen Abnahmekriterien aussehen?
b = true
m = 21
n = 21Der Kursteilnehmer hat die ganzen Unterlagen zum Thema "Analyse & Design" gelesen
Der Kursteilnehmer hat die Übung "Projektanforderungen analysieren" abgeschlossen






















