Hey,
Man bekommt keinen OO-Code, wenn man beliebigen Code nimmt, und diesen umformt.
Wesentlich für OO-Design ist der Modellierungsprozess - und den hat man nicht, wenn man Prozeduralen Code ohne Kontext bekommt und umformen soll.
Ich habe eine Funktionalität, die ich realisieren möchte. Diese kann ich mit OO oder PP realisieren. Von daher müsste beides ineinander umformbar sein. Falls nicht, zeigt es doch eindeutig, dass OO stark einschränkend ist, oder aber eine verkomplizierte und nicht ressourcenschonende Programmierung vorraussetzt.
(siehe BSP diese ActionObjects, zumal ich von denen sowieso behaupten würde, dass diese Prozedural sind, nur eben mit ein paar Keywörtern aus der Objektorientierung)
Wie schon gesagt: das A und O für alles gibt es nicht

Wenn in einem System alles alles kennen muss, es also absolut keine Kapselung geben darf, ist OO falsch.
Ich kann mir aber auch nur sehr schwer bildlich einen Motoradmotor vorstellen, der die Sonneninnentemperatur kennt...
Nein es muss nicht alles alles kennen. Aber zumindest Modulintern wäre das ziemlich schön.
Gehen wir davon aus unser Sonnensystem ist nur ein kleines Modul ist, in einem System das viel Größer ist.
Modul != Klasse (zumindest sollte es so sein?!)
Und das ist das Problem: Jede klasse ist in sich genommen ein eigenes abgeschottetes Modul.
Deiner Aussage zu Folge dürfen zwei Klassen so gut wie nichts von einander wissen.
Falls doch, wäre es toll, wenn du dahingehend deine Argumentation nochmal neu aufrollen würdest^^
Wenn die Anforderung das völlige fehlen jeglicher Kapselung ist, dann ist ein Paradigma, bei dem Kapselung eines der Hauptprinzipen ist, falsch. Da geb ich dir völlig Recht, für diesen Anwendungsfall gibt es keine OO-Lösung.
Also ist OO überall da falsch, wo ich Dinge/Funktionalität auf mindestens zwei Klassen aufteilen muss?
Diese aber voneinander wissen müssen, damit das Gesamtkonzept funktioniert?
Also sprich ist OO immer falsch?!^^
Für mich ist das das Ende der Katastrophe...kommt auf die Sichtweise an
ja^^ (das ja ist jetzt keine Zustimmung^^)
Kannst du machen. Aber auch wenn es Taschendiebe gibt, sogar einen, der direkt neben dir steht, habe trotzdem nicht ich von dem Rechner, an dem ich grad sitze, Zugriff auf die Münzen im Bargeldfach deines Portmonees.
Etwas mehr Kreativität. Die Welt so wie sie ist, ist doch langweilig, in meiner erfundenen Welt ginge das beispielsweise^^
Klar wenn ich jetzt irgendwas aus der uns bekannten Welt abbilden möchte, da ginge das nicht. Aber sobald du eben ein Computerspiel oder Sonstiges entwirfst, da sollten dir keine Grenzen gesetzt sein und schon gar nicht von einem Programmierparadigma. Die Gesetzmäßigkeiten in dem Programm gibst du selbst vor und sollten dir nicht von dem Programmierparadigma vorgegeben werden.
Von dem Interface gibt es 42 verschiedene Implementierungen, die intern beliebig aufgebaut sein können.
Schon ist's nicht mehr einfach über Prozeduren abbildbar.
Und das ist noch ein weiterer schlechter Beigeschmack seitens OO. Warum sollte ich 42 verschiedenartige Implementierungen machen wollen?
Das macht nur dann Sinn, wenn ich ne Bibliotheksfunktion/Modul entwerfe, und diese auf unterschiedliche Aspekte ausrichte. Bspw. ne QUEUE, die ich einmal so implementiere und ein ander mal so. Bei suchlastiger Benutzung ist eventuell QUEUE Implementierung 1 besser wie 2, welches da bei einfacher Speicherung besser performt.
Aber im allgemeinen verstehe ich es nicht, warum man 42 verschiedene Typen entwerfen sollte.
ABER das ist auch der einzige vorteil, wenn da class BankRepo steht statt nen einfachen Call wie give_me_Bank(id, sonstiges);
btw. wäre auch das noch möglich give_me_bank(id, implementierungs_ID, sonstiges); ^^
Der Aufbau des Speichers hängt nicht vom Paradigma ab!
Auf den Rest geh ich deshalb gar nicht erst ein.
Ja da hast du recht^^.
also ich würde sagen call_func1(parameter); und tmp=new Func1_Object(parameter); tmp->action(); //gc tmp
sind beides prozedurale Realisierungen. Nur das zweiteres eben Keywörter aus der objektorientierung verwendet, das ganze ressourcenfressender/langsamer ist und mir keine weiteren Vorteile einräumt.
Warum sollte ich dann Zweiteres verwenden?
Warum sollte ich allgemein irgendwas davon verwenden, wenn ich OO programmieren möchte?
Wie gesagt es sind beide Realisierungen prozedural.
Ja, in Anwendungsfällen, in denen sie sinnvoll sind, befürworte ich sie.
Nein, sie sind nicht prozedural.
Sie sind eben Daten+Funktion, und nicht einfach nur irgendeine Prozedur.
Du hast ja oben selbst geschrieben, dass man PP nicht so einfach in OO umwandeln kann.
Hier geht es, aber es geht auch nur, weil der scheinbare oo-code weiterhin prozedural ist.
Es ist ein weit verbreitetes Missverständnis, dass DI "dynamisch zur Laufzeit gesuchte Objekte" oder "Service-Objekte" bedeuten würde.
Es ist völlig egal, was für eine Abhängigkeit und wie diese übergeben wird - es muss nur eine Abhängigkeit sein, die übergeben wird.
Könntest du DI etwas weiter ausführen, wie du es einsetzt. vllt. auch ein/zwei/gar 3? gute Codebeispiel(e)^^, was/welche mich somit dann schon eher von OO überzeugen könnte^^
Wenn irgendwo ein von einzelnen Softwaremodulen inklusive deren Arbeitsweise die Rede ist, wurde schon modelliert, sonst wäre das Modul und deren Arbeitsweise nicht da ^^
hmmm, ok^^
Wenn ich bei meinem Haus den Dachboden im 3. Stock und den Keller stark verweben möchte, knallt's auch (bzw bricht zusammen). So ist das halt, wenn man zwanghaft völlig getrennte Dinge zusammenbringen möchte...
Hier muss man einfach die Kreativität wieder einschalten, dann geht das schon^^
Wenn sie so stark verwoben sind, sind es keine unterschiedlichen Module.
Wenn irgendwer sie als unterschiedliche Module modelliert hat, hat der in dem Fall Mist gebaut.
Ja hier sind wir wieder bei der Thematik. ob Klasse == Modul oder Klasse != Modul
Wie trennst du Module?
Wie soll ich mein Motoorradmotor mit der Sonneninnentemperatur verknüpfen, wenn beides in gleichem Modul liegt und ich das ganze OO gestalten möchte?
*DU* bist der Meinung. Begründen kannst du die aber nur mit "ganz oder gar nicht".
Analoges Beispiel: Im Straßenverkehr passieren Unfälle.
Die eine Reaktion darauf wäre zu einem Optimum hin arbeiten, z.B. mit möglichst sicheren Autos und StVO (OOP mit Service-Klassen)
Eine andere wäre, StVO und alle Sicherheitseinrichtungen aus Autos abzuschaffen ("weil OOP nicht 100% deinem OOP-Verständnis entspricht kein OOP nutzen)
also ich finde schon, dass man entweder 100%iges OO programmieren sollte, oder gar nicht.
Zumindest aber müsste es ja möglich sein 100%iges OO einschränkungslos programmieren zu können?, wenn es das Paradigma der heutigen Wahl ist?!^^
Da steht das gleiche in grün^^
Auch wenn es in rot dastünde, wäre es das gleiche...... zumindest für mich^^ Da ich die Farben nicht so genau auseinanderhalten kann^^
Naja ganz das gleiche steht da nicht, ein paar weitere Aspekte habe ich dort schon auch noch erwähnt, aber war vor ca. 3 Jahren, manches würde ich vllt. gar nicht mehr so unterstreichen.....
Jetzt habe ich mal wieder ein praktisches Beispiel:
Gehen wir mal davon aus ich baue einen Chat,
Irgendwo habe ich ein Modul, das sich um die Netzwerkkommunikation kümmert.
Am besten eines, das ein nicht blockierendes reactive Modul, wie Netty nutzt (aber das ist nur nebensächlich).
Der Chat hat jetzt mehrere Chaträume und diese Räume können Unterräume haben (übrigens soll alles dynamisch aufgebaut werden: Die Raumstruktur ist also nicht fix)
****** Das hier als kleine Zusatzanforderung, die jetzt aber nicht Hauptkriterium meiner Frage ist*******
Sollte ein Raum länger unbesucht sein, wird er nicht im Arbeitsspeicher gehalten, sondern soll in der Datenbank verweilen.
Im Falle des Betretens kann er in das Serverprogramm geladen werden. Im Falle der Abfrage von Rauminformationen von Aussen, wo nicht erwartet wird, dass viel mehr mit dem Raum interagiert wird, sollen gezielte Informationen ausschließlich aus der Datenbank geholt werden, ohne dass der Raum in seiner Vollständigkeit in den Server geladen werden muss (performance-Gründe!)
Ich gehe mal davon aus, mittels des Proxypattern zu realisieren???!!!
***************************Ende******************************************************
In den einzelnen Chaträumen können Befehle ausgeführt werden, oder auch nicht ausgeführt werden, je nach Raumtyp und Raumkonfiguration gibt es diverse Befehle oder gibt es nicht.
So jetzt wird das ganze interessant
Je nach Befehlstyp, Raumtyp/config.... Usertyp, vorherige Netwerkbelastung des Users, andere Modulzustände etc pp verhält sich entsprechender Befehl anders.
Beispiele (Wir haben den Raum X)
Der User hat einen globalen Mute -> er wird keine Chatnachricht in Raum X absenden können.
oder vllt doch?. Vllt gibt es Räume die den globalen Mute ignorieren, oder einen noch verschärfteren Globalen Mute vorrraussetzen, dass der User nicht schreiben kann!
Ein Admin, der sich nicht in Raum X befindet, kann auch von Aussen in den Raum schreiben
Alle anderen User müssen sich innerhalb des Raumes X befinden um schreiben zu können.
Ausgenommen sind Speziallräume, die von auch von Moderatoren von Aussen beschrieben/gelesen werden können
In Raum X können User, die mit der IP-Adresse ???. anfangen nur alle 10min eine Nachricht hinterlassen.
Dem Admin stehen in Raum X viele weitere Befehle zur Verfügung
usw usf.
Bei einer Nachricht im Raum X, werden alle sich im raum befindlichen notified
Ein Admin, der in den letzten 10min von Aussen in den Raum geschrieben hat, wird auch benachrichtigt
Sollte Raum X entsprechend konfiguriert sein, werden alle im Raum befindlichen User, die in den letzten 15min nichts geschrieben haben, auch nicht benachrichtigt, oder weil meiner Kreativität keine Grenzen gesetzt sind: Werden diese doch benachrichtigt. Der Chattext soll aber durchgewürfelt bei Ihnen ankommen.
Ausserdem kann es sein, wenn die Räume verschachtelt exisitieren, dass parentRoom, seine Config an tiefer liegenden Raum weitergibt
Wie würdet ihr das objektorientiert umsetzen?
Prozedural ist das relativ einfach (auch wenn jetzt nur kurz shemenhaft angerissen und nicht alle constraints beachtet):
commandData=.....;
welcherRaum=commandData.raum
rconfig=getRaumConfig(welcherRaum);
if(rconfig.isAviableCommand(commandBlob)){abbort;}
switch(command)
{
commandBlob:
ip=....
userRight=......//lese aus der DB herauz welche Rechte der User hat
//.....
if(/*hier wird alles mögliche geprüft*/)
//hier werden die daten zubereitet
//und hier potentielle empfänger benachrichtigt und Nachrichten in Structs/Buffer/Datenbank eingetragen
//Also für Logging, oder im Falle dessen dass eine Nachricht nicht zugestellt werden kann, zum Neusenden
//usw
//..
}
Die Frage bei der objektorientierung ist, wie würdet ihr das ganze aufteilen, wo würde der Code stehen?
Entweder ich baue nen Manager aussen, ein Service der sich alle relevanten Daten holt und diese setzt und weitereicht(notify von den clients)....... das ist aber für mich dann eigentlich sehr prozedural (siehe meinen skizzenhaften Code)
Oder ich schreibe den Code in die Raumklasse?, müsste da aber alles von aussen reinreichen, den ganzen Kontext? (Ausserdem habe ich dann Coderedundanz, da ich vermutlich ähnlichen Code in einem anderen Raumtyp wiederholend schreiben müsste)
Und für den Fall, dass Bspw der User in Raum Y bereits 7 Nachrichten geschrieben hat, so darf er in Raum X gerade keine mehr schreiben, also auch an die Information muss ich irgendwie kommen. Ein ausstehendender Manager tut sich da sicher einfacher, aber ist eben eher prozedural.
Oder ich teile den Code irgendwie auf verschieden Klassen auf, aber wie?
Jetzt bin ich mal auf eure Modellierungen gespannt^^
Nur so aus Interesse, aber hast du jemals ein größeres OO-Projekt umgesetzt?
Nein tatsächlich nicht, bin Informatik Student^^
An der Uni lernt man aber kein gutes Coding.
Also wenn du nichts dagegen hast, könnten wir auch mal skypen/discorden/teamspeaken etc pp.
soweit mal wieder
lg knotenpunkt