Featured image of post PHPでTraitをより安全に実行するためにassertを使う

PHPでTraitをより安全に実行するためにassertを使う

Twitter ツイート Hatena Bookmark ブックマーク

再演@t_wadaさんのPHP7で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計を聞いて、本当に様々な発見がありました。

その中でもassertの使い方は本当に勉強になりました。(とはいえ、そんなにちゃんとassertの使い所を理解しているわけではありませんが・・・)

「発生した暗黙の前提をassertを使って評価式で書き、明示する」
これってtraitでも使えるんじゃないかなぁーなんて思うんですよね。

Traitは怖い

こんな実装があったとして、本当にcountUp()が実装されているの?って不安になるわけですよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php

class Counter
{
    private $count = 0;

    public function countUp(): int
    {
        $this->count++;
        return $this->count;
    }
}
1
2
3
4
5
6
7
8
9
<?php

trait OutputTrait
{
    public function output()
    {
        echo 'hello '. $this->countUp();
    }
}

assertを使って不安を取り除く

こんな感じにassertを使って「countUpメソッドが必要ですよ」と前提条件を明示することによって、より安全にTraitが使えるのかと思います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php

trait OutputTrait
{
    public function output()
    {
        assert(method_exists($this,'countUp'));
        echo 'hello '. $this->countUp();
    }
}

最後に

もっと良いやり方があるような気もしますが。
しかし、より安全にTraitを使うためにassertを使うのも良い気がします。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。