私は最近のインターフェイスのデフォルト メソッド RFC を好むと発言しましたが、多くの人が私が間違っている、インターフェイスは単なる契約であり、実装を提供すべきではないと言いました。
もちろんそれらは正しいのですが、半分しかありません。 オブジェクト関係について話しましょう。
古典的なクラス/インターフェイスの関係は次のように考えることができます。 Is A
関係:言えることは Item Is A Purchasable Item
、または、技術用語で言うと、次のようになります。 class Item implements Purchasable
。
開発者の間で意見の相違はないと思います。これがインターフェイスの古典的な定義です。 これにより、どの具体的な実装を扱っているかを気にすることなく、あらゆるタイプの購入可能品で動作するコードを書くことができます。
function createPayment(Purchasable $purchasable): Payment
\Stringable $message,
array $context = ()
): void;
public function log(
$level,
string
インターフェースのデフォルトメソッドに反対する人々はここで止まります。 これがインターフェイスを使用する唯一の方法である場合、はい、そのとおりです。インターフェイスのデフォルト メソッドは必要ありません。
ただし、インターフェースを使用する別の方法もあります。 念のため言っておきますが、私は「インターフェースには別の方法がある」と言っているわけではありません。 できる 使ってください」、いや、これを言っているのです は 現在、多くのプロジェクトで最新の PHP コードで起こっています。
さあ行きます。 インターフェイスを使用して、 Acts As
関係 — ラリーのおかげで完璧な例ができました。
ここにいわゆる LoggerInterface
、PSR-3の一部:
interface LoggerInterface
\Stringable $message,
array $context = ()
): void;
public function alert(
string
ご覧のとおり、ほとんどのメソッドは基本的に log
メソッド: これらは便利なメソッドなので、ログ レベルを手動で指定する必要はありません。 すべての実装にアクセシビリティを向上させるため、これをインターフェイスに含めるのは優れた設計上の選択です。
ただし、正直に言うと、別の実装を備えたロガーを必要とする人は誰もいないでしょう。 debug
または info
またはその他の略記。 これらのメソッドは、 いつも 同じように見える:
public function debug(
string|\Stringable $message,
array $context = ()
): void
{
$this->log(LogLevel::DEBUG, $message, $context);
}
要するに、これは LoggerInterface
を説明するだけではありません Is A
関係 — その場合、必要なのは log
方法。 いいえ、それはまた、 Acts As
関係: 具体的なロガー実装では、 Act As
関連する便利なメソッドも含めて、適切なロガーとして。 FileLogger Acts As LoggerInterface
、 Monolog Acts As LoggerInterface
。
すべては、「これはインターフェイスの記述と使用の有効な方法なのか?」という疑問に要約されます。 私はそう言いたいと思います。
あなた自身のプロジェクトをよく見て、少しの間完全に正直になることをお勧めします。あなたのインターフェースの中に、 Acts As
関係? もしそうなら、インターフェースのデフォルトメソッドに対して主張することはできません。