Persönlich würde ich Option 2 verwenden. Obwohl ich weiß, dass es sehr gut möglich ist, das Problem mit EL zu lösen und mithilfe von Funktionen oder ui: params ein wenig Wiederverwendung in xhtml-Dokumenten zu erreichen, scheint es wirklich an Portabilität, Wartbarkeit und Testbarkeit der Java-Bean-Implementierung zu mangeln.
Wenn ein Entwickler sowohl EL als auch Java fließend beherrscht und sowohl die xhtml- als auch die Java-Beans besitzt, erscheint es nicht sinnvoll, EL für JEDE bedingte Bewertung mit einer Größe> 1 zu verwenden.
Die Implementierung auf der Java-Seite scheint einfach zu viele Vorteile zu haben:
- Möglichkeit, sich auf den IDE + -Compiler zu stützen
- Verwenden Sie Konstanten oder Aufzählungen (für "Hund" und "Rinde"). Möglicherweise werden sie auch an anderer Stelle im Code für Vergleiche verwendet. Wenn sich der String-Wert ändert, macht es wirklich Spaß, jedes Vorkommen manuell zu ersetzen Codebasis
- Anstatt mit den entsprechenden Daten zu der betreffenden Seite navigieren zu müssen, kann ich mithilfe von Komponententests Logik üben
Eines der Hauptargumente, die ich (außerhalb von Stack) für Option 1 gehört habe, ist:
"Es ist viel einfacher zu erkennen, wann eine Komponente gerendert wird, wenn Sie diese Logik in der Ansicht behalten."
Ich habe festgestellt, dass dies für eine Anwendung in der Anfangsphase ihres Lebens der Fall sein könnte, in der sie leichter und weniger kompliziert ist. Die Anwendung dieser Praxis in größerem Maßstab und wenn eine kleinere Anwendung reift, kann jedoch dazu führen, dass ein Rattennest von Bedingungen erhalten bleibt und ein Albtraum wird. Hier sind einige Beispiele, die denen ähneln, die ich in freier Wildbahn gesehen habe:
<h:outputText value="grrr"
render="#{animal.type == 'dog' or animal.type == 'cat' or animal.type == 'horse'
or animal.type == 'pony' or animal.type == 'mule' or animal.type == 'lion'
or animal.type == 'tiger' or (animal.type == 'bird'
and animal.subType == 'macaw') or .... continue this for another line or two}"
/>
Oder mein Favorit, der mehrere Komponenten mit Renderbedingungen verwendet, die sich gegenseitig ausschließen, um die verschiedenen Werte darzustellen, die angezeigt werden könnten:
<h:outputText value="grr" render="#{theMonstrosityFromPreviousExample} />
<h:outputText value="cry"
render="#{animal.type == 'human' and animal.subType == 'baby'}" />
<h:outputText value="yo"
render="#{animal.type == 'human' and animal.subType == 'teenager'}" />
<h:outputText value="hello"
render="#{animal.type == 'human' and animal.subType == 'adult'}"/>
Können bis zu 4 Texte gleichzeitig angezeigt werden? Auf den ersten Blick kann man nicht sagen, dass eine Überprüfung jeder Bedingung erforderlich ist. Als Randnotiz stelle ich fest, dass dieses Beispiel auch ein schlechtes Design ist, da diese in ac gesetzt werden könnten: wählen ... aber ich habe das schon einmal gesehen.
Letztendlich ist dies theoretisch immer noch eine "Ansicht" -Logik, da sie bestimmt, was tatsächlich angezeigt wird, sodass es ein konzeptionelles Argument gibt, das im xhtml enthalten sein sollte. Das Problem, das ich festgestellt habe, ist, dass das Einfügen einer solchen Logik in die Ansichtsvorlage das Layout auf lange Sicht viel schwieriger verständlich machen kann, und ich habe noch nicht gesehen, dass diese Methode zur Lösung des Problems einen echten Vorteil gegenüber der Verwendung von Java bietet Bean-Implementierung.
barking animals
würde ich diese Methode natürlich aufrufen, da sie bereits existiert. Wenn es sich um eine Ansichtslogik handelt, die Sie an mehreren Standorten verwenden, können Sie daraus eine el-Funktion erstellen.