Frage Abspielen! Framework verwendet ein von Statik


Waaah, das Spiel! Framework hat so viele statische Methoden. Wo ich zur Schule gehe, wurde uns gesagt niemals um irgendwelche Statiken zu benutzen, spielen Sie doch! benutzt es, als gäbe es kein Morgen. Ist das irgendwie in Ordnung? Wenn ja warum?

Wir (7 Personen und ich) planen das Play! Rahmen für ein Projekt mit einer Web-App. Wir haben uns entschieden, es mit Play zu machen! Da es ziemlich spaßig zu machen ist, kennen wir alle Java und die Aufgabe ist ziemlich schwer, deshalb wollten wir uns auf die eigentliche Aufgabe konzentrieren und nicht lernen, wie man in einer anderen Sprache programmiert.

Uns wurde jedoch immer gesagt, NIEMALS "Static" in jedem von uns entwickelten Java-Programm zu verwenden, aber wenn ich Play ansehe! ... Nun, ungefähr die Hälfte der Methoden ist statisch. </ Übertreibung>

Ich denke, zumindest könnten wir Singleton-Objekte verwenden (mit Scala, zum Beispiel ^^), um unser Projekt zu programmieren, aber ich bin ziemlich besorgt, wie viele Statiken es tatsächlich im Framework selbst gibt.

Also, sollte ich darüber besorgt sein? Hat den Weg des Spiels! Entwickler programmiert es so, dass all diese Statiken kein Problem darstellen?

(Beispielsweise, Dieser Thread hat eine Tirade darüber, warum statische Elemente um jeden Preis vermieden werden sollten.)


76
2018-03-04 11:06


Ursprung


Antworten:


Play verwendet statische Methoden nur, wenn es sinnvoll ist:

  • in der Controller-Schicht, weil Controller nicht objektorientiert sind. Controller fungieren als Mapper zwischen der HTTP-Welt (dh zustandslos und auf Anforderung / Antwort basiert) und der Model-Schicht, die vollständig objektorientiert ist.
  • in der Modellschicht für Factory-Methoden wie findAll (), count (), create (), die natürlich nicht von bestimmten Instanzen abhängen
  • in einigen play.libs. * Klassen, die rein Dienstprogramm Funktionen zur Verfügung stellt

95
2018-03-04 12:31



Play framework ist keine gute Demonstration, wenn die Verwendung von Statik angemessen ist, noch beweist es, dass dein Lehrer falsch lag. Spielen ist eine Art Betrug, löst die Probleme der Statik außerhalb der Java-Sprache.

Das Hauptproblem besteht darin, dass Sie mehrere HTTP-Anforderungen parallel verarbeiten müssen und statische Felder "global" sind. Daher benötigen Sie für bestimmte Dinge eine Instanz pro Thread (oder besser noch eine Instanz pro HTTP-Anfrage). Einige dieser Dinge werden jedoch von statischen Methoden in Play zurückgegeben. Das funktioniert, weil Play! Verwendet ThreadLocal-s schwer, und so löst es ein Problem der Statik außerhalb der Java-Sprache. Aber das ist nicht alles. Einige sagen, dass Controller-Methoden zu Recht statisch sind. Klar, aber im einfachen Java wäre es unbequem, denn dann können Sie nicht auf anforderungsspezifische Daten zugreifen, ohne irgendeine Art von Präfix, wie z req. im req.sessionund dann musst du immer noch kommen req von irgendwo, als ein Parameter der statischen Controller-Methode, die noch mehr Aufwand ist. In Play kannst du einfach direkt schreiben session und so, sie sind nur statische Felder. Das liegt daran, dass Play die Bytecode-Instrumentierung verwendet, um all diese statischen Feldreferenzen auf etwas Intelligenteres zu ändern. Wiederum eine Lösung außerhalb der Java-Sprache. Das sind keine statischen Felder am Ende.

Also, im Allgemeinen vermeiden Sie nicht endgültige Statik. Spielen tut die Magie für Sie, also haben Sie keine Angst vor ihnen in diesem Fall.


34
2017-08-04 19:15



Von einem sehr kurzen Blick würde ich sagen, dass es einen Sinn ergibt: Web-Anfragen sind staatenlos, also da ist kein Objekt, um die Anfrage zu erhalten (= die Methode). Also, ein URI wie "/ articles / archive? Date = 08/01/08 & page = 2" auf eine statische Methode namens archive() Ich schätze, Ihre Anwendungsklasse macht Sinn.


