Informationen zum Kurs

Einfach strukturierte App-Programmierung lernen

Einführung

Kern des Kurses ist das Erlernen allgemeiner Sprachkomponenten und Programmiertechniken der App-Entwicklung, die unabhängig von Programmiersprachen und Technologien relevant sind.

Mit diesem Mindset können dann Projekte mit unterschiedlichen Sprachen und Technologien für unterschiedliche Aufgabenstellungen mit klaren Vorstellungen einfach strukturiert und erledigt werden.

Zur Anschaulichkeit und Vertiefung der Kenntnisse werden als Abschluss zwei Apps mit unterschiedlichen Technologien programmiert und dabei auch erste Sprachkenntnisse vermittelt.

Begleitend wird der Umgang mit Editoren für die Programmierung und das Vorgehen bei Recherchen mit Suchmaschinen und KI-Assistenten geübt.

Der weiteren Entwicklung bis zum Beherrschen von Programmierung steht nach dem Absolvieren dieses Kurses nichts mehr im Wege.

Kursübersicht

Der Kurs beginnt mit der Beschreibung spezieller elektronischer Bauteile, deren Zustände interpretiert und gezielt manipuliert werden können.

Es wird dann die Nutzbarmachung dieser Zustände für logische Operationen durch sogenannten "Maschinencode" dargestellt.

Maschinencode wird aus "Quelltext" erzeugt. Beim Erstellen des Quelltexts für Apps werden sprachübergreifend funktionale Bestandteile verwendet, deren Konzepte ausführlich behandelt werden.

Grundsätzlich unterliegt jeder Quelltext einer Reihe etablierter Qualitätskriterien, deren Einhaltung als Voraussetzung für effektives Arbeiten und effizienten Maschinencode gilt. Im Abschnitt über "Programmarchitektur" wird dieses Thema ausführlich behandelt.

Zum Abschluss werden für zwei Technologien Apps erstellt. Dabei werden die bisher gelernten allgemeinen Inhalte für zwei Technologien in den entsprechenden Programmiersprachen mit den zuvor bereits vorgestellten Entwicklungsumgebungen konkret umgesetzt.

Über mich

Anfang der 2000er Jahre erstellte ich meine ersten Homepages, also in einer Zeit, in der die programmiertechnischen Möglichkeiten und die Fähigkeiten der Browser noch sehr überschaubar waren.

Anfang der 2010er Jahre begann ich Programme zu entwickeln, die auf Microsoft Windows lauffähig waren. Dabei wurde ich mit Objektorientierter Programmierung (OOP) vertraut.

Ab 2014 veröffentlichte ich Apps im Microsoft Store. Inzwischen können dort vier von mir erstellte Apps bezogen werden.

Ende der 2010er Jahre gab es mit TypeScript die perfekte Möglichkeit dynamische Internetseiten auch objektorientiert zu programmieren und dabei auch die enormen Fortschritte der UI-Programmierung zu nutzen.

Mit der bei der Programmierung für beide Welten (Desktop und Internet) über die Jahre gesammelten Erfahrung konnte ich einen einheitlichen Programmierstil entwickelt, der auch in Zukunft Bestand haben wird. Natürlich verfüge ich auch über detaillierte Kenntnisse für den routinierten Umgang mit den eingesetzten Sprachen.

Es freut mich, wenn ich mein Wissen mit meinem Kurs weitergeben kann und Interessierten dabei helfe, eine sichere berufliche Zukunft zu finden.

Hardware

Die elektronische Basis von Software

Daten

Die elektronischen Bauteile arbeiten mit binären Daten (Bits und Bytes). Um eingegebene Informationen verarbeiten zu können, werden die Informationen in binäre Daten übersetzt (kodiert).

Nach der Datenbearbeitung werden die Daten für die Ausgabe entsprechend dem Zielmedium aufbereitet und stehen dann als Informationen zur Verfügung.

Nullen und Einsen

Die "Nullen und Einsen" des Maschinencodes (Software) sind schon lange ein stehender Begriff. Hardware-seitig entsprechen sie gegensätzlichen elektrischen Zuständen, die umgeschaltet und identifiziert werden können: "Strom aus vs. Strom an" oder auch "nicht geladen vs. geladen".

Auf den kausale Zusammenhang, also wie sich Hardware und Software wechselseitig manipulieren, wird im Kurs nicht eingegangen. Einfache Kenntnisse von den "Nullen und Einsen" als Basis von Software sind dagegen für das Verständnis wichtig.

Die Frage, wie komplizierte Software-Algorithmen zu einfachen "Nullen und Einsen" reduziert werden, geht man am besten anders herum an. Und der erste entscheidende Punkt ist, dass die "Nullen und Einsen" zu Gruppen zusammengefasst werden. Als Beispiel folgen alle acht möglichen Kombinationen (2^3) einer Gruppe von drei "binären" Werten:

