Foochan schrieb:
Einer der Gründe warum das vor allem bei UI gemacht wird, ist das Composite Pattern. Wie setzt man das Composite Pattern ohne Vererbung um?
Ganz Einfach, man nutzt kein Composite Pattern ;-)
Es geht auch ohne und deutlich einfacher -> Immediate UI ohne den ganzen Retained State immer rumzuschleppen.
Oder man macht von mir aus ein Basiscontrol von dem jedes Control erbt, aber dann wars das.
Hades85 schrieb:
Das würde ich auch gerne mal wissen.
Laut seiner Aussage, müsste Finalspace der größte Feind von Java sein, da wird man gezwungen Vererbung und OO zu nutzen.
Ganz einfach, desto mehr Vererbung desto unübersichtlicher wird alles. Einfachere Strukturen sind leichter zu verstehen.
Ich bevorzuge Code den ich komplett von Anfang bis Ende durchsteppen kann und bei den meisten GUI Systemen kann man das nicht, da die so unglaublich komplex aufgebaut sind, da jedes Steuerlement immer seinen State speichern muss.
Und nein, ich habe Jahrelang mit Java gearbeitet und bin beruflich aktuell in .NET C#/C++ CLI/WPF und Delphi unterwegs.
Aber ich vermeide sofern es möglich ist, Abstraktion um jeden Preis - denn unnötige Abstraktion macht Code schwerer zu verstehen und zu warten, vor allem wenn mehrere Personen daran arbeiten.
Das mag für den ein oder anderen komisch klingen, ist aber schlicht und ergreifend das was ich seit über 20 Jahren mitgenommen habe.
Dazu eine kleine aktuelle Geschichte:
Ich komm in eine neue Firma (Großer Konzern, alles Windows Welt), bekomm zwei Projekte zugewiesen die ich weiterentwickeln soll:
- Eine ur-alt Monster-Anwendung in Delphi geschrieben mit sehr klarem und sauberen Code - unterteilt in ~50 dll´s, soll portiert werden ins neuste Delphi
- Eine .NET Anwendung die WCF (Windows Communication Foundation) und WPF nutzt und nichts anderes macht als eigene Programme über nen UNC Store zu aktualisieren, was nichts anderes ist als Verzeichnisse und Dateien zu kopieren
Die Delphiportierung war in nem Monat durch, da der Code sehr sauber strukturiert wurde und nur wenige Fremdkomponenten benutzt wurden - und das trotz Ansi > Unicode. Laufen tut das ding ast rein.
Dagegen die .NET Anwendung zu verbessern war unglaublich aufwendig und hat deutlich länger gedauert, da es auf MVVM aufbaut und man damit jeden Furz abstrahieren muss. Dazu hat WCF es um Faktor 10 erschwert, da debuggen schlichtweg nicht möglich war (Die Anwendung musste immer als Windows Service laufen, damit es Admin-Rechte hatte). Dazu kam noch, dass derjenige der die Anwendung ursprünglich gebaut hatte, keinen Plan von MVVM hatte und ich erstmal tonnenweise Zeug reparieren musste:
- Man darf keine Messageboxen oder irgendwelche UI Sachen aus dem Viewmodel aufrufen
- Ur-alter XAML Stil inkl. miesem handling von Commands
- Überall Klassen die keinen Sinn gemacht haben und alles nur unnötig verkompliziert haben
- Die Unit-Tests waren nutzlos, da hoffnungslos veraltet und teilweise sogar falsches Ergebnis erwartet wurde
MVVM war damals neu für mich, aber ein paar Stunden Googlen hatten mir gereicht um die Kernkonzepte zu verstehen und dann alles deutlich zu verbessern, zu vereinfachen aber sich dennoch an den MVVM Standard halten.
Ich programmiere seit 1995 mit Delphi 2 (Objektpascal) und bin von vorne rein in die OOP-Welt geworfen worden, was das komplette Gegenteil ist von vielen anderen die mit C oder Assembler angefangen hatten.
Und nein ich verteufele nicht OOP, aber hasse es wenn es unnötig zu excessive eingesetzt wird - vor allem um Code so zu verschleiern das man wirklich nichts mehr versteht:
- Klassen die eigentlich nur eine Methode haben
- Konstrukturen die nichts anderes machen als Felder initialisieren (C++)
- Exceptions everywhere -> Error codes ist doch nicht mehr State of the Art (Ein 100 er Exception Stack macht doch viel mehr Spaß zu debuggen, wenn der Datenbankpool vollgelaufen ist)
- Statische Klassen die Handler, Manager oder sonst wie heißen die mehr tun als sie zu angeben zu tun
- Getter und Setter obwohl eigentlich keine notwendig besteht für irgendwelche Sichtbarkeitsbeschränkungen
- C++ Bibliotheken die wild Speicher erzeugen und ich keinerlei Zugriff darauf habe
- Nutzlose Kommentare bei selbsterklärenden Funktionsnamen
- Code der in 100 Methoden ausgelagert wurde, obwohl kein Code mehrfach verwendet wird (Eine Methode soll ja nicht mehr wie 30 Zeilen haben -.-)
- Es ist kaum bis gar nicht möglich Schritt für Schritt das Programm von Oben nach Unten zu debuggen
- Exrem aufgeblähte C++ OOP API´s mit hunderten von Templates (Boost z.b.)
- Exceptions vor Asserts bevorzugen