# Model-View-Controller - Darstellungslogik - Anwendungslogik



## clemson (14. Dez 2005)

sehr geehrte damen und herren 

ich entwickle derzeit gerade eine web-applikation mit struts. diese applikation verwaltet aufträge, welche wiederum auftragsgegenstände beinhalten...

in dieser applikation sind gewissen logiken eingebaut: ein auftrag hat 3 zustände (ausstehend - aktiv - beendet). will der benutzer einen auftragsgegenstand zu einem auftrag hinzufügen, so soll dies nur möglich sein, wenn der auftrag ausstehend ist.

ich zeige einen link auf die seite, wo der benutzer einen neuen auftragsgegenstand hinzufügen kann, bei der auftrags-detail seite an.

meine frage ist nun: wo muß eurer meinung nach die 'darstellungslogik' hin bzw. wo soll entschieden werden, ob der link angezeigt wird oder nicht? soll ich direkt in die jsp-seite schreiben, dass nur wenn der status des jeweiligen auftrags 'ausstehend' ist, der link angezeigt werden soll, oder soll ich beispielsweise eine klasse 'DarstellungsLogik' schreiben, welche statische methoden zur verfügung stellt (eine dieser methoden wäre zum beispiel: 
	
	
	
	





```
public static boolean isOrderItemAddable(String order_status)
```
) und diese methode wiedrum würde mir true zurückliefern, wenn der status eines auftrags 'ausstehend' ist... das problem bei der zweiten variante ist allerdings, dass ich ziemlich viele methoden schreiben müsste, allerdings wäre hierbei die gesamte 'darstellungslogik' in einer zentralen klasse definiert...


----------



## clemson (14. Dez 2005)

weiß denn keiner, wie ich das lösen könnte?

by the way, mir ist noch ein anwendungsfall eingefallen: auf der seite, wo die ganzen aufträge aufgelistet werden, soll es auch die möglichkeit geben, einen auftrag zu löschen. das soll allerdings nur besonderen benutzern vorbehalten sein (in meinem fall benutzer, welche die rolle "admin" besitzen --> wird in der session gespeichert). wo soll ich dann eurer meinung nach festlegen, ob der link zum auftrag löschen angezeigt wird?


----------



## bronks (14. Dez 2005)

Du gehst, für meinen Geschmack etwas merkwürdig vor.

Ich würde es so machen: Der o.g. Link wird immer angezeigt und der AuftragLöschen Button auch. Die Action welche sich dann um das verarbeiten des Formulars kümmert gibt, dann eine (Fehler)Meldung an den Benutzer aus. Dann weiß der Benutzer auch warum er etwas nicht machen kann.


----------



## clemson (14. Dez 2005)

bronks hat gesagt.:
			
		

> Du gehst, für meinen Geschmack etwas merkwürdig vor.
> 
> Ich würde es so machen: Der o.g. Link wird immer angezeigt und der AuftragLöschen Button auch. Die Action welche sich dann um das verarbeiten des Formulars kümmert gibt, dann eine (Fehler)Meldung an den Benutzer aus. Dann weiß der Benutzer auch warum er etwas nicht machen kann.



ja, das 'physikalische' absichern habe ich schon implementiert - dass eben nur bestimmte benutzer einen link ausführen können...

aber ich würde es halt gerne so machen, dass der link nur in bestimmten fällen angezeigt wird.

außerdem: in diesem forum werden bei den admins ja auch mehrere links angezeigt, als bei den 'normalen' benutzern oder? weiß da vielleicht jemand, wie das realisiert wurde?


----------



## Lim_Dul (14. Dez 2005)

Ich würde das wie folgt machen: Ein Auftrag hat zu wissen, ob ihm was hinzugefügt werden kann.

Also sollte die Klasse Auftrag eine Methode haben public boolean isSomethinAppendable() (Oder so ähnlich )

Dann kannst du bei der Ausgabe diese Eigenschaft abfragen und danach entscheiden, was du ausgibst.


----------



## clemson (14. Dez 2005)

oke, das wäre ein vorschlag. allerdings gibt es da auch fälle, wo diese logik nicht unebdingt zur auftrags-klasse passt... nämlich dann, wenn nur bestimmte benutzer einen link zur verfügung gestellt bekommen sollen...

da würde sich auch anbieten, eine allgemeine klasse ViewLogic oder so zu basteln, welche dann die darstellungslogik beinhaltet.

die frage die sich jetzt nur stellt ist die, ob das so die optimalste lösung ist oder nicht... weiß den jemand wie das bei den ganzen foren geregelt wird?


----------



## Lim_Dul (14. Dez 2005)

Forencode kenn ich jetzt nicht.

Aber bei Usern würde es doch auch passen, dass da die Userklasse, was weiß?

Sprich, wenn ein Link nur Admins zur verfügung gestellt wird, dann wird halt abgefragt user.isAdmin();

Irgendeinen Grund muss es ja geben, warum X mal angezeigt wird und mal nicht. Und dieser Grund ist ja meistens abhängig von einer Eigenschaft eines Objektes. Warum soll die View diese Eigenschaft nicht abfragen dürfen?

Bei den Aufträgen kam ja die Logik hinzu, dass die Frage, ob man was hinzufügen kann, vom Status des Auftrages abhängig ist. Das ist meines erachtens durchaus eine Eigenschaft des Auftrages, ob was hinzugefügt werden darf. Dieses Mapping gehört in den Auftrag und nicht in View. Andere Mappings können meines Erachtens aber durchaus auch in die View gehören.  Ist halt eine Fall zu Fall Entscheidung.


----------



## bronks (14. Dez 2005)

clemson hat gesagt.:
			
		

> ... aber ich würde es halt gerne so machen, dass der link nur in bestimmten fällen angezeigt wird.


Lösungsvorschlag für Deinen Wunsch: Steck der JSP aus der Action Informationen darüber zu, was nicht angezeigt werden soll und werte das mit den Logic-Tags aus.


----------



## clemson (14. Dez 2005)

hmm, danke erstmals für eure lösungsvorschläge und ratschläge! ich werd mir das noch mal genauer überlegen, wie ich das ganze machen werde...


----------

