1

コンストラクターの引数によって応答が異なるクラスがある場合、そのクラスの仕様をどのように記述しますか?

class Route
{
  function __construct($url, array $methods = array())
  {
    // stores methods and url in private member variables
    // creates a regex to match $url against incoming request URLs
  }

  public function isMatch($url)
  {
    // checks if the incoming request url matches against this url
  }
}

使用例:

$a = new Route('/users/:id');
$a->isMatch('/users/1') // returns true;
$b = new Route('/users');
$b->isMatch('/users') // returns true

phpspec の let 関数を使用して、このクラスの仕様を設定すると、次のようになります。

class Route extends ObjectBehaviour
{
  function let() 
  {
    $this->beConstructedWith('/users/:id')
  }
}

私の仕様では、このクラスの動作がいずれかのケースで機能するかどうかのみを確認できます。

これをテストできるようにセッターメソッドを追加することを検討しましたが、テストのためにカプセル化を破っているようです。

私はこれに触れるものを見つけるのに苦労しているので、おそらくこれは悪いコード臭の状況であると考え始めています.

4

2 に答える 2

1
  1. コンストラクターは、ここでメンバー プロパティに設定される変数を取得するためにのみ使用する必要があります。ここでこれ以上のロジックを実行する必要はありません...
  2. ポイント 1 のアイデアに従って、次に何が起こるかを決定する別のロジックがあるはずです (例:if Object->hasProperty(X) then do x()など)。
  3. そうすれば、コメントは単純明快になります。

例:

class Route
{
    private $url;
    private $methods = array();

    /**
     * Constructor method, sets the attributes to private member variables
     * @param string $url URL pattern
     * @param array $methods Methods that should be used with given URL
     */
    function __construct($url, $methods = array())
    {
        $this->url      = $url;
        $this->methods  = $methods;
    }

    // ...

}
于 2013-04-24T13:35:24.600 に答える