# Programmierparadigmen von verschiedenen Programmiersprachen ## Übung 02.11.2023 ### Java Imperativ Objekt-orientiert (OOP) Streng objekt-orientiert Konzept: Klassen/Objekte Vererbung/Kapselung/Polymorphie Modellierung komplexer Probleme leichter Wartbar/Skalierbar Plattform unabhängig -> Cross-Plattform Kompatibilität Multi-Threaded Funktional (seit neueren Versionen) ### C Imperative Programmiersprache Prozedurale Programmiersprache Weitergabe von Daten über Funktionen Typisierte Programmiersprache -> Streng typisiert Vorteil: Hardwarenähe, Kompatibilität Schnelligkeit Nachteil: Speicherverwaltung ### Python Imperativ Objekt-orientiert Klassen und Objekte Hierarchien Funktional Kompakte Syntax Interpretierte Sprache Übersetzung in andere Sprachen möglich (Cython, etc.) Portabilität Typisierung Dynamisch (Duck Typing) ### Go Modular, imperativ Breite Palette an Programmierparadigmen Teilweise Objektorientiert & Funktional Keine Vererbung Statt Klassen werden Structs verwendet Einache, effektive Programmierung Typisierung: Statisch typisiert Vor der Kompilierung müssen Typen fest stehen Mix: Schnelligkeit von C & Anwendungsmöglichkeiten/Simplizität von Python Multi-Threading ### JavaScript Erweiterung von HTML Multi-Paradigmen OOP, Prozedural oder Funktional Dynamische Typisierung Anwendung: Interaktive Web-Anwendungen (z.B. Google Maps) Vorteile: Modernes Erscheinungsbild, Günstiger Server-Traffic (läuft im Browser) Dynamische Elemente Event-basiert (Callbacks) Asynchrone Verarbeitung ### TypeScript Typisiert Imperativ, OOP Vererbung TypeScript hat Einfluss von JavaScript/Java/C# Baut auf Supermenge von JavaScript Bibliotheken auf Skalierbarkeit/Wartbarkeit -> Durch Einführung OOP ### SOLID # Separations of Concern Eine Klasse sollte nur für eine Funktion verantwortlich sein. # Open/Closed Principle Offen für Erweiterungen, aber geschlossen für Modifikationen. # Liskov Substitution Principle Objekte einer abgeleiteten Klasse sollte ohne, dass die Funktionalität des Programms eingeschränkt wird, anstelle von Objekten der Basisklasse verwendet werden können. # Interface Segregation Principle Clients sollten nicht von Schnittstellen abhängig sein, welche nicht verwendet werden. # Dependency Inversion Principle Module sollten nicht von einander abhänig sein, sondern von abstrakten Schnittstellen. ### STUPID # Singelton Es wird nur ein Objekt in einer Klasse erzeugt, wenn diese global zur Verfügung stehen, kann das die Testbarkeit beeinträchtigen. # Tight Coupling Teile die nichts miteinander zu tun haben, sind dennoch eng miteinander verbunden. Dies sollte nicht geschehen. # Untestability Untestbarkeit z.B. aufgrund von Tight Coupling, was zu Qualitätsverlust des Codes führen kann. # Premature Optimization Man sollte erst etwas Optimieren, wenn es auch nötig ist, sonst verschwendet man viel Zeit. # Indescriptive Naming Wenn man etwas ungenau benennt, kann das für andere Programmierer, die den Code ansehen, Probleme mit der Nachvollziehbarkeit machen. # Duplication Man sollte denselben Code nicht doppeln, da man jedes mal, wenn man etwas am Original verändert, auch bei den gedoppelten Codes die Veränderung vornehmen muss.