15
2018-03-04 11:12



BEARBEITEN Jetzt in Play 2.4, Die Injektion wird automatisch gemacht. Fügen Sie einfach @ am Anfang des Controllerpfads in der Datei hinzu routes wird den Trick machen:

GET     /                  @controllers.Application.index()

Für ältere Versionen (2.1 bis 2.3) müssen Sie getControllerInstance in der globalen Klasse überschreiben, wie in der Dokumentation.


8
2017-12-14 01:59



Wie bei allem in der Programmierung, niemals ist nie die richtige Antwort. So wie immer. Es gibt immer Ausnahmen und die richtige Antwort ist immer "es kommt darauf an".

Es ist wahr, dass es in reinem OO (wofür ich eigentlich bin) sehr wenig Platz für Statik gibt. Aber es stimmt auch, dass sie manchmal nur Sinn ergeben.

Das klassische Beispiel sind Hilfsmethoden. Sicher, es wäre besser, wenn wir nur unsere anhängen könnten abs() Methode zu Ganzzahl. Aber wir können nicht; also sind wir festgefahren Math.abs(int i).

Ich denke, es ist nur richtig, eine Methode statisch zu machen, wenn sie nichts mit der Instanz selbst zu tun hat. Zum Beispiel in einer Klasse PersonSie können eine Methode verwenden, die eine Liste von Personen erstellt und die Anzahl der Personen zurückgibt, die heute einen Geburtstag haben. Vielleicht können Sie nur selbst in der Klasse dies tun, wenn die erforderlichen Daten für die Berechnung zu tun ist privat (etwas ein OO Purist würde verstehen;)), aber immer noch die Methode hat eindeutig keinen Bezug auf eine einzelne Person-Instanz.

Eine andere Sache sind interne Klassen. Häufig möchten Sie sie statisch machen, wenn Sie die Beziehung mit dem enthaltenden Typ nicht benötigen.

ich habe noch nie gesehen Abspielen! Aber wenn Sie sagen, dass über 50% davon statisch sind, dann vermute ich, dass es wahrscheinlich schlecht entworfen wurde. Das ist keine Ausnahme; viele Frameworks sind. Lass dich nicht unterkriegen. Definitiv nicht davon lernen!
Aber wenn es funktioniert, kannst du es trotzdem benutzen.


5
2018-03-04 12:11



Das Hauptproblem ist, dass statische Methoden nur Zugriff auf andere statische Methoden und Felder, die in ‚statisch haft‘ ergibt, wobei die statischen Methoden mit dem Rest der Anwendung zum Rendezvous haben (was seine Mitarbeiter enthält) über gemeinsamen statischen Bereich (e) , was zur Inflexibilität führt.

Disclaimer: Ich weiß nicht viel über 'play!'


4
2018-03-04 11:41



Statische Controller-Methoden sind sicherlich ein Problembereich beim Play! Rahmen, und nachdem ich einige Tests gemacht habe, ist es der Hauptgrund für mich, Play nicht zu machen! in Projekten. Sie können das tatsächlich sehen, wo in FOSS-Projekten wo spielen! wird eingesetzt. Es gibt wenig oder keine Controller-Tests. Der Grund, mit statischen Methoden, DI wird schwierig. Hier sollten sie noch mehr Zeit mit ASP.NET MVC verbringen, von wo aus Play! braucht schon ein bisschen Inspiration.

Normalerweise haben Sie einen Konstruktor wie folgt:

public HomeController( IService service ) {
   _service = service;
}
public Index() {
   var data = _service.getData();
   return View( data );
}

Dann verwenden Sie DI, um die IService-Implementierung in den Controller zu injizieren. Der Punkt ist, dass Sie in Ihren Tests den IService kurz vor dem Ausführen des Controllers instanziieren und dann das Ergebnis basierend auf dem gerade erstellten IService testen können.

Im Spiel wird das sehr schwierig. Somit wird der Test der Controller-Einheit schwierig. Das ist für mich ein bedeutendes Problem. Ich würde daher eher nach anderen Frameworks als Play suchen! in der Java-Welt. Heck, warum nicht mit dem Original gehen und nur JRuby verwenden?


4
2017-10-29 12:36