it-swarm.com.de

Sollte sich ein Merkmal auf übergeordnete Methoden beziehen?

Ist es ein Codegeruch, wenn sich die Methoden in meinem Merkmal auf parent:: Methoden beziehen oder auf Methoden, von denen angenommen wird, dass sie in der using-Klasse sind?

Ein zufälliges (sinnloses) Beispiel

trait foo
{
    public function bar()
    {
        return parent::bar() . 'baz';
    }

    public function format($text)
    {
        $format = true;
        return $this->parse($text, $format);
    }
}

Sollen diese Methoden in die Implementierung class verschoben werden?

Sollte ich ausschließlich Methoden ohne Abhängigkeiten innerhalb eines Merkmals haben?

9
Kamafeather

Es ist in Ordnung, wenn ein Merkmal von den Methoden in der Klasse abhängt, in die es eingebettet ist. Diese Abhängigkeiten sollten jedoch explizit sein, indem ein abstract function . PHP kann dann überprüfen, ob eine solche Methode tatsächlich existiert.

Merkmale sollten jedoch Methoden nicht außer Kraft setzen. Das ist ziemlich verwirrendes Verhalten. Geben Sie den Methoden im Merkmal stattdessen einen anderen Namen. In diesem Beispiel verlassen Sie sich auf eine Methode in der Basisklasse der Klasse, in die Ihr Merkmal eingebettet ist. Das ist eine sehr dunkle Abhängigkeit. Vergleichen Sie das Vorrangbeispiele in den Dokumenten .

Warum nicht stattdessen abstrakte Klassen verwenden? Weil Sie mehrere Eigenschaften haben können, aber nur eine Basisklasse. Daher sind Merkmale allgemeiner und nützlich für ein Bündel von Komfortfunktionen, die Sie in mehreren Klassen verwenden möchten. Ihre format -Methode ist ein gutes Beispiel dafür. Klarer geschrieben wäre es:

trait Formatter
{
    abstract public function parse($text, $format);

    public function format($text)
    {
        $format = true;
        return $this->parse($text, $format);
    }
}
12
amon

Ja, es ist ein Codegeruch. Wenn ein Merkmal verwendet wird, um Code portabler zu machen, dann macht diese Art von Dingen ihn weniger portabel. Du solltest es nicht tun. Ohne ein konkreteres Beispiel scheint es so, als ob Sie diese Balkenmethode abstrakt setzen und erweitern sollten. Dieser Ansatz vermeidet den potenziellen Laufzeitfehler, bei dem das Merkmal einer Klasse ohne Balken hinzugefügt wird.

7
zquintana