站长资讯网
最全最丰富的资讯网站

聊聊PHP面向对象设计的五个基准原则(S.O.L.I.D)

本篇文章带大家了解一下PHP面向对象设计的五个基准原则(S.O.L.I.D),希望对大家有所帮助!

聊聊PHP面向对象设计的五个基准原则(S.O.L.I.D)

前端(vue)入门到精通课程:进入学习

S.O.L.I.D面向对象设计(OOD)的 5 个准则的首字母缩写 ,这些准则是由 Robert C. Martin 提出的, 他更为人所熟知的名字是 Uncle Bob。

这些准则使得开发出易扩展、可维护的软件变得更容易。也使得代码更精简、易于重构。同样也是敏捷开发和自适应软件开发的一部分。

备注: 这不是一篇简单的介绍 “欢迎来到 _*S.O.L.I.D*” 的文章,这篇文章想要阐明 *S.O.L.I.D*** 是什么。

S.O.L.I.D 意思是:

扩展出来的首字母缩略词看起来可能很复杂,实际上它们很容易理解。

  • S – 单一功能原则
  • O – 开闭原则
  • L – 里氏替换原则
  • I – 接口隔离原则
  • D – 依赖反转原则

接下来让我们看看每个原则,来了解为什么 S.O.L.I.D 可以帮助我们成为更好的开发人员。

单一职责原则

缩写是 S.R.P ,该原则内容是:

一个类有且只能有一个因素使其改变,意思是一个类只应该有单一职责.

例如,假设我们有一些图形,并且想要计算这些图形的总面积.是的,这很简单对不对?

class Circle {     public $radius;      public function __construct($radius) {         $this->radius = $radius;     } }  class Square {     public $length;      public function __construct($length) {         $this->length = $length;     } }

首先,我们创建图形类,该类的构造方法初始化必要的参数.接下来,创建AreaCalculator 类,然后编写计算指定图形总面积的逻辑代码.

class AreaCalculator {      protected $shapes;      public function __construct($shapes = array()) {         $this->shapes = $shapes;     }      public function sum() {         // logic to sum the areas     }      public function output() {         return 'Sum of the areas of provided shapes: ' . $this->sum();     } }

AreaCalculator 使用方法,我们只需简单的实例化这个类,并且传递一个图形数组,在页面底部展示输出内容.

$shapes = array(     new Circle(2),     new Square(5),     new Square(6) );  $areas = new AreaCalculator($shapes);  echo $areas->output();

输出方法的问题在于,AreaCalculator 处理了数据输出逻辑.因此,假如用户希望将数据以 json 或者其他格式输出呢?

所有逻辑都由 AreaCalculator 类处理,这恰恰违反了单一职责原则(SRP); AreaCalculator 类应该只负责计算图形的总面积,它不应该关心用户是想要json还是HTML格式数据。

因此,要解决这个问题,可以创建一个 SumCalculatorOutputter 类,并使用它来处理所需的显示逻辑,以处理所有图形的总面积该如何显示。

SumCalculatorOutputter 类的工作方式如下:

$shapes = array(     new Circle(2),     new Square(5),     new Square(6) );  $areas = new AreaCalculator($shapes); $output = new SumCalculatorOutputter($areas);  echo $output->JSON(); echo $output->HAML(); echo $output->HTML(); echo $output->JADE();

现在,无论你想向用户输出什么格式数据,都由 SumCalculatorOutputter 类处理。

开闭原则

对象和实体应该对扩展开放,但是对修改关闭.

简单的说就是,一个类应该不用修改其自身就能很容易扩展其功能.让我们看一下 AreaCalculator 类,特别是 sum 方法.

public function sum() {     foreach($this->shapes as $shape) {         if(is_a($shape, 'Square')) {             $area[] = pow($shape->length, 2);         } else if(is_a($shape, 'Circle')) {             $area[] = pi() * pow($shape->radius, 2);         }     }      return array_sum($area); }

如果我们想用 sum 方法能计算

赞(0)
分享到: 更多 (0)