Vererbung oder Verschachtelung



  • Hallo zusammen, dies ist mein erster Eintrag!

    Ich bin Masch. Ing. und arbeite zur Zeit an einem Programm um die Trocknung eines Porösen Systems zu berechnen. Es sei gesagt, dass ich noch kein grösseres Software Projekt realisiert habe. Insbesondere nicht mit Objektorienten. Ich bringe also nicht wirklich Erfahrung mit... Mein momentanes Problem ist folgendes:

    Nehmen wir an, ich habe verschiedene Schwämme: steife, schwablige, stark poröse, schwere ect.
    Ich habe auch verschiedene Flüssigkeiten: Wasser, Alkohol, Benzin ect.
    Weiter gabe ich auch verschiedene Trockner: Lufttrockner, Rotationstrockner, Vakuumtrockner ect.

    Alles ist in einer Klasse definiert. Über Konstruktoren und Funktionen weisse ich die entsprechenden Eigenschaften zu. Nun, will ich natürlich einen Schwamm trocknen der mit einem bestimmten Fluid nass ist, und das in einem speziellen Trockner.

    Es ist klar, das der Schwamm und das Fluid irgendwie zusammen gehören. Also kein Schwamm ohne Fluid (gleichberechtigt). Und der Trockner steht irgendwie darüber (Schwamm-Fluid in den Trockner).

    Dann also meine Frage:
    Was wäre ein geeigneter Ansatz um das umzusetzen?
    Soll ich eine weitere klasse erzeugen um dann jeweils Schwamm und Fluid zu vererben oder zu verschachteln? Und dann dieses Objekte dem Trockner zu vermachen?





  • Hallo, so wie ich das verstehe ist double dispatch dazu da um zu entscheiden welche Funktion verwendet wird. Also ähnlich wie das Überladen von Funkionen?

    Das ist in meinem Fall aber nicht der Fall. Die Berechnungen sind immer die selben, nur Parameter ändern sich.



  • Double Dispatch hört sich hier schon nicht verkehrt an, geht in C++ aber eh nicht und alle Libs, die das simulieren bringen so viel Overhead und Boilerplate mit, dass es sich nicht lohnt.

    Versteh nicht so ganz, was du hier verschachteln willst, aber ich seh hier schon mal keine Vererbung.



  • Was spricht denn gegen:

    trockner.berechne(schwamm, fluid);
    

    Wenn du unbedingt willst kannst du auch Schwamm und Flüssigkeit in eine Klasse packen. Aber das macht, glaub ich, nicht so viel Sinn, da das erste was du dann in berechne() machen wirst, sein wird, schwamm und fluid wieder aus dieser Klasse wieder auszupacken.

    Vererbung hingegen ist eindeutig das falsche Werkzeug, denn ein Schwamm ist keine Flüssigkeit. http://de.wikipedia.org/wiki/Liskovsches_Substitutionsprinzip



  • Mechanics schrieb:

    Double Dispatch hört sich hier schon nicht verkehrt an, geht in C++ aber eh nicht und alle Libs, die das simulieren bringen so viel Overhead und Boilerplate mit, dass es sich nicht lohnt.

    Wozu Libraries? Einfach zwei einfache Dispatchers, wie beim Visitor-Pattern. Und so viel Overhead ist das nun auch wieder nicht.



  • Warum so kompliziert? Das mathematische Problem was du löst wird doch sicher in allen Fällen das gleiche sein, und erst recht das Verfahren.
    Welches Fluid, welche Porösität, und wie getrocknet wird ist doch sicher nurn Satz von Koeffizienten in den Gleichungen.

    Also programmier doch erstmal die Lösung des Problems an sich. Beim Setzen der Parameter kommen deine entsprechende Klassen ins Spiel.



  • Hallo zusammen,

    vielen Dank für eure Meinungen. Ich denke ich werde die Objekte nicht direkt verbinden, sonder sie so aufrufen wie mmazal es vorgeschlagen hat. Es ist evt. das einfachste die Strukturen flach zu halten.

    ScottZhang, nein, das ist eben nicht so einfach. Je nach Stroff (bspw. Silikate oder Solvate) ändert sich die Zahl der Parameter oder es kommen weitere Methoden dazu. Weiter soll später nicht nur ein "Schwamm" erzeugt werden, sondern mehrere (>1000) und deren Position im Trockner geändert werden um eine statistische Aussage zu ermöglichen. Mathematisch gesehen entsteht dann ein System vom mehreren, teils nicht linearen PDE mit DAE index grösser als 1 - und damit einhergehende numerische Probleme...


Anmelden zum Antworten