[0-0-0], [0-0-1], [0-1-0], [0-1-1], [1-0-0], [1-0-1], [1-1-0], [1-1-1]

Durch die Gruppierung ist es möglich, jeder Position per Definition eine andere Information zuzuordnen. Die Zuordnungen sind für jede Gruppe gleich. Entsprechend dem binären Wert sind die zugeordneten Inhalte dann entweder gültig (1) oder nicht (0). Damit die Anzahl der Positionen auch vergrößert werden kann, erfolgen die Zuordnungen von rechts nach links.

Zum Beispiel können den Positionen der binären Werte von rechts nach links dezimale Zahlenwerte zugeordnet werden: 1, 2 und 4. Diese Werte werden dann entsprechend dem binären Wert nacheinander hinzugezählt (1) oder nicht (0). In dem Beispiel ergeben sich für die Gruppen Summen von 0 bis 7.

Bit und Byte

Eine binäre Position wird als "Bit" bezeichnet. Eine Gruppe von acht Bits wird als "Byte" bezeichnet und kann mit 256 möglichen Kombinationen (2^8) entsprechend viele Werte darstellen. Bei Bedarf werden Bytes auch kombiniert.

Im Kurs wird der Bezug von Bytes zur Programmierung am Beispiel der Zuordnung von Buchstabeninformationen (Zeichenkodierung) anschaulich gemacht.

Prozessor

Ein Prozessor besteht aus mehreren Bauteilen. In Zusammenarbeit mit dem Arbeitsspeicher werden in den Kernelementen Bytes bearbeitet. Im Kurs wird nur darauf eingegangen, dass gängige Prozessoren mehrere Kerne haben und welche Bedeutung dies für die Programmierung hat (Threads).

Bus

Mit "Bus" wird in der IT die datenbezogene Verbindung zwischen verarbeitenden Einheiten bezeichnet.

Arbeitsspeicher

Bei der Verarbeitung werden vom Prozessor alle Inhalte als Bytes kodiert im Arbeitsspeicher an genau definierten Stellen (Adressen) kurzfristig zwischengespeichert und abgerufen.

Die Organisation der Inhalte durch Byte-Adressen wird vom Betriebssystem gesteuert und ist für die Programmierung von Apps nur auf einfachem Niveau relevant. Darauf wird an den entsprechenden Stellen im Kurs näher eingegangen.

Permanenter Datenspeicher

Die wenigen für die Programmierung relevanten Eigenschaften von aktuellen Datenträgern werden erklärt.

Netzwerke

Mit Basiswissen über das Internet wird der Abschnitt abgeschlossen.

Software

Nutzbarmachung der Hardware

Prozessorbefehle

Bestandteil von Prozessoren ist ein Satz von Befehlen, die von Maschinencode aufgerufen werden, der sich im Arbeitsspeicher befindet.

Prozessorbefehle sind für App-Programmierung nicht relevant und werden nicht behandelt.

Arbeitsspeicher

Das Betriebssystem und gestartete Programme werden in den Arbeitsspeicher geladen. "Laden" bedeutet, dass in sogenanntem "Maschinencode" vorliegende Software unter Verwendung der Byte-Adressen und von Prozessorbefehlen mit dem Prozessor kommunizieren kann.

Auf die Speicherorganisation durch die laufende Software wird nicht weiter eingegangen. Der Unterschied der Speicherbereiche "Stack" und "Heap" wird aber in Vorbereitung des Abschnitts über "Variablen" erklärt.

Betriebssystem

Das Betriebssystem beginnt seine Arbeit mit Start des Geräts. In ihm sind Unterprogramme und sogenannte "Services" zusammengefasst, die die Verwaltung der gesamten laufenden Software einschließlich des Betriebssystems selbst erledigen. Dazu gehören auch sogenannte "Treiber" von Einheiten der sogenannten "Peripherie".

Programme werden vom Betriebssystem gestartet, bekommen dynamisch Systemressourcen zugeordnet und kommunizieren mit dem Betriebssystem solange sie laufen. Die Eigenschaften von "Threads" und "Tasks" werden durchgenommen.

Programm

Ein "Programm" ist im engeren Sinne Software, die als Maschinencode vorliegt.

Bei den vom Kurs behandelten Anwendungen wird der Maschinencode aus dem Quelltext erstellt. Auf die verschiedenen Technologien, die dafür verwendet werden, wird nicht näher eingegangen.

Quelltext

