Skip to content

Instantly share code, notes, and snippets.

@syamgot
Last active July 13, 2017 07:32
Show Gist options
  • Save syamgot/617aa8ff84d3f4da0065eb04b791ce09 to your computer and use it in GitHub Desktop.
Save syamgot/617aa8ff84d3f4da0065eb04b791ce09 to your computer and use it in GitHub Desktop.
raitを使うことの利点を見失った

traitを書きながらふと、

コレtrait使う必要あるんか...
今の自分の想定する使い方なら、委譲すればいいんちゃうの?

となった

使いたい処理を簡単にuseすれば使えるし、必要な処理だけ追加出来るってのは良いんだけど、それは委譲でも実現できちゃうなという域を出なかった。

traitを使うとuseしているtraitが持っている処理全体を把握する必要があるし、他のtraitの中身も意識しないといけない。他のtraitの処理を使う(けどどのtaritを使うかは自由)ような処理を書いちゃうと依存が発生しちゃうし、名前の衝突とか気にしだすと関数名を付けるときも冗長になりかねない。

# traitだと両方使いたい時は名前がぶつからないように気をつけないといけない
self::B_login();
self::A_login();

# 委譲したクラスメソッドを使うならそんなこと気にしなくていい
A::login();
B::login():

いずれもドキュメントとかチーム無いの意思疎通ができていれば回避出来る問題かもしれないけど、そこにコストを払うのもどこか本末転倒な感じがする。

traitは多重継承のようなもの(?)なのだし、そもそも継承より委譲のはずだ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment