PHP编码策略

编码政策

以下是总结了在BEAR.Sunday框架开发中的编码原则的内容。

目标

    • クリーン

 

    • ハイパフォーマンス

 

    No BC break

如果柔软性、可扩展性和可测试性都是”清洁”的话,自然而然地包含在其中。

全球化

    • グローバル定数(define)の禁止

 

    • スーパーグローバル変数の参照の禁止

 

    • グローバルなサービスロケータの参照の禁止

 

    • グローバルな設定の参照の禁止(prod/devモードなど)

 

    • グローバルなプロパティ参照の禁止(スタティックプロパティ)

 

    グローバルなメソッド利用の禁止(スタティックメソッド)

根据其相关性

以下是对该文本的中文本地化翻译:

* 所有的基本操作都使用DI(依赖注入)。
* 禁止使用new关键字创建对象(除了值对象以外)。
* 禁止使用实际类名来获取对象(如工厂方法等)。
* 禁止使用接口中没有定义的方法。
* 如果参数是一个对象并且使用了公共属性,请不要在参数类型提示中使用接口,而是使用抽象类。
* 禁止依赖include_path。
* 禁止在抽象类之外使用setter注入。
* 使用composer只指定依赖库的最低版本,而不是锁定到特定版本。

继承

    • 実クラスの継承の禁止 (finalキーワード付加)

 

    • 子クラスから親クラスのメソッド利用の禁止

 

    抽象クラス以外でのprotectedプロパティの禁止。

特征

    • 原則禁止

 

    アプリケーションでDIのセッターメソッドのみ

输入参数、返回值

    • 引数の数は4つまで(4も例外的)

 

    • 引数にbool値を使用することを禁止

 

    • スカラー値よりバリューオブジェクトを好む

 

    • 特定の構造を期待する連想配列を使わない

 

    • 返り値のmixedを避ける

nullのデフォルト引数を避ける
クロージャの引数を避ける

构造

    • elseの禁止

 

    ネストのインデントは2つまで

序列化

    オブジェクトはシリアライズ可能に

目标衡量指标

    • 1つのクラスのメソッドの数は10以下

 

    • 1つのクラスのプロパティの数は15以下

 

    1メソッドの平均ライン数は10行以下

这是原样使用phpmd的默认设置。

You want me to provide a single paraphrased option in Chinese for “CI”. Here it is:

– 情报

scrutinizer score 10.0

travis test coverage 99.5%

phpstan -l max src tests 双方 (CIに含める)

php-cs-fixer, phpcs src tests 双方 (CIに含める)

面向对象编程 (mianxiang duixiang biancheng)

    • setter、getterを使わない

 

    • デメテルの法則

 

    • 小さなクラスを好む。

 

    • 早期バリデーション、遅延評価

 

    • サービスにオブジェクトを渡さない。オブジェクトにサービスを渡す。 (XXManagerクラスの禁止)

DRYをあまり重視しすぎない。

只需要用一種選項用中文將以下句子改寫一下:

基本原則

    • 小さく。迷ったら簡素な方を。

 

    • 言い訳はあとで。まずは取り組んでみる。

 

    • 守るのが難しく見える時、そもそも取り組み方がそれでいいのか再考する。

 

    速度を犠牲にする方向で解決することを避ける。

解释

我会解释一些。

禁止引用全局設定

直接引用yml的配置文件,或者创建Config(容器)类来获取值,不会发生。需要的值将作为依赖项注入。

$foo = Configure::read("foo") // NG
public function __construct($foo)
{
  $this->foo = $foo; // OK
}

禁止使用new

除去值对象等。主要指服务对象的情况。

$email = new Email('exmaple@example.com'); // OK
$http = new AnnotationReader() // NG

禁止直接参考超级全局变量

Foo::createFromGlobals(); //NG
Foo::create($GLOBALS) // OK

不直接引用超级全局变量,而是将其作为依赖传递。

除此之外禁止

如果条件是布尔值且只有一个确定的else状态,那么没有关系。(即三元运算符是可以使用的)
将else字面意义上的“其它”排除。(但在这种情况下,可以通过使用守卫子句轻松排除else)

不使用带有各自含义的关联数组作为参数。

作为一个例子,我们可以创建一个名为Location的类,它拥有公共属性$x和$y,而不是将数组$location作为参数传递并使用$location[‘x’]和$location[‘y’]。

总结

各种编码原则有时会被贬低为“不现实”或“不符合PHP特点”。但是现在的PHP完全可以按照这些面向对象编程原则进行编码。清晰的代码实际上更简洁,并且在使用IDE和CI工具时,开发速度的牺牲也仅仅是初期的问题。

我认为,优秀的代码在开发速度和运行时速度之间并不存在权衡关系。

BEAR.Sunday提供的不是一个库的集合,而是一个“框架”。模块的实现随时变化,但我们希望能够提供一个与持续演进的HTTP应用程序结构保持一致的框架。遵循软件设计原则是为了在不破坏该框架的情况下(牺牲向后兼容性),实现框架的持续演进。

请参考

广告
将在 10 秒后关闭
bannerAds