Beim Programmieren werden Texte mit Begriffen und Regeln von Programmiersprachen eingegeben und in Dateien gespeichert. Die Dateien einer Anwendung sind in der Regel in einem "Projekt" zusammengefasst.

Die Gesamtheit der Texte ist die Grundlage (Source) für die Erstellung des lauffähigen Maschinencode und wird als "Quelltext" bezeichnet.

GUI-Programmierung

Die Bildschirmausgabe einer App wird als "Grafische Benutzeroberfläche" bezeichnet. Das gängige Akronym "GUI" ist von der englischen Bezeichnung "Graphical User Interface" abgeleitet.

Die GUI-Programmierung ist ein gesonderter Bereich und wird erst mit den konkreten App-Programmierungen behandelt.

Entwicklungsumgebung

Für die Quelltexterstellung wird eine sogenannte "Entwicklungsumgebung" eingesetzt. Es stehen damit eine Vielzahl von Werkzeugen zur Verfügung, die für effektives und fehlerfreies Arbeiten unerlässlich sind.

Es werden zwei Entwicklungsumgebungen kurz vorgestellt, die im Kurs verwendet und dabei detailliert erklärt werden.

Prüfläufe mit Textausgaben

Beim Schreiben des Codes können jederzeit Prüfläufe (nicht zu verwechseln mit Testläufen) durchgeführt werden. Spezielle Code-Zeilen liefern dabei mit Textausgaben wertvolle Informationen. Das Vorgehen wird vorgestellt und ausführlich erklärt.

Mit Prüfläufen wird gezeigt, wie statischer Quelltext in ein dynamisches Programm transformiert wird. Anhand der Textausgaben wird mit gemeinsam erstellten Beispielen gezeigt, wie Methoden andere Methoden aufrufen und im daraus resultierenden Programmablauf der Inhalt von Variablen verändert wird.

Fehlersuche und Fehlerbehandlung

Während der Entwicklung ist es nicht ungewöhnlich, dass sogenannte "kritische Fehler" das Programm während einem Prüflauf zum Absturz bringen. Fehlersuche ist daher ein wichtiges Thema, das behandelt wird.

Auch bei fertigen Apps können zur Laufzeit kritische Fehler (Ausnahmen) auftreten und zum Absturz führen. Es werden Techniken gezeigt, mit denen voraussehbare Fehler vermieden oder Ausnahmefehler "abgefangen" werden können.

Ressourcen

In der Programmierung werden Informationsquellen, mit denen zur Laufzeit Variablen gefüllt werden, als "Ressourcen" bezeichnet. Der am meisten verwendeten Ressourcentyp sind Dateien, deren Inhalt auf vielfältige Weise gelesen wird.

Die Verwendung von Dateien durch Apps wird Teil der Projekte zum Abschluss des Kurses sein.

Sprachkonzepte

Sprachübergreifende funktionale Bestandteile von Quelltext

Namenskonventionen

Variablen, Methoden und weitere funktionale Bestandteile vom Quelltext werden anhand von Namen identifiziert.

Es werden allgemein Regeln bezüglich der Namensgebung und praktische Überlegungen besprochen, unter anderem werden die Bezeichnungen "Case-sensitiv", "Pascal-Case" und "Camel-Case" erklärt.

Quelltextblöcke

Werden Quelltextzeilen in eine abgegrenzte Gruppe zu einer funktionalen Einheit zusammengefasst, spricht man von einem "Quelltextblock". Quelltextblöcke können geschachtelt werden.

Neben der strukturellen Bedeutung der Schachtelung wird auch die wichtige funktionelle Bedeutung bezüglich dem sogenannten "Gültigkeitsbereich" (Scope) und der "Sichtbarkeit" (Zugriffsebenen, Accessibility Levels) allgemein erklärt.

Die Erklärung des Begriffs an dieser Stelle ist die Vorbereitung für die Behandlung der Konzepte, die als Block geschrieben werden.

Variablen

Daten werden im Quelltext durch Variablen repräsentiert. Folgende Konzepte und Begriffe werden vorgestellt:

  • Feld
  • Property mit Zugriffsmethoden
  • Statische Variable
  • Variablenwert
  • Variablentyp
  • Wertetyp
  • Referenztyp
  • Array
  • Lokale Variable
  • Parameter
  • Argument

Anweisungen

Die Aktionen zur Verwendung von Variablenwerten und Bearbeitung von Variablen werden im Quelltext durch Anweisungen ausgedrückt, die im Programmlauf nacheinander ausgeführt werden. Folgende Arten werden im Kurs behandelt:

  • Deklarationsanweisung
  • Ausdrucksanweisung
  • Auswahlanweisung
  • Iterationsanweisung
  • Sprunganweisung
  • Anweisung "await"
  • Anweisung "using"
  • Ausnahmebehandlungsanweisungen

