Browse Source

Merge branch 'fdai2751-main-patch-46205' into 'main'

Fdai2751 main patch 46205

See merge request fdai2751/lerntagebuch!1
remotes/origin/HEAD
fdai2751 1 year ago
parent
commit
abe5462288
  1. 154
      Lerntagebuch.md

154
Lerntagebuch.md

@ -13,3 +13,157 @@ Da er seine Fachwissen, seine Prinzipien, Methode und Richtlinien als Werkzeuge
Seine geistige Freiheit, neue anwendbare Algorithmen zu finden, um Bedürfnisse zu lösen, versetzt ihn ebenfalls in die Position eines Künstlers.
Im Rahmen unseres Projekts werden wir die Historie mithilfe des Versionskontrollsystems Git zurückverfolgen, da es eine hohe Sicherheit bietet, die Historie zu verfolgen, ohne dass die alte Datei nach einer Änderung verloren geht.
## Hausaufgabe zur SU02(31.10.2023)
### Lernziel
- Imperative Programmierung
- Deklarative Programmierung
- Prozedurale Programmierung
- Objektorientierte Programmierung
- Funktionale Programmierung
- typidierte Programmiersprachen
- typenlose programmiersprachen
- Prinzipen der Programmierung
### Erkenntnis
#### **1) Imperative Programmierung**
##### Definition
Die imperative Programmierung ist ein Programmierparadigma, das sich auf die Beschreibung von Schritten oder Anweisungen konzentriert, die ausgeführt werden sollen, um eine Aufgabe zu erledigen. Im Wesentlichen wird der Computer als eine Abfolge von Anweisungen angesehen, die in einer festgelegten Reihenfolge ausgeführt werden, um ein gewünschtes Ergebnis zu erzielen.
###### Beispiel
Ein Beispiel für imperatives Programmieren in einer alltäglichen Programmiersprache ist C. In imperativen Sprachen liegt der Schwerpunkt darauf, den Computer "Schritt für Schritt" anzuweisen, wie er eine bestimmte Aufgabe erledigen soll
- Koch Rezepte, Prozess-Checklisten
#### **2) Deklarative Programmmierung**
##### a) Resume
Die deklarative Programmierung ist ein Programmierparadigma, bei dem der Fokus auf der Beschreibung dessen liegt, "was" erreicht werden soll, anstelle von "wie" es erreicht werden soll.
Die deklarative Programmierung legt den Schwerpunkt auf die Spezifikation des gewünschten Ergebnisses, und der Computer bestimmt, wie dieses Ergebnis erreicht wird.
**b) einige Merkmale**
***1.Datenorientiert:*** In der deklarativen Programmierung stehen die Daten und ihre Beziehungen im Mittelpunkt. Es werden oft Datenmodelle und Strukturen verwendet, um Beziehungen zwischen verschiedenen Elementen festzulegen.
***2.Abstraktion:*** Abstraktion ist ein wichtiges Konzept. Es wird vermieden, sich in technischen Einzelheiten zu verlieren, und stattdessen werden abstrakte Modelle und Konzepte verwendet, um Aufgaben zu beschreiben.
***3.Deklarative Sprachen:*** Die deklarative Programmierung wird oft in speziellen Programmiersprachen oder mit bestimmten Konstrukten in allgemeinen Programmiersprachen umgesetzt. Beispiele hierfür sind SQL (für die Datenbankabfrage), HTML (für die Beschreibung von Webseiten) und Prolog (für logische Programmierung).
***4.Automatische Optimierung:*** In deklarativen Sprachen kümmert sich der Computer um die Optimierung des Codes, um das gewünschte Ergebnis auf effiziente Weise zu erzielen. Der Programmierer muss sich weniger um die Details der Implementierung kümmern.
##### c) Beispiel und Vorteile
Ein gutes Beispiel für deklaratives Programmieren ist ***SQL (Structured Query Language)***, das für die Abfrage von Datenbanken verwendet wird. In SQL gibt der Entwickler an, welche Daten aus der Datenbank abgefragt werden sollen, und die Datenbank-Engine entscheidet, wie die Daten effizient abgerufen werden.
Die deklarative Programmierung erleichtert oft die Entwicklung und Wartung von Code und fördert die Abstraktion und Modularität.
#### **3) Prozedurale Programmierung**
**a) Resumé**
Die prozedurale Programmierung ist ein Programmierparadigma, bei dem der Code in Funktionen oder Prozeduren organisiert ist, die eine Abfolge von Anweisungen enthalten. Im Wesentlichen wird das Programm in Teile aufgeteilt, die bestimmte Aufgaben ausführen, und diese Teile werden sequenziell ausgeführt.
**b) Merkmale**
- ***Prozeduren:*** In der prozeduralen Programmierung sind Prozeduren oder Funktionen zentral. Diese Prozeduren enthalten eine Gruppe von Anweisungen, die eine bestimmte Aufgabe erledigen. Durch die Verwendung von Prozeduren kann Code wiederverwendet und besser organisiert werden.
- ***Variablen:*** Die prozedurale Programmierung verwendet oft globale und lokale Variablen, um Daten zu speichern und zwischen Prozeduren auszutauschen.
- ***Kontrollstrukturen:*** Die prozedurale Programmierung verwendet Kontrollstrukturen wie Schleifen (for, while) und Verzweigungen (if, else), um den Ablauf des Programms zu steuern.
- ***Sequenzielle Ausführung:*** Die Anweisungen in den Prozeduren werden sequenziell, von oben nach unten, ausgeführt.
**c) Beispiel und Vorteile**
Ein bekanntes Beispiel für die prozedurale Programmierung ist ***die Programmiersprache C***.
In der prozeduralen Programmierung wird der Code in gut strukturierte Funktionen oder Prozeduren aufgeteilt, die spezifische Aufgaben erledigen. Dieses Paradigma ist weniger abstrakt und mehr auf die Aufteilung des Codes in logische Abschnitte ausgerichtet, um die Lesbarkeit und Wartbarkeit zu verbessern.
#### **4) Objektorientierte Programmierung**
**a) Resumé**
Die objektorientierte Programmierung (OOP) ist ein Programmierparadigma, bei dem der Fokus auf der Modellierung von Daten und der Interaktion zwischen diesen Datenobjekten liegt. Kurz gesagt, dreht sich die OOP um Objekte, die Instanzen von Klassen sind, und diese Objekte haben Eigenschaften (Attribute) und Verhalten (Methoden)
**b) Merkmale**
- ***Klassen und Objekte:*** In der OOP werden Datenstrukturen in Klassen definiert, die als Baupläne für die Erstellung von Objekten dienen. Objekte sind konkrete Instanzen dieser Klassen und repräsentieren reale oder abstrakte Entitäten.
- ***Verkapselung:*** OOP fördert die Verkapselung, bei der Daten und die Methoden, die sie verarbeiten, in Objekten zusammengefasst und vor äußeren Einflüssen geschützt werden. Nur bestimmte Methoden können auf die internen Daten eines Objekts zugreifen.
- ***Vererbung:*** Die Vererbung ermöglicht die Erstellung von neuen Klassen, die Eigenschaften und Verhalten von bestehenden Klassen erben. Dies fördert die Wiederverwendbarkeit von Code und die Organisation von Klassen in Hierarchien.
- ***Polymorphie:*** Polymorphie ermöglicht es, dass verschiedene Objekte, die von unterschiedlichen Klassen abgeleitet sind, denselben Methodennamen verwenden können, um unterschiedliche Implementierungen für diese Methoden zu haben. Dies erleichtert den flexiblen Umgang mit verschiedenen Objekttypen.
- ***Nachrichtenbasierter Ansatz:*** In der OOP kommunizieren Objekte miteinander, indem sie Nachrichten senden und empfangen. Dies fördert die Modularität und Flexibilität im Design.
**c) Beispiel und Vorteile**
Ein bekanntes Beispiel für OOP ist die ***Programmiersprache Java.***
In der objektorientierten Programmierung wird der Code in Klassen organisiert, die Attribute (Daten) und Methoden (Funktionen) enthalten, um Objekte zu erstellen und mit ihnen zu interagieren. OOP erleichtert die Modellierung komplexer Systeme, indem es Konzepte und Entitäten aus der realen Welt in den Code überträgt.
#### **5) Funktionale Programmierung**
**a) Resumé**
Die funktionale Programmierung ist ein Programmierparadigma, bei dem der Fokus auf der Verwendung von Funktionen als grundlegender Baustein der Softwareentwicklung liegt.
**b) Beispeil und Vorteile**
Ein bekanntes Beispiel für funktionale Programmierung ist ***die Programmiersprache Haskell, C++, Scala.***
Die funktionale Programmierung fördert das Schreiben von Code, der leichter zu verstehen, zu testen und zu warten ist, da er weniger komplexe Zustände und Seiteneffekte aufweist.
Dieses Paradigma ist in Bereichen wie parallelem und nebenläufigem Computing sowie in der Verarbeitung großer Datenmengen besonders nützlich.
#### **6) typisierte Programmiersprache**
**a) Resumé**
Eine typisierte Programmiersprache ist eine Programmiersprache, die strenge Regeln für die Verwendung von Datentypen in Programmen festlegt.
Diese Regeln schreiben vor, welche Art von Daten in Variablen gespeichert werden kann und wie diese Daten verarbeitet werden können. Kurz gesagt, in typisierten Programmiersprachen müssen Variablen einen spezifischen Datentyp haben, und es werden Überprüfungen durchgeführt, um sicherzustellen, dass Datentypen korrekt verwendet werden.
**b) Merkmale**
- ***Statisch typisierte Sprachen:*** In diesen Sprachen werden Datentypen zur Kompilierungszeit überprüft, bevor das Programm ausgeführt wird. Der Entwickler muss explizit den Datentyp für jede Variable deklarieren, und es werden Fehler gemeldet, wenn Datentypen nicht korrekt verwendet werden.
- ***Dynamisch typisierte Sprachen:*** Hier erfolgt die Überprüfung der Datentypen zur Laufzeit, während das Programm ausgeführt wird. Entwickler müssen in der Regel keine expliziten Datentypen für Variablen angeben, und die Datentypen können sich zur Laufzeit ändern.
**b) Beispiel und Vorteile**
Beispiele für ***statisch typisierte Programmiersprachen sind C, Java und C++,***
während Beispiele für ***dynamisch typisierte Programmiersprachen Python, JavaScript und Ruby*** sind.
Typisierte Programmiersprachen bieten den Vorteil, dass sie dazu beitragen, Fehler frühzeitig im Entwicklungsprozess zu erkennen und die Robustheit und Zuverlässigkeit von Software zu verbessern.
#### **7) typenlose Programmiersprachen**
**a) Resumé**
Typenlose Programmiersprachen, auch als dynamische Typisierung oder schwache Typisierung bezeichnet, sind Programmiersprachen, die weniger strenge Anforderungen an die Verwendung von Datentypen in Programmen stellen.
Im Wesentlichen erlauben sie mehr Flexibilität bei der Verwendung von Variablen und operieren oft ohne strikte Überprüfung der Datentypen zur Kompilierungszeit
**b) Beispiel und Vorteile**
Beispiele für typenlose ***Programmiersprachen sind JavaScript und PHP***. Während sie in einigen Fällen bequem und flexibel sind, erfordert die Verwendung typenloser Sprachen oft sorgfältige Prüfung und Validierung, um unerwartete Probleme aufgrund von Datentypkonvertierungen oder Inkompatibilitäten zu vermeiden.
#### **8) Prinzipien der Programmierung**
##### **A) SOLID**
- **S**eparations of Concern = *Eine Klasse sollte nur eine einzige Verantwortung haben. Das bedeutet, dass sie nur für eine bestimmte Aufgabe oder Funktion zuständig sein sollte. Wenn eine Klasse zu viele Verantwortlichkeiten hat, wird der Code schwerer wartbar und erweiterbar.*
- **O**pen/ Closed principle = *Softwareeinheiten (Klassen, Module, usw.) sollten offen für Erweiterung, aber geschlossen für Modifikation sein. Das bedeutet, dass Sie neuen Code hinzufügen können, um die Funktionalität zu erweitern, ohne den bestehenden Code ändern zu müssen.*
- **L**iskov Substitution Principle = *Subklassen solletn sich so verhalten , als wären sie Instanzen ihrer Basisklassen, ohne unerwartetes Verhalten oder Fehler zu verursachen. Dies ermöglicht den Austausch von Objekten der Basisklasse durch Objekte von Subklassen, ohne die Funktionalität zu beeinträchtigen.*
- **I**nterface Segregation Principle = *Schnittstellen (Interfaces) sollten spezifisch für die Anforderungen einer Klasse sein . Eine Klasse sollte nicht gezwungen sein, Methoden zu implementieren, die sie nicht benötigt. Auf diese Weise wird die Abhängigkeit von unnötigen Methoden vermieden.*
- **D**ependency Inversion Principle = *Abhängigkeiten zwischen Modulen oder Klassen solletn so gestaltet sein , dass höherstufige Module nicht von niedrigerstufigen Modulen abhängen, sondern beide von abstrakten Schnittstellen oder Abstraktionen abhängen. Dies fördert die Entkopplung und Flexibilität im Code.*
##### **B) STUPID**
- **S**ingleton = *Das Prinzip behauptet, dass das Verwenden von Singleton-Objekten, bei denen es nur eine Instanz einer Klasse gibt, oft zu starren und schwer testbaren Designs führen kann. Singleton wird oft als Anti-Pattern angesehen, wenn es missbräuchlich verwendet wird.*
- **T**ight Coupling = *Dies bezieht sich auf eine enge Kopplung zwischen Klassen, bei der Änderungen in einer Klasse zu weitreichenden Auswirkungen auf andere Klassen führen. Eine zu starke Kopplung kann die Wartbarkeit des Codes erschweren.*
- **U**ntestability = *Wenn Code schwer zu testen ist, wird dies als ein schlechtes Design betrachtet. Testen ist ein wichtiger Bestandteil der Softwareentwicklung, und schlecht getesteter Code kann zu Fehlern und unerwünschtem Verhalten führen.*
- **P**remature Optimization = *Das vorzeitige Optimieren des Codes, bevor es tatsächlich notwendig ist, kann zu komplexem und schwer verständlichem Code führen. Es wird empfohlen, die Optimierung auf spätere Phasen der Entwicklung zu verschieben, wenn klar ist, welche Teile des Codes tatsächlich verbessert werden müssen.*
- **I**ndescriptive Naming = *Aussagekräftige Bezeichnungen für Variablen, Methoden und Klassen sind wichtig, um den Code verständlicher und wartbarer zu machen. Wenn Bezeichnungen unspezifisch oder unverständlich sind, wird der Code schwer zu verstehen*
- **D**uplication.
### **Farzit**
Zusammenfassend sind die ***SOLID-Prinzipien*** Leitlinien für eine gute Softwarearchitektur, während das ***STUPID-Prinzip*** eine humorvolle Art ist, auf schlechte Praktiken hinzuweisen.
Entwickler sollten die SOLID-Prinzipien beachten, um robuste und wartbare Software zu erstellen, und gleichzeitig die im STUPID-Prinzip genannten Probleme vermeiden.
Loading…
Cancel
Save