web-dev-qa-db-ja.com

特性の構成と良い実践ですか?

それで、私は今、この比較的新しいコードベースを使用しており、時にはそれが特性を乱用しているように感じます。私はかなり限られた方法で特性の使用にさらされてきたので、それらの使用方法が理にかなっているのではないかと思っていました。私は彼らが古き良き継承が同様に機能するときに特性を使用することを好むと私は信じています。

これが私が話していることの例です:

trait CrudTrait
{
  use FindTrait;
  use ExistsTrait;
  use UpdateTrait;
}

次に、その特性は多かれ少なかれ次のように使用されます。

class <EntityName>ServiceAbstract extends ServiceAbstract 
{
  use CrudTrait;
}

このようなメソッドがクラスメンバーを作成するよりも優れている理由は考えられません。結局のところ、これらの特定の特性は、水平方向に再利用できないように設計されています。

これが階層の親クラスにメソッドをアタッチするよりもbetterになる理由はありますか?私はここで、特性の乱用がコードのにおいである可能性があると信じ始めています。

6
memo

代用性が必要でない限り、通常、構成は継承よりも望ましいです。特性は、合成を実行するための1つの特定の方法です。通常、水平再利用が必要な場合にトレイトを使用しますが、モジュール化のために使用して、何らかの理由で分割できないクラスを分割することも妥当です。

普通にクラスを分割できないことは比較的まれです。これは通常、APIのすべての部分を1つのクラスで提供する必要があるなど、外部の要件から駆動されます。代わりに、たとえば、FindTraitに複数の選択肢がある場合など、特定の実装であっても異なる顧客が異なる方法で選択する場合など、トレイトはクラスのコンパイル時構成を並べ替えるためによく使用されます。 1つの構成のみを使用します。

多くのプログラマーの最初の言語と主要な言語には特性がないため、特性はおそらく十分に活用されておらず、あまり理解されていません。これらはこの特定のコードベースで悪用される可能性があります。ただし、一般的に、継承はmuch特性よりも使い過ぎる可能性が高くなります。ここで特性areが不適切に使用されている場合、それを継承に置き換えると悪化する可能性が高くなります。

6
Karl Bielefeldt

あなたが説明したことから、継承はより良いアプローチのように思われることに同意する必要があります。しかし、その意見はコードベースについて事実上何も知らないことに基づいています。

特性は本質的に「多重継承」を行う方法を提供します、そしてはい、それは時々役に立つかもしれません。たとえば、親からすでに継承している子クラスがあるが、継承ツリー全体で共有する必要がある機能のコアセットがもう1つあるとします。

ただし、継承だけで問題を解決できる場合は、常にそれを最初に選択する必要があります。

1
bestattendance