Methoden

Anweisungen werden in Quelltextblöcke zusammengefasst, die als "Methoden" bezeichnet werden.

Methoden haben einen sogenannten "Rückgabewert" und werden entsprechend dem Inhalt des Werts auch "Funktionen" genannt.

Methoden sind von herausragender Bedeutung für die Strukturierung von Quelltext und den effizienten Lauf von Programmen. Sie werden entsprechend ausführlich im Kurs behandelt.

Events

Ein wichtiger Mechanismus und Bestandteil jedes Quelltexts sind "Events".

Mit Events wird die Verbindung des Haupt-Codes zum GUI-Code hergestellt. Es werden aber auch die weiteren hervorragenden Möglichkeiten der Verwendung von Events besprochen.

Objektorientierte Programmierung

OOP ist ein programmiertechnischer Ansatz, der sich an der Strukturierung der realen Welt orientiert. Dies wird durch Beispiele deutlich gemacht.

Als Grundlage für die Vorstellung einiger Konzepte werden die Basisbegriffe "Abstraktion", "Kapselung", "Vererbung" und "Polymorphie" erklärt. Dabei wird auch begründet, weshalb im Kurs Vererbung nicht und Polymorphie nur im Rahmen eines Konzepts eingesetzt werden.

Folgende Konzepte der OOP werden ausführlich behandelt:

  • Klasse
  • Objekt
  • Interface
  • Dependency Injection
  • Zugriffsmethoden Get und Set

Programmarchitektur

Sprachübergreifende Prinzipien und Konzepte für das strukturierte Schreiben, Warten und Erweitern von Quelltext

Einleitung

Zuerst wird der Unterschied zwischen Effektivität (Maximalprinzip) und Effizienz (Minimalprinzip) besprochen.

Entscheidend für die Effektivität bei der Erstellung von Quelltext und die Qualität (Fehlerfreiheit und Effizienz) von erzeugtem Maschinencode ist, wie Anweisungen zu Quelltextblöcken zusammengefasst und diese miteinander verbunden werden. In Anlehnung an die Erschaffung von Bauwerken wird dieser wichtige Teilbereich der Programmierung als "Programmarchitektur" bezeichnet.

Im Kurs werden zuerst Qualitätsanforderungen besprochen und dann Ziele für die Erfüllung der Anforderungen formuliert. Dabei wird nicht nur das Ergebnis in Form von Maschinencode betrachtet, sondern auch das Vorgehen bei der Erstellung des Quelltexts.

Zur Orientierung wird kurz auf einige etablierte Lösungsansätze (Pattern) hingewiesen.

Als Quintessenz des Kurses werden dann formale Prinzipien und inhaltliche Konzepte vorgestellt, mit denen die Ziele einfach und zuverlässig erreicht werden können.

Anforderungen an Quelltext

Erzeugter Maschinencode muss funktionieren.

Erzeugter Maschinencode muss effizient sein.

Erstellung des Quelltexts muss effektiv sein.

Wartung muss problemlos möglich sein.

Erweiterungen müssen problemlos möglich sein.

Ziele für die Umsetzung

Übersichtliche Projektstruktur

Keine redundanten Quelltextblöcke

Leicht nachvollziehbarer Programmierstil

Transparente Verbindung der Quelltextblöcke

Aussagekräftige Namensgebung

Formale Prinzipien für das Erreichen der Ziele

Für Klassen jeweils eine Datei

Trennung von View und Business Logic

Trennung der View in deklarative Markupsprache und Codebehind

Trennung der Business Logic nach Aufgabenbereichen

Trennung der Aufgabenbereiche in Controller und Services

Eigene Klasse für alle Konstanten

Eigene Klasse für in mehreren Klassen verwendete Variablen

Startup-Klasse für Setup von Variablen

Aussagekräftige Ordnerstruktur

Inhaltliche Konzepte für die Umsetzung der Ziele

Single-Responsibility-Prinzip für Klassen und Methoden

Verwendung der Zugriffsmethoden von Properties

Interfaces mit Interface Segregation

Klassenhierarchie mit Dependency Injection

Programmsteuerung mit Klassen und Methoden (Domain-Driven)

Programmsteuerung mit Events (Event-Driven)

Statische Variablen für Ergebnisse

Desktop-App erstellen

Für die Verwendung unter Microsoft Windows

Entwicklungsumgebung I

Visual Studio

Framework I

.NET

Programmiersprachen I

C#

XAML

Web-App erstellen

Für die Verwendung mit aktuellen Browsern

Entwicklungsumgebung II

Visual Studio Code

Framework II

Node.js

Programmiersprachen II

TypeScript

JavaScript

HTML

CSS