lt1

「Is A」 または「として行動する」

私は最近のインターフェイスのデフォルト メソッド 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 LoggerInterfaceMonolog Acts As LoggerInterface

すべては、「これはインターフェイスの記述と使用の有効な方法なのか?」という疑問に要約されます。 私はそう言いたいと思います。

あなた自身のプロジェクトをよく見て、少しの間完全に正直になることをお勧めします。あなたのインターフェースの中に、 Acts As 関係? もしそうなら、インターフェースのデフォルトメソッドに対して主張することはできません。

次の投稿
PHP バージョンの統計: 2023 年 7 月
前の投稿
RFC 投票プロジェクト -stitcher.io

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。