1

私は Object Calisthenics について読んでいましたが、ルールの 1 つはプリミティブ型と文字列をラップしていました。

class UIComponent {

    public function repaint($animate = true)
    {
     // 
    }

}

$component->animate(false);

になります:

class UIComponent {

    public function repaint(Animate $animate)
    {
     //
    }
}

class Animate {

    private $animate;

    public function __construct($animate = true) 
    {
        $this->animate = $animate;
    }
}

$component->animate(new Animate(false));

この手法を使用すると、どのような利点が得られますか? 私の意見では、物事が複雑になり、コード行が追加されただけだと思います。

4

2 に答える 2

4

この場合、少し大きすぎるのは事実ですが、それが理にかなっている例は他にもあります。

class Identifier {
  protected $id;
  public function __construct ($id) { 
    if (!preg_match('~^{a-z0-9]$~i', $id)) throw new Exception("Invalid id '$id'");
    $this->id = $id;
  }
  public function getId () { return $this->getId(); }
}

したがって、これは不変であり、特定の形式を保証します。別のクラス内でこのクラスに対してタイプヒントを入力する場合、識別子が有効かどうかをテストする必要はありません

class MyClass {
  protected $id;
  public function __construct (Identifier $id) { $this->id = $id; }
}

これは単なる例であり、実際には PHP ではそれほど一般的ではありません。

[..]さらにコード行を追加しました。

「コードの行数を増やす」こと自体が悪いとは思いません。読みやすくきれいなコードを書くために、より多くの行 (またはクラス) が必要な場合は、コンパクトで読みにくいものよりもはるかに優れています。

于 2012-12-23T13:06:38.187 に答える
1

新しい開発者 (または、最後にプロジェクトに触れてから 1 年後の自分) が最初の例のコードを読んでいると想像してください。

$component->repaint(false);

メソッドの定義にジャンプしたり、メソッドのドキュメントを読んだりしない限り、メソッドの動作に関してそれが何を意味するのrepaint()かを知る方法はまったくありません。falseつまり、文字通り「repaint false」と表示されているので... 再描画しますが... 実際には再描画しませんか? 意図が不明で、それは悪いことです。

この非常に単純な例は、プリミティブをラップすることでコードの可読性を大幅に向上させる方法を示しています。単純な検証を焼き付けたり、自分自身を別のインスタンスと比較したりするなど、ほんの少しの動作を追加し始めたい場合、利点はさらに大きくなります。

このような小さな小さなオブジェクトを新たに作成することによるパフォーマンスへの影響については、まったく心配する必要はありません。「より多くのコード行」については、なぜそれが悪いのですか? SRP はほとんどの場合、「より多くのコード」をもたらしますが、クリーンで読みやすく、保守しやすいコードです。

于 2015-10-16T16:32:40.437 に答える