创建对象时的SOLID原则

时间:2016-04-22 18:25:07

标签: php oop solid-principles

以下是该方案:

  

用户可以使用表单创建形状。

     

用户将从形状选项列表(圆形,方形,矩形等)中进行选择,并通过单击“创建形状”按钮提交表单。

     

他创建的形状将链接到他的帐户。

以下是我接近它的方式:

一个接口Shape,其方法签名为create()一个形状,将由各个形状类实现。

# Shape.php
interface Shape {
    public function create();
    public function area();
}

# Rectangle.php
class Rectangle implements Shape {
    private $user;
    private $data; # user submitted data

    public __construct($user, $data) {
        $this->user = $user;
        $this->data = $data;
    }

    public function create() {

        # get rectangle shape details from RectangleShapeAPI

        $userShape = new UserShape; # the model to store data
        $userShape->shape_id = $this->data['shape_id'];
        $userShape->area = $this->area();
        $userShape->users_id = $user->id;

        # save rectangle shape details from API

        if (!$userShape->save()) {
            return false;
        }
        return true;
    }

    public function area() {
        return $this->data['length'] * $this->data['breadth'];
    }
}

现在,我要switch($shapeType)覆盖用户选择的形状类型,以适当地实例化SquareCircleRectangle类。

$data = $_POST;
switch($shapeType) {
    case 'square':
        Shape $shape = new Square($user, $data);
        $shape->create();
    break;

    and so on...

}
  

这是我实施SOLID Principles和我的第一步   我想我可能弄错了。在这种情况下请原谅我。

     

问题是我认为switch语句(我见过的例子   人们在尝试时尝试消除switchconditions的地方   使用那些对象)。我只在使用时看过这个   我觉得很容易的对象。但我们能实现这一目标吗?   在对象创建期间(我无法找到)   除switch形状之外的其他逻辑解决方案。

     

其他方面是,如何有效地处理$_POST数据   数组的键可能在将来发生变化,任何事情都可能发生。怎么样   你会处理这种情况吗?

以上解释是我案例的简化版本。

我有一个Accounts接口,其add()方法由FacebookAccountGoogleAccount和其他类实现。

现在add()这些帐户的方法不同,因此用作接口。创建FacebookGoogle api对象,并提取用户数据以存储到UserAccount。帐户与用户相关联。

我欢迎所有想要使用SOLID原则解决这个问题的人。我将非常感谢所有人,希望我能学到很多关于原则和我做错的事情。

谢谢。

修改

链接到SOLID原则:SOLID Principles Wikipedia

1 个答案:

答案 0 :(得分:0)

最后提出了两个问题的解决方案。

切换问题

创建一个将返回所需对象的工厂类。这将隐藏从场景中检索对象的条件复杂性。

$_POST数据问题

这实际上非常简单,将数据传递给create方法而不是传递给构造函数是常识。将数据传递给create方法可解决此问题,因为该方法仅处理创建新对象,而类的其他部分现在独立于该更改。