Wie WAM richtig umsetzen?



  • Hallo,
    sicherlich habt ihr schon mal von dem WAM-Ansatz (Werkzeug Automat Material) gehört.
    Falls nicht:
    Man filtert sämtliche Objekte, die man zum programmieren verwendet unter verschiedenen Gesichtspunkten:

    Material:
    - Diese Objekte stellen fachlich das Material dar. Zum Beispiel die Klasse Person
    - besitzt verschiedene Attribute

    Werkzeug:
    - Diese Objete dienen ausschließlich zur Berabeitung von Materialien /können eine Zustandsänderung herbei führen
    z.B.
    Berechnen des aktuellen Alters einer Person

    Automat:
    - Diese Objekte vollziehen immerwiederkehrende Aufgaben/Schleifen
    - Berechnen des Alters vieler Personen (kann also auch das Werkzeug aufrufen)

    Ich habe nun versucht diesen Ansatz mal umzusetzen und stoße immer wieder auf das Problem, dass ich dem Material ziemlich "in die Eier greifen muss" (sehr ugs, aber ich glaube ihr wisst was ich meine) 😃 .

    Wenn ich zum Beispiel das Alter der Person berechnen will, muss ich mir erst das Geburtsjahr der Person liefern lassen. Normalerweise sollten ja Objekte ihre Eigenschaften kapseln aber genau das wir hierbei ja komplett aufgelöst. Oder kann man das elegant anders mit dem WAM-Ansatz lösen?

    Viele Grüße

    Micha



  • Der Ansatz wirkt inkomaptibel mir objektorientierter Programmierung. Der stammt wohl noch aus der prozeduralen Zeit.



  • Du irrst, das scheint sogar sehr modern zu sein- google mal danach.
    Diese herangehensweise, soll helfen Klassen zu identifizieren.



  • So nebenbei: Ich finde gut, dass du deine Abkuerzung ausgeschrieben hast. Habe zuerst an http://en.wikipedia.org/wiki/Warren_abstract_machine gedacht.



  • Danke für den Hinweis. Kannte das andere WAM gar nicht...

    Weiss wer, ob diese Verwendung der inneren Attribute überhaso gewollt ist und ob ich diesen Ansatz überhaupt richtig verstanden habe?



  • Was haltet Ihr von der folgenden herangehensweise (obiges Beispiel):

    Die Klasse Person erhält eine Methode getAlter() und die ruft intern die statische Werkzeugklasse auf mit dem Parameter des Geburtsdatums. Im Endeffekt Kapselt damit die Person weiterhin ihre Daten und gibt nur die Daten preis, die benötigt werden.

    Natürlich ist das hier ein sehr triviales Beispiel- in meinem Beispielprojekt stand ich aber sehr häufig vor diesem Problem.



  • GastKoern schrieb:

    Was haltet Ihr von der folgenden herangehensweise (obiges Beispiel):

    Die Klasse Person erhält eine Methode getAlter() und die ruft intern die statische Werkzeugklasse auf mit dem Parameter des Geburtsdatums.

    Nix.

    Im Endeffekt Kapselt damit die Person weiterhin ihre Daten und gibt nur die Daten preis, die benötigt werden.

    Ne, im Endeffekt hast du jetzt drei Aufgaben vermischt:

    * Das Halten von Daten (Person: Name, Geburtsdatum, ...)
    * Das Ermitteln des aktuellen Datums
    * Das Berechnen der Zeitspanne die zwischen zwei Daten liegt

    Davon abgesehen hast du der Person ein Attribut verpasst, was ich einfach mal so ändert wärend das Programm läuft. Was allgemein auch keine gute Idee ist. Zusätzlich zwingt es dich ein Singleton zu verwenden - vollkommen unnötigerweise. (Mal ganz davon abgesehen dass "get current time" und "get date difference" beides Funktionen sind, die man nicht wirklich in Klassen packen muss, nur weil Klassen ja so furchtbar Kuhl (tm) sind)

    Das WAM Modell (welches ich übrigens noch nicht kannte) macht bei diesem Beispiel schon Sinn.

    Und ich verstehe auch nicht ganz wieso du das Geburtsdatum der Person "verstecken" willst. Kannst du mir den Sinn erklären?



  • Vielen Dank für die Antwort.
    Wie würdest Du das ganze umsetzen?
    Einfach die Altersberechnung in die Person packen, oder die Person als Material an das Werkzeug geben und mittels getter alles auslesen was ich brauche?

    Das aktuelle Alter möchte ich nirgends speichern- das wird bei jeder Abfrage erneut berechnet. Die Methode person.getAlter() greift auf ihr Geburtsdatum zu und ruft damit die Werkzeugklasse (tool.calculateAlter(geburtstDatum) ) auf. Darin wird das aktuelle Datum ermittelt und dadurch das Alter berechnet. Das Resultat wird dann zurückgegeben.
    Daten und Logik bleiben also getrennt, wobei ersteres in in der Person (also Material) bleibt und zweiteres im Werkzeug.

    Welche Klasse würdest Du als Singelton verwenden? Das Werkzeug würde ich einfach statisch machen. Gibt es Deiner Meinung nach einen Vorteil, wenn ich sie als Singelton verwende? Attribute braucht dieses Werkzeug ja nicht.

    Hmm warum ich das Geburtsdatum verstecken will, weiss ich auch nicht so richtig-irgendwie sagt mir mein Gefühl, dass es zu einfach ist mit person.getGeburtstag() die Attribute auszulesen. Vielleicht auch aus der Angst, dass ich bei größeren Projekten mit Hilfe der ganzen getter und setter den Überblick verlieren würde und dadurch implizit alle Attribute public mache.

    Ich weiss, dass dieses sehr einfache Beispiel dadurch echt aufgebläht wird, und dass es ne Kanone ist, die auf nen Spatz schießt.
    Würde die korrekte Anwendung dieses Ansatzes nur gerne verstehen.

    Vielen Dank für Eure Hilfe

    VG Micha



  • Das Ganze kommt auch immer stark auf den Kontext an. Das Alter ist ja z.B. auch immer ortsabhängig, je nachdem wie ich durch die Zeitzohnen jette, kann ich auch wieder ein Jahr jünger werden.
    Oder je nach Anwendung kann es nützlich sein, das Geburtsdatum neu setzen zu können. In einigen Ländern kennen die Leute ihres gar nicht und wollen es nach dem Mathestudium vom 1.1. auf irgendein Primzahldatum umlegen lassen. Oder beim Amt ist mein G.D. falsch eingetragen, ich gehe mit meiner Geburtsurkunde hin und lasse es korrigieren.
    In anderen Anwendungsfällen mag das alles egal sein, da gibt's ein unveränderliches G.D. und das Alter wird nur lokal berechnet.



  • Das aktuelle Alter möchte ich nirgends speichern- das wird bei jeder Abfrage erneut berechnet.

    Natürlich speicherst du das Alter nicht

    Die Methode person.getAlter()

    ...gibt es im Idealfall nicht.
    Die Altersberechnung ist entweder eine freie Funktion, oder Teil eines "Werkzeugs".

    Welche Klasse würdest Du als Singelton verwenden?

    Gar keine.

    Gibt es Deiner Meinung nach einen Vorteil, wenn ich sie als Singelton verwende? Attribute braucht dieses Werkzeug ja nicht.

    Klar gibt es einen Vorteil, da man nicht erst irgendwoher eine Instanz zaubern muss. Wenn etwas aber ganz klar keinen Internen Zustand hat, dann sollte es IMO auch keine Klasse sein. Womit sich die Frage Singleton oder nicht erübrigt.

    Hmm warum ich das Geburtsdatum verstecken will, weiss ich auch nicht so richtig-irgendwie sagt mir mein Gefühl, dass es zu einfach ist mit person.getGeburtstag() die Attribute auszulesen.

    Is doch schön wenns mal einfach ist.

    Vielleicht auch aus der Angst, dass ich bei größeren Projekten mit Hilfe der ganzen getter und setter den Überblick verlieren würde und dadurch implizit alle Attribute public mache.

    So allgemein lässt sich schwer etwas dazu sagen. Einen Getter für das Geburtsdatum einer Person halte ich auf jeden Fall für unproblematisch.

    Ich weiss, dass dieses sehr einfache Beispiel dadurch echt aufgebläht wird, und dass es ne Kanone ist, die auf nen Spatz schießt.
    Würde die korrekte Anwendung dieses Ansatzes nur gerne verstehen.

    Ich kenne wie gesagt diese WAM-Geschichte nicht, ich kann dir nur sagen wie ich etwas implementieren würde. Und das auch nur anhand von konkreten Beispielen.


Log in to reply