DoctrineのEntityのgetter、setterをやめてみたお話。

DoctrineのEntityのgetter、setterをやめてみたお話。

November 18, 2016,
tags: doctrine2 symfony php


このエントリーをはてなブックマークに追加

こんばんはポリドックです。
今日も元気にSymfonyにを書いています。

さて、今日はTwitterでこんなツッコミをされてしまったので、軽くまとめてみようと思います。

そもそもなぜGetter/Setterをやめたかったのか?

「必要なくね?」って激しく思った。ただそれだけです。

privateでプロパティを定義してgetter/setterを用意するなんて、ほとんど意味がないことだと僕は思うんですが、違うんですかね?

Getter/Setterをやめたメリット

コードを書く量が減る

$hoge->getUser()->getId();

ってのは

$hoge->user->id

ってなるのは書きやすさ全然違いますよね。
そんなSyntaxの話はどうでもいいとか、本質的じゃないって話はよくわかっています。
でも・・・ちょっとでも書く量が減ると嬉しいんですよね。

今現在、書くコード量が多い僕としては十分なメリットです。

可読性が上がる

Entityが本当に見やすくなります。
定義するメソッドが少なくなり、すっきりするんですよね。

getter/setterがなくなると、本当に必要なメソッドがパッとみでわかるようになります。(IDE使ってたらそんなにメリットでもない気がしますが・・・。)

Getter/Setterをやめたデメリット

プロパティにどんな型でも代入できてしまう。

こんな感じに、ManyToOneとかしていて、本当はEntity渡さなきゃいけないようなところでも、intとか平気で渡せちゃいますよね。

$hoge->fuga = 1; // 本来ならFugaオブジェクトをセットしなければいけないところ。

普通にsetterを定義していれば、タイプヒント使って防げますよね。

class Hoge {
    public function setFuga(Fuga $fuga) {
        $this->fuga = $fuga;
    }
}

$hoge->setFuga(1); // これだと、エラーになる。

PHPの型のゆるさが辛いところですね・・・。

最後に

こうやって書いてみると、getter/setterをやめたところで、本質的には何も変わらないような気もします。
でも、本質的にかわらないなら、よりシンプルになるのほうが良いのかなとも思います。

結論としては「どっちでもいい」と。
チームとかで話し合って好きな方を採用すればいいと思います。

最後の最後に

「Getter/Setterをやめてたら心が豊かになりました。」とか調子にのったツイートしてごめんなさい。

comments powered by Disqus