簡體   English   中英

PHP 關於抽象類和接口的命名約定

[英]PHP naming conventions about abstract classes and interfaces

抽象類是否應該總是以Abstract為前綴並以Interface后綴(當它是接口時)? 是否有任何標准命名約定,類似於文件夾結構/命名空間的 PSR-0,但對於類?

這似乎是多余的,因為該語言為此具有文字關鍵字。

abstract class AbstractFoo {}

interface InterfaceFoo {}

trait TraitFoo {}

雖然沒有任何約定,但我認為對各個組件使用Abstract前綴和Interface后綴是一個很好的做法。 它有助於一目了然地更好地理解代碼,IMO。

PHP-FIG 項目確實通過 PSR 命名約定“ByLaw” https://www.php-fig.org/bylaws/psr-naming-conventions/提出了命名約定

它指出:

  • 接口必須以接口為后綴:例如Psr\\Foo\\BarInterface

  • 抽象類必須以 Abstract 為前綴:例如Psr\\Foo\\AbstractBar

  • Traits 必須以 Trait 為后綴:例如Psr\\Foo\\BarTrait

這些約定通常在包中遵循

對此沒有約定; 尤其是在 PHP 中。 這一切都可以按照您的意願進行組織。

隨着 PHP 5.3 中命名空間的添加,我認為不需要向實際類名添加AbstractInterface前綴/后綴。

只需按原樣命名即可!

使用以下方法命名抽象類和接口:

  • 抽象的*
  • *界面

將使您的代碼庫保持干凈、美觀且對您的團隊一目了然,什么是原型,什么是契約,什么是具體實現。

在任何情況下,命名約定都可以提高我們的生產力,因此“隨心所欲地命名”遠不是一個好主意。

即使FIG 組沒有提出抽象類和接口的命名約定——如果你檢查主要的開源PHP 項目,你會發現幾乎所有項目都使用這個約定。

與大多數其他答案相反,我建議最好不要在類中添加前綴或后綴。 為此abstract, interface, class, final該語言具有文字關鍵字,例如abstract, interface, class, final

以下實際上打破了干凈的代碼原則:

abstract class AbstractPerson 
{

   // ...
}

類似於“評論通常很糟糕,因為它表明代碼不容易閱讀”的想法。 如果你的類、繼承和它們的契約是以清晰易讀的方式設計的,那么就不需要前綴。

行為設計

通常可以以反映事物行為的方式命名事物。 例如在日志子系統中:

interface Loggable
{
    public function getLog(): string;
}

trait WritesLogs
{
    public function writeLog(): void
    {
        file_put_contents("logs.txt", $this->getLog());
    }
}

abstract class Event implements Loggable
{
    use WritesLogs;

    public function asLog(): string
    {
        return "{$this->getName()} at {$this->created_at}";
    }

    abstract public function getName(): string;
}

class FooCreated extends Event
{
    public function getName(): string
    {
        return 'Foo was created';
    }
}

約定就是你看到的樣子:語言本身不強制任何約定,除了那些使解析器能夠讀取你的代碼的約定。 基本上,您應該為特定項目或更好地為所有項目設置自己的約定。 但是,在不同人的團隊中工作可能會導致不遵守約定,這實際上取決於程序員。

根據我的經驗,我建議遵循“按合同設計”之類的方法。 像命名實現類一樣命名你的合約(接口),然后給你的實現一個更具體的名稱(或者回退到 MyContractNameImpl,我猜主要來自 Java)。 此外,許多現代 IDE 知道您的類是接口還是抽象類,因此實際上沒有必要將其放在名稱中。 出於同樣的原因,我還發現像“IMyContract”這樣的合同並不是很好。

接口:

接口必須以接口為后綴: eg Psr\\Foo\\BarInterface


抽象類:

抽象類必須以 Abstract 為前綴: eg Psr\\Foo\\AbstractBar


性狀

Traits 必須以 Trait 為后綴: eg Psr\\Foo\\BarTrait


來源: https : //www.php-fig.org/bylaws/psr-naming-conventions/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM