"Là A" hoặc "Hành động như"

  • Post category:lập trình


Tôi đã bày tỏ sự ưu tiên của mình đối với các phương thức mặc định giao diện gần đây RFC và nhiều người đã nói với tôi rằng tôi đã sai: giao diện chỉ là một hợp đồng và không nên cung cấp các triển khai.

Tất nhiên là họ đúng, nhưng chỉ đúng một nửa. Hãy nói về quan hệ đối tượng.

Bạn có thể coi mối quan hệ lớp/giao diện cổ điển như một Is A mối quan hệ: bạn có thể nói Item Is A Purchasable Itemhoặc theo thuật ngữ kỹ thuật: class Item implements Purchasable.

Tôi không nghĩ có bất kỳ sự bất đồng nào giữa các nhà phát triển, đây là định nghĩa cổ điển về giao diện. Nó cho phép chúng tôi viết mã hoạt động với tất cả các loại sản phẩm có thể mua được mà không cần phải lo lắng về việc triển khai cụ thể mà chúng tôi đang xử lý.

function createPayment(Purchasable $purchasable): Payment
\Stringable $message, 
        array $context = ()
    ): void;

    public function error(
        string

Đây là nơi những người tranh luận chống lại các phương thức mặc định giao diện dừng lại. Nếu đây là cách duy nhất bạn đang sử dụng giao diện thì có, bạn nói đúng: các phương thức mặc định của giao diện là không cần thiết.

Tuy nhiên, có một cách khác để sử dụng giao diện. Và xin lưu ý bạn: Tôi không nói “có một cách khác để giao diện Có thể được sử dụng”, không, tôi đang nói điều này ngày nay đang xảy ra trong mã PHP hiện đại trong nhiều dự án.

Đây rồi. Các giao diện có thể được sử dụng để mô hình hóa một Acts As mối quan hệ – Tôi có một ví dụ hoàn hảo, cảm ơn Larry.

Đây là cái gọi là LoggerInterfacemột phần của PSR-3:

interface LoggerInterface
\Stringable $message, 
        array $context = ()
    ): void;

Như bạn có thể thấy, hầu hết các phương thức về cơ bản là các phím tắt cho log phương pháp: chúng là các phương pháp tiện lợi để bạn không phải cung cấp mức ghi nhật ký theo cách thủ công. Đó là một lựa chọn thiết kế tuyệt vời để đưa vào giao diện vì nó buộc tất cả các hoạt động triển khai phải có khả năng truy cập tốt hơn.

Tuy nhiên, hãy thành thật mà nói, sẽ không có ai cần một logger với cách triển khai khác debug hoặc info hoặc bất kỳ cách viết tắt nào khác. Những phương pháp này sẽ luôn luôn nhìn giống nhau:

public function debug(
    string|\Stringable $message, 
    array $context = ()
): void
{
    $this->log(LogLevel::DEBUG, $message, $context);
}

Về bản chất, điều này LoggerInterface không chỉ mô tả một Is A mối quan hệ – nếu đúng như vậy thì chúng ta chỉ cần log phương pháp. Không, nó cũng mô tả một Acts As mối quan hệ: việc triển khai logger cụ thể có thể Act As như một trình ghi nhật ký thích hợp, bao gồm cả các phương thức tiện lợi liên quan đến nó. FileLogger Acts As LoggerInterface, Monolog Acts As LoggerInterface.

Tất cả đều tập trung vào câu hỏi: đây có phải là cách viết và sử dụng giao diện hợp lệ không? Tôi sẽ nói có.

Tôi khuyến khích bạn xem xét kỹ các dự án của riêng bạn và hoàn toàn trung thực trong giây lát: có giao diện nào của bạn mô tả một Acts As mối quan hệ? Nếu đúng như vậy thì bạn không thể chống lại các phương thức mặc định của giao diện.

Trả lời