Only this pageAll pages
Powered by GitBook
1 of 35

M318 - objektbasiert programmieren mi

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Tag 1

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Tag 2

Loading...

Loading...

Loading...

Loading...

Tag 3 - 4

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Projektarbeit

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Kursplanung und Organisation

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:

Modulidentifikation und Handlungskompetenzen

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

Leistungsbeurteilung

‌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%

Debugging

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:

Methodik & Prozessmodelle

Was kann schief gehen?

💬 Können Projekte scheitern?

  • Wer kennt gescheiterte Projekte?

: Sprint in eine Anweisung hinein, z.B. bei einem Methodenaufruf springt der gelbe Pfeil in die Methode.
  • : 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)

  • Wer hat in der Firma schon erlebt, dass ein Projekt gescheitert ist?
  • Was bedeutet "ein Projekt ist gescheitert"?

  • CHAOS-Studie (1994)

    Gemäss der CHAOS-Studie sind 1994 84% gescheitert.

    Quelle: Standish Group, Chaos Report

    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:

    Quelle: Standish Group, Chaos Report

    💡 Warum gehen IT-Projekte schief?

    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.

    Projektanforderungen analysieren

    Projektanforderungen

    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.

    💡🎓 Aufgabe

    • 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

    FAQ

    Häufig gestellte Fragen werden hier beantwortet.

    Wie kann ich auf die Transport API zugreifen?

    SwissTransport API

    Bei mir gibt es kein "Windows Forms Projekt" zur Auswahl.

    ❓.NET Desktop Development in Visual Studio nachinstallieren

    Bei mir taucht die WinForms Toolbox nicht auf, warum?

    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 .

    Wie kann ich wählen, welches meiner Projekte ausgeführt wird?

    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.

    Bei mir kommt der Fehler "Dieser Projekttyp kann nicht ausgeführt werden"

    Ü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?).

    Wie funktioniert das DataGrid in WinForms?

    Wie funktioniert Debugging in Visual Studio?

    Wie erstelle ich ein neues WinForms Projekt in Visual Studio? Wie Funktioniert WinForms?

    Wie funktioniert git in Visual Studio?

    Wo muss ich meine Dokumentation im Projekt einfügen?

    Die Dokumentation im Projektordner unter /doc einfügen.

    Wie funktioniert try - catch?

    Lasset euch von der Microsoft Dokumentation inspirieren:

    Was ist eine User Story?

    Warum bin ich hier?

    Weil du dich für eine Informatiker-Lehre entschieden hast.

    Kann ich das später in meinem Berufsleben brauchen?

    Kommt ganz drauf an, ob du Software entwickeln oder Hamburger braten willst.

    ✋ Siiiie?

    Du brauchst mich nicht siezen.

    Können wir Pizza bestellen?

    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, Installer & GitHub Release

    Binaries

    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.

    Installer

    Der Installer ist ein Bonuspunkt für schnelle. Dieser muss ohne Unterstützung des Kursleiters/der Kursleiterin umgesetzt werden.

    GitHub Release

    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.

    Projektsetup

    Visual Studio 2022

    Achte darauf, dass du die neueste Version von Visual Studio verwendest.

    Installiere jetzt die neuste Version, falls du sie noch nicht installiert hast.

    Git Commit und Push in Visual Studio

    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.

    Mockup Erstellen

    Mockup

    Beispiel zeigen und erwähnen, was das wichtigste ist am Mockup.

    💡 Mockup Erstellen

    Anforderungen und Dokumentation

    Hier findet ihr alle Details zur Projektarbeit.

    Die 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.

    Projektabgabe

    • 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 )

    .NET Desktop Development in Visual Studio nachinstallieren

    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.

    Intro

    Modul 318

    Analysieren und objektbasiert programmieren mit Komponenten

    Erstelle mithilfe des Tools Balsamiq oder von Hand eine Skizze der Benutzeroberfläche für dein Projekt.
    • 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

  • Dokumentation

    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.

    Dokumentation
    Binaries, Installer & GitHub Release
    Repository Forken

    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.

    Repository Klonen

    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".

    Projekt einrichten

    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.

    Windows Forms App hinzufügen (GUI)

    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".

    Wähle nicht den Eintrag mit (.NET Framework), denn das ist nicht kompatibel mit der SwissTransport-Library.

    • 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:

    Referenz zur SwissTransport Library

    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!

    Git in der Konsole

    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:

    170KB
    Git Anleitung M318.pdf
    PDF
    Open
    Git Anleitung M318
    Anforderungen

    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.

    Dokumentation

    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.

    Über dieses Script

    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.

    Symbole

    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.

    Über den Kurs

    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.

    ".NET Desktop Development" in Visual Studio nachinstallieren
    ❓FAQ
    ❓WinForms DataGridView
    ❓Debugging
    ❓Visual Studio & WinForms
    ❓Git Commit und Push in Visual Studio
    🚩Projektabgabe
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch
    Analyse & Design - User Story
    Startprojekt setzen
    Hier
    Einstellung Debug oder Release
    Beispiel der Binaries des Projekts M318.Exercises.Nr5 in der Projektmappe M318.Exercises

    WinForms DataGridView

    Spalten

    Spalten bearbeiten
    Spalte hinzufügen
    Spalte konfigurieren

    Reihen

    Es gibt verschiedene Arten, wie Reihen dem Grid hinzugefügt werden können. Hier werden zwei Varianten gezeigt.

    Rows und ein String-Array

    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.

    Diese Variante wurde in der Musterlösung der Aufgabensammlung Nr 4.2 und 4.3 verwendet

    DataSource und eine Liste mit Objekten

    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.

    Diese Variante wurde in der Musterlösung der Aufgabensammlung Nr 4.4 verwendet

    Infrastruktur und Tools

    Zur optimalen Vorbereitung auf dieses Modul, solltet Ihr Zugriff auf die Kursunterlagen haben, und die benötigten Tools installieren.

    Kursunterlagen

    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.

    Moodle

    Zusätzlich gibt es Unterlagen auf Moodle unter: ​‌

    Tools

    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.

    📖💡 Coderichtlinien

    Was sind Coderichtlinien?

    "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.

    Bewertungsraster

    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?

    Mockups
    Testfälle
    Testprotokoll
  • https://kurse.ict-bz.ch
    Visual Studio (Community Edition)
    Git
    StarUML
    Visual Paradigm
    Diagrams.net
    github.com

    C# Coding Guidelines von Microsoft

    Hier findet ihr die kompletten Coding Guidelines von Microsoft:

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions

    ReSharper / StyleCop

    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/

    💡 Aufgabe: schlechte Codebeispiele verbessern

    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.

    Aufgabe 1

    Aufgabe 2

    Aufgabe 3

    Aufgabe 4

    Aufgabe 5

    💬

    In der Klasse oder in kleineren Gruppen diskutiert ihr ein Thema.

    🚩

    Dies ist ein Meilenstein.

    Konfiguration einer Spalte für eine DataSource, inkl. Format

    Vorgehensweisen

    Klassische vs. Agile Vorgehensweise

    Warum gehen IT-Projekte schief?

    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.

    Verständnis von Anforderungen

    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".

    Das Kundenverständnis

    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.

    Mögliche Fehlerquellen in Projekten

    • Unzureichende Kommunikation

    • Zeitdruck / Zeitmanagement

    • Ressourcen-Planung

    • Ziele falsch gesetzt

    Keiner dieser Gründe ist technischer Natur! Es geht um: Planung, Vorgehensweise, Management, Kommunikation

    Klassische Phasenmodelle

    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 ().

    Anforderungen ändern sich

    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.

    Weitere Probleme der klassischen Vorgehensweise

    • 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.

    Agile Vorgehensweise (z.B. SCRUM)

    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.

    Iterativ

    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).

    Inkrementell

    Durch die iterative Vorgehensweise entsteht am Ende jeder Iteration ein Produkt. Die Funktionalität der Software nimmt somit inkrementell zu.

    Vorteile

    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)

    Erfolgreiches Beispiel "Pokemon Go"

    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: ).

    SwissTransport API

    Im Projekt SwissTransport, das bereits in eurer Solution vorhanden ist, befindet sich Code, der es euch erlaubt, auf die SwissTransport API zuzugreifen.

    Klassendiagramm SwissTransport

    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.

    Die Transport API verwenden

    Um die Transport API zu verwenden, musst du in deiner Klasse eine Instanz der Transport Klasse erstellen.

    UI, UX, Usability

    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.

    📖💡 Exkurs: Objektdiagramm

    Das Objektdiagramm

    Ein Objektdiagramm ist im Gegensatz zum Klassendiagramm eine Momentaufnahme eines Programms. Auch für das Objektdiagramm gibt es einen UML Standard. Nachfolgend seht ihr ein Objektdiagramm mit einem einzelnen Objekt.

    Quelle:

    C# Grundlagen

    💬 Klassendiskussion

    • Welche Sprachen kennt ihr?

    • Wie unterscheiden sie sich?

    Testing

    Testing

    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

    siehe Grafik oben
    Wikipedia
    Das Wasserfallmodell
    💬 Ergonomie
    • Was versteht ihr unter "Ergonomie"?

    • Was bedeutet Ergonomie im Bezug auf Software?

    Standard EN-9241-110

    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.

    https://de.wikipedia.org/wiki/EN_ISO_9241

    Begriffe

    „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)

    Usability

    "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

    Die 5 E’s nach Whitney Quesenbery

    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

    UI - User Interface

    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.

    UX - User Experience

    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?“

    💬 Klassendiskussion

    Wie beurteilt ihr die UI, UX und Usability dieser zwei Varianten der Ketchup-Flasche?

    Gestaltprinzipien

    Bislang wurden über 100 Gestaltprinzipien formuliert, die sich teilweise überschneiden. Insofern beschränke ich mich exemplarisch auf die Wichtigsten:

    Prinzip der Ähnlichkeit

    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.

    Prinzip der Nähe

    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.

    Prinzip der gemeinsamen Region

    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.

    Prinzip des gemeinsamen Schicksals

    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.

    Weiterführende Informationen zu den Gestaltprinzipien findet ihr in den folgenden Artikeln:

    • https://medium.com/@soniamos/gestaltpsychologie-und-visuelle-wahrnehmung-9-gesetze-im-ux-design-23f35ed7aff1

    • https://www.e-teaching.org/didaktik/gestaltung/visualisierung/gestaltgesetze

    💡 Gruppenarbeit Usability

    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

    Beispiel

    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:

    Ausgangslage

    Ausgangslage 1. Schritt

    Ausgangslage 2. Schritt

    Ausgangslage 3. Schritt

    Ausgangslage 4. Schritt

    Ausgangslage 5. Schritt

    Ausgangslage 6. Schritt

    1. Schritt

    2. Schritt

    3. Schritt

    Beachte, dass das Objekt nicht kopiert wird. Es gibt jetzt lediglich eine zweite Referenz auf dieses Objekt. Es existiert aber nur einmal im Speicher.

    4. Schritt

    5. Schritt

    6. Schritt

    7. Schritt

    Da es keine Referenz mehr auf das Baum Array gibt, wird dies irgendwann vom Garbage Collector abgeräumt und aus dem Speicher gelöscht. Dasselbe passiert dann mit dem Objekt unten rechts, da es keine Referenz mehr darauf gibt.

    8. Schritt

    So ergibt sich schlussendlich dieses Objektdiagramm:

    💡 Aufgabe

    Zeichne das Objektdiagramm auf Papier nach der Ausführung des folgenden Codes:

    http://mbse.se-rwth.de/book1/index.php?c=chapter4-1
  • Syntax

  • Kompiliert vs. Interpretiert -> Was bedeutet das?

  • Objektorientiert vs. Prozedural -> Was ist der Unterschied?

  • Welches ist "die beste" Sprache?

  • Sprachverwandtschaften

    Viele Sprachen haben sehr ähnliche Syntax. Nachfolgend stehen einige Konstrukte von C/C++, Java, VB und C# im Vergleich.

    Eigenschaften von C#

    💬 Typsicherheit

    Funktionieren die beiden Beispiele? Warum? Warum nicht?

    Einsatzbereich

    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.

    Desktop

    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.

    Web

    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.

    Mobile

    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.

    IoT & Embedded

    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#.

    📖 C# Syntax

    Lies das folgende Dokument (ab Kapitel 2.) durch, um deine Kenntnisse mit der C# Syntax aufzufrischen.

    Ergänzung: String Interpolation

    656KB
    03_CSharp-Syntax-Grundlagen.pdf
    PDF
    Open
    C# Syntax Grundlagen
    💬 Die Testarten

    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?

    Manuelle 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.

    Testplan

    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

    Testprotokoll

    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

    Automatisierte Tests

    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.

    Unit Tests

    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.

    Unit Test Klasse

    Nach dem AAA-Prinzip wird ein Unit Test mit Kommentaren in drei Bereiche eingeteilt:

    • // arrangeHier wird alles bereit gemacht, Instanzen erstellt, Werte eingefüllt.

    • // act Hier wird die Methode aufgerufen, die in diesem Test getestet werden soll.

    • // assert Hier wird überprüft, ob der Rückgabewert dem erwarteten Ergebnis entspricht.

    Anschliessend sieht man einen Beispielhaften Unit Test:

    ❓Unit Test erstellen

    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

    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.

    UI Tests

    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.

    Continuous Integration

    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();

    💡📖 Aufgabensammlung

    Info

    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?).

    Aufgabe 1

    Themen

    • 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: _", ...).

    • Die Controls verwenden, welche bei Themen genannt werden.

    • "+"-Operator für das Verknüpfen von Strings verwenden (siehe Code unten)

    Code-Qualität

    Themen

    • 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!

    Aufgabe 2

    Themen

    • 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.

    • Korrekt ein- und ausschalten bedeutet, dass die Buttons nur dann eingeschaltet sein dürfen, wenn das dazugehörige Control ein Nahrungsmittel markiert hat. Beispiel: ">>" darf nur eingeschaltet sein, wenn in der ComboBox ein Nahrungsmittel markiert ist.

    Aufgabe 3

    Themen

    • 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.

    • Falls du nur einen RadioButton auf dem ganzen Form anwählen kannst, liegt es wohl an der GroupBox

    • MessageBox.Show() oder MessageBox.ShowDialog() um eine solche anzuzeigen

    • Für schnelle:

    Aufgabe 4

    4.1

    Themen

    • 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.

    4.2

    Themen

    • DataGridView Control

    Neu soll ein Protokoll erstellt werden. Verwende dafür eine DataGridView mit drei Spalten: Uhrzeit, Änderung des Kontostands und neuer Kontostand.

    • Die DataGridView ist ein nützliches Control

    4.3

    Themen

    • 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.

    4.4

    Themen

    • 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%).

    • Baue diese Logik in die bei 4.3 erstellte Klasse ein

    • File.ReadAllText() um den ganzen Text einer Datei zu lesen

    • File.Exists() um zu überprüfen, ob eine Datei existiert

    Aufgabe 5

    Themen

    • 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:

    • Benenne die zwei Buttons mit einem sinnvollen Namen. Dies ist besonders wichtig, weil sich der Text ändern kann und die Buttons mehere Funktionen haben.

    • Schaue die Timer-Komponente (Toolbox > Timer, genannt System.Windows.Forms.Timer) an. Kann diese eine Lösung sein?

    Aufgabe 6

    Themen

    • 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

    OOP Grundlagen

    Grundlagen der Objektorientierten Programmierung

    💬 Was ist Objektorientierte 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?

    Geschichte der Objektorientierung

    Smalltalk

    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.

    ISO Standard

    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:

    Bernd Oestereich (Fachbuchautor):

    «Die Objektorientierung heisst Objektorientierung, weil diese Methode die in der realen Welt vorkommenden Gegenstände als Objekte ansieht. Ein Telefon ist genauso ein Objekt wie ein Fahrrad, ein Mensch oder eine Versicherungspolice. Und diese Objekte setzen sich wiederum aus anderen Objekten zusammen, nämlich aus Schrauben, Rädern, Ohren, Tarifen und so weiter.»

    Grundlagen & Begriffe

    Objekte und Klassen

    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).

    • Wir programmieren Klassen

    • Objekte werden ausgehend von Klassen erzeugt und zwar automatisch und erst zur Laufzeit.

    • Zur Laufzeit hat man es mit Objekten zu tun, die miteinander interagieren.

    Klassendefinition in C#

    Grundaufbau einer Klasse:

    Konstruktor

    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

    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 / Properties

    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.

    Auto-Property

    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.

    Der Wert eines Read only Auto-Properties kann nur im Konstruktor gesetzt werden.

    Objektinteraktion

    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.

    Vorteile der Objektorientierten Programmierung

    Wiederverwendbarkeit

    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.

    Wartungsaufwand

    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.

    Fehleranfälligkeit

    Die Kapselung bewirkt, dass Objekte den Zugriff auf die Daten selbst kontrollieren und eine fehlerhafte Datenmanipulation und die daraus resultierende Inkonsistenz abwehren können.

    💡 Kontrollfragen

    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.

    Visual Studio & WinForms

    Neue Solution mit Windows Forms Projekt erstellen

    • Ö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).

    Falls bei dir kein "Windows Forms App (.NET Framework)" erscheint, befolge die Lösung .

    • Gib dem Projekt einen Namen und Klicke auf "Erstellen"

    Windows Forms

    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.

    Element-Eigenschaften

    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:

    Events

    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:

    🛠 Beispiel: Hello World

    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!

    Weiterführende Infos

    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);
      }
    }
    Gestalte den Namen einfach
    • Keine _ und andere Sonderzeichen

    • Keine Typ-Prefixe (name anstatt sName) (Ausnahme siehe Controls)

    • Keine Umlaute

    Optional: Der Name kann Punkte enthalten. Wenn er Punkte enthält, soll der Namen der Projektmappe am Anfang des Namens des Projekts stehen (z.B. "M318.Exercises" & "M318.Exercises.Nr1") Stichwort: Namespaces.
  • 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 Uhrzeit
  • Beachte, 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.

  • https://deviq.com/magic-strings/
    Siehe FAQ
    Beispiel Aufgabe 1
    Beispiel Aufgabe 2
    Beispiel Aufgabe 3
    Beispiel Aufgabe 4.1
    Beispiel Aufgabe 4.2
    Ausgangslage
    Stoppuhr läuft
    Runden werden erfasst
    Stoppuhr wird angehalten
    Stoppuhr wird in die Ausgangslage zurück gesetzt

    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

    ISO/IEC 2382-15

    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.

    im FAQ
    1MB
    06_VisualStudio-Einführung (1).pdf
    PDF
    Open
    Visual Studio Einführung

    MouseLeave

    https://verdino.com/blog/gesetz-der-aehnlichkeit-und-der-naehe/

    Code Qualität

    💬 Klassendiskussion

    Besprecht gemeinsam in der Klasse:

    • Wie bekomme ich Qualität in den Code?

    • Warum wollen wir Qualität?

    • Was heisst Qualität?

    Externe Qualität vs interne 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!

    Qualität messen

    Externe Qualität messen

    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.

    Interne Qualität messen

    Code veränderbar halten:

    • Readability

    • Simplicity

    • Testability

    Evolvierbarkeit

    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:

    1. Anfangs erkennt man kaum, dass die Kosten anwachsen. Die Steigerungen sind moderat.

    2. 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.

    Korrektheit

    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.

    Qualität erreichen

    Um Software in guter Qualität zu schreiben, sind drei Schlüsselfaktoren sehr wichtig: Fokus, Qualität regelmässig messen und gute Teamarbeit.

    Fokus

    • Auf einzelnen Task konzentrieren.

    • Klares Ziel und klare Anforderungen - sonst wird falsches gebaut.

    • Abschluss des Tasks in Sichtweite, Tasks von kleiner .

    Qualität regelmässig messen

    • 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!

    Teamarbeit

    • 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.

    Clean Code

    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.

    Loose Coupling

    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.

    Naming

    Choose Descriptive / Unambiguous Names

    Namen müssen abbilden, wofür eine Variable, eine Eigenschaft oder eine Klasse abbildet. Namen müssen präzise sein!

    Name Methods After What They Do

    Der Name einer Methode muss beschreiben, was sie macht, nicht wie sie es macht.

    Name Describe Side Effects

    Namen müssen die komplette Funktionalität reflektieren.

    NO Encoding in Names

    Keine Präfixes (wie m_Variable), keine Typeninformationen (wie string sName ).

    Pair Programming

    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.

    Test Driven Development (TDD)

    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.

    Pfadfinderregel

    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);
    Versuchen, T-Shaped Personen aufzubauen (spezialisiert in einem Bereich, generalisiert auf vielen Gebieten)

    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

    Testing
    Granularität
    588KB
    V2_Clean_Code_V3.pdf
    PDF
    Open
    Clean Code Cheat Sheet (BBV)

    ❓Testplan: Praxisbeispiel

    Auf dieser Seite ist ein Beispielhafter Ausschnitt eines Testplans ersichtlich.

    Testplan Elektronische Preisliste

    Hier stehen noch keine Werte für das Datum, Tester/in und Versionen, diese werden dann für die spezifische Testdurchführung festgelegt.

    Dokument Version: 1.1

    Durchführungsdatum: Tester/in: App Version & Umgebung: <URL> :

    Navigation & Sprache

    Vorbedingungen

    • Software ist installiert unter <URL>

    • Die Folgenden Browser sind auf dem System jeweils in der aktuellsten Version verfügbar:

      • Chrome

      • Edge

      • Firefox

    Testszenario

    Hier stehen als Platzhalter bereits die Spalten "Abw. Resultat" und "Erfüllt". Diese werden im Testplan noch nicht ausgefüllt, sondern erleichtern die anschliessende Erstellung des Testprotokolls. Erst da werden sie ausgefüllt.

    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.

    Preisliste - Listenansicht

    Vorbedingungen

    • 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.

    Testszenario

    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.

    Preisliste - Detailansicht

    Vorbedingungen

    • 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.

    Testszenario

    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.

    ❓Testprotokoll: Praxisbeispiel

    Testdurchführung 2020-02-26 Sprint 4 - Sprint End Test

    Dokument Version: 1.1 Durchführungsdatum: 26.02..2020 Tester/in: Hans Muster App Version & Umgebung: 0.4.0.114 (DEV) API-Version & Umgebung: 0.4.0.89 (DEV) <URL> : https://test.pricelist.com:3587/

    Übung C# Grundlagen

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

    Es ist am einfachsten, Notizen auf einem Blatt Papier zu machen, um die Aufgaben zu lösen. Du kannst den Code zum Verständnis auch ins Visual Studio kopieren, versuch's doch zuerst auf Papier 😉

    Aufgabe 1

    Was ist der Wert der Variablen i und a nach Durchlauf des Code-Abschnittes?

    Navigation & Sprache

    Vorbedingungen

    • Software ist installiert unter <URL>

    • Die Folgenden Browser sind auf dem System jeweils in der aktuellsten Version verfügbar:

      • Chrome

      • Edge

      • Firefox

    Testszenario

    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.

    Preisliste - Listenansicht

    Vorbedingungen

    • 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.

    Testszenario

    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.

    Preisliste - Detailansicht

    Vorbedingungen

    • 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.

    Testszenario

    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 a nach Durchlauf des Code-Abschnittes?

    int i = 0; 
    int a = 2; 
    
    i = a++;

    Lösung

    Da bei a++ zuerst die Zuweisung zu i und erst danach das Inkrementieren gemacht wird, ist die Lösung:

    i = 2
    a = 3

    Wäre der Ausdruck stattdessen i = ++a gewesen, wären beide 3 gewesen, denn da passiert zuerst das Inkrementieren.

    Aufgabe 2

    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 i und c nach Durchlauf des Code-Abschnittes?

    int i = 0;
    int c;
    
    for (c = 1; c <= 4; c++) {
        i += c - 0; 
    }

    Lösung

    i = 10
    c = 5

    Siehe Tab "Lösungsweg" für weitere Details zum Lösungsweg.

    Lösungsweg

    Aufgabe 3

    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 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) {
        ++
    

    Lösung

    Der Ausdruck (b && n < m) ist true wenn b == true ist UND n < m ist. Also wenn beide Bedingungen zutreffen.

    Die while Schlaufe wird solange ausgeführt, wie der Ausdruck true ist.

    Aufgabe 4

    Was ist der Wert der Variabel i nach Durchlauf des Code-Abschnittes?

    Was ist der Wert der Variabel i nach Durchlauf des Code-Abschnittes?

    Lösung

    Der Ausdruck i != 9 ist gleich zu Beginn wahr, i wird um 2 erhöht und mittels break wird die while Schlaufe beendet.

    Aufgabe 5

    Was ist der Wert der Variabel j nach Durchlauf des Code-Abschnittes?

    Was ist der Wert der Variabel j nach Durchlauf des Code-Abschnittes?

    Lösung

    Aufgabe 6

    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?

    Aufgabe 7

    Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?

    Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?

    Lösung

    Aufgabe 8

    Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?

    Was sind die Werte im a Array nach Durchlauf des Code-Abschnittes?

    Lösung

    Kein Resultat -> Cannot implicitly convert type int to string

    Aufgabe 9

    Was ist der Wert der Variable j nach Durchlauf des Code-Abschnittes?

    Was ist der Wert der Variable j nach Durchlauf des Code-Abschnittes?

    Lösung

    Kein Resultat -> Endlosschleife

    Aufgabe 10

    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.

    Lösung

    Aufgabe 11

    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.

    Lösung

    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 = false
    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;
        } 
    }
    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] = 0
    string[] 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);

    n;
    ++m;
    if (n == 20)
    {
    n++;
    }
    if (m == 22)
    {
    b = false;
    }
    }
    n;
    ++m;
    if (n == 20)
    {
    n++;
    }
    if (m == 22)
    {
    b = false;
    }
    }

    ✅✅✅

    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.

    ✅

    Analyse & Design

    💬 Klassendiskussion

    • Was versteht ihr unter Analyse & Design?

    • Wer hat schon an Kundensoftware gearbeitet?

    Einleitung

    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.

    Use Case Diagramm

    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 Story

    "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 Story Definition

    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.

    Struktur einer User Story

    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.

    <Nutzer> – Wer?

    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.

    Beispiel: Du bist aktuell in der Rolle "Teilnehmer des Kurses". Das sagt mir zwar, dass du das EFZ in Informatik machst, sagt aber noch nichts darüber, ob du eine Lehre als Informatiker in Systemtechnik oder Applikationsentwicklung machst, oder welche Rolle du in deiner Firma wahrnimmst.

    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.

    <Funktion> – Was?

    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.

    Beispiel: Auch wenn Du und ich nicht direkt darüber gesprochen haben, habe ich durch meine tägliche Arbeit als Softwareentwickler und Berater ein gutes Verständnis, welche Fragen du im Zusammenhang mit der Erstellung einer User Story mitbringst. Die <Funktion> dieser Lektion ist "User Stories verstehen". Das heisst, daraus resultiert folgende User Story:

    Als Teilnehmer dieses Kurses möchtest Du User Stories verstehen, ….

    <Wert> – Warum?

    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.

    Beispiel: Dein erwarteter Mehrwert aus der aktiven Teilnahme an diesem Kurs kann sein, dass du eine gute Modulnote erhälst, kann aber auch sein, dass du ab morgen User Stories anwenden möchtest. Daher würde die User Story hier so aussehen:

    Als Teilnehmer dieses Kurses möchte ich User Stories verstehen, damit ich den ÜK mit einer guten Note abschliessen kann.

    oder

    Als Teilnehmer dieses Kurses möchte ich

    Abnahmekriterien

    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:

    Story 5: User Stories verstehen

    Als Teilnehmer dieses Kurses möchte ich User Stories verstehen, damit ich den ÜK mit einer guten Note abschliessen kann.

    Abnahmekriterien:

    • Der Instruktor hat alle Punkte erklärt

    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.

    Granularität

    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.

    Aktivitätsdiagramm

    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:

    💬 Beispiel

    • 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 = 21
    User Stories verstehen,
    damit ich
    ab morgen User Stories verwenden kann
    .

    Der Kursteilnehmer hat die ganzen Unterlagen zum Thema "Analyse & Design" gelesen

  • Der Kursteilnehmer hat die Übung "Projektanforderungen analysieren" abgeschlossen

  • möchte ich
    ein Benutzerkonto erstellen
    , damit ich
    mich im System einloggen kann
    .
    agile Vorgehensweise
    User Stories – Universelle Sprache in agilen Teams
    Persona ist ein typischer Vertreter deiner Zielgruppe
    http://www.highscore.de/uml/aktivitaetsdiagramm.html
    Verständnis von Anforderungen