[英]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 中命名空間的添加,我認為不需要向實際類名添加Abstract
或Interface
前綴/后綴。
只需按原樣命名即可!
使用以下方法命名抽象類和接口:
將使您的代碼庫保持干凈、美觀且對您的團隊一目了然,什么是原型,什么是契約,什么是具體實現。
在任何情況下,命名約定都可以提高我們的生產力,因此“隨心所欲地命名”遠不是一個好主意。
即使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.