Frage

Ich arbeite jetzt mit Code, der wie folgt aussieht

public String getName(User user) {
     user.setSth(...);
     return user.getName();
}

Ich denke, es ist eine schlechte Praxis ist Objekte zu ändern, als Parameter übergeben. Gibt es ein Tool, das diese Art von Code erkennt? Ich sah findbugs, pmd und check, konnte aber nicht alle Prüfungen für diese finden.

P. S. sorry für schlechtes Beispiel.

War es hilfreich?

Lösung

Ich glaube, Sie sind schon auf dem richtigen Weg: Ihr bestes Werkzeug, um diese Art von Code zu erkennen, ist mit ziemlicher Sicherheit Findbugs . Allerdings werden Sie wahrscheinlich Ihre eigenen Detektor für dieses Muster schreiben müssen. Hier ist ein Beispiel ist, wie Sie einen Detektor schreiben würde, obwohl es isn ‚t genau der Detektor, die Sie suchen.

Caveat : Ich weiß wirklich nicht darüber einig, dass ein Neben Bewirkung Getter immer schlechter Stil ist. Wenn Sie jedoch wirklich so etwas finden wollen, würde ich Findbugs empfehlen.

Andere Tipps

Sie werden nichts finden, da aus Sicht des Werkzeugs „getName“ und „setSth“ sind nur Methodenaufrufe. Die Menschen sagen: „Das ist ein Getter“ und „dies ist ein Setter“, sondern Werkzeuge nicht. In der Tat, getName () ist kein Getter weil Getter keine Argumente akzeptieren.

So kann das Werkzeug nichts sehen ungewöhnlich, weil Methoden ändern die ganze Zeit Objekte.

Wenn Sie diese Regel erzwingen möchten, werfen Sie einen Blick auf die Erweiterung findbugs und PMD. Beide können Sie zusätzliche Einschränkungen definieren. Was Sie suchen ist wahrscheinlich:

  • Wenn Methodenname beginnt mit "get"
  • UND Methode Körper ruft Methode eines Objekts übergibt als Parameter

dann wird eine Warnung ausgegeben. Das sollte nicht zu lange dauern. Führen Sie diese und Sie werden sehen, wie viele „false positive“ Sie (Warnungen über Methoden, die tatsächlich in Ordnung sind) erhalten. Dies wird Ihnen helfen festzustellen, ob es lohnt sich dies weiter zu verfolgen. Plus Sie einen neuen Artikel müssen Sie Ihren Lebenslauf hinzuzufügen:)

Sie könnten User unveränderlich machen (erklären es final, erklären alle Eigenschaften final und die Setter-Fernbedienung. Ich weiß, dass nicht überall praktikabel, aber an vielen Stellen, was gut ist, und Sie werden keine Probleme haben, beiläufig, dass auf andere Funktionen) .

Wenn Sie auf „Ändern“ etwas, Sie Funktionen wie newId in dieser Probe umsetzen können:

public final class User {
    private final String name;
    private final int id;

    User(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public User newId(int newId) {
        return new User(this.name, newId);
    }

    //getters here;
}

Der eingebaute String, Integer, ... Klassen tun das auch.

Sie können eine Schnittstelle erstellen namens Userview nur „Getter“ enthält, machen es Benutzer implementieren und die neue Userview-Schnittstelle als Parametertyp verwenden.

interface UserView{
 public String getName();
...

class User implements UserView...

public String getName(UserView user) {
     user.setSth(...); // Will not compile
     return user.getName();
}

Eigentlich ist dies etwas, das in C ++ war sehr einfach über die const Qualifier zu tun. Sie würden einen Parameter als const definieren und für diese Parameter können Sie nur Methoden wie const definiert nennen -. In der Regel, Getter

In Java dies nicht vorhanden ist und ehrlich gesagt, ich habe nichts dagegen nicht wirklich. Wie bereits erwähnt gibt Quellcode-Analysatoren sind, die dieses Verhalten überprüfen, sowie Meta-Programmierung Methoden, dies auch zu tun.

Ich persönlich glaube, dass , wenn die Methode richtig benannt ist, gibt es kein Problem, ein Objekt, um es vorbei, so dass es geändert wird.

Es gibt Werkzeuge, die können „Vernunft“ über Code auf einem höheren Niveau als Compiler normalerweise tun. Deklarative Metaprogrammierung zum Beispiel ist eine Disziplin, die das Schreiben von Programmen ermöglicht zu prüfen, ob ein anderes Programm zu einem bestimmten Design entspricht, oder umgekehrt, um mich für Code riecht und anti-Muster.

Einige Verbindungen:

http://prog.vub.ac.be/DMP/

http://www.cs.bris.ac .uk / Publikationen / pub_master.jsp? id = 1000273

und für den Rest

http://www.google.com/search?num = 100 & hl = en & q = deklarative + Metaprogrammierung

Sie suchen nach etwas wie „const“ in C ++, die als Referenz machen den Parameterwert als unveränderlich wird erzwingen, die in übergeben wird. Unveränderliche Objekte garantieren, dass, wenn Sie mit ihnen leben können.

Sie argumentieren, dass dies „schlecht“ ist, da Nebenwirkungen wie diese einen Benutzer überraschen kann. Das ist gültig, aber es ist nur schädlich, wenn es eine unerwünschte Überraschung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top