【问题标题】:SOLID principles while creating objects创建对象时的 SOLID 原则
【发布时间】:2016-04-22 18:25:07
【问题描述】:

这是场景:

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

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

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

这是我的处理方式:

带有create() 形状的方法签名的接口Shape,将由各个形状类实现。

# 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 使用这些对象)。我只在使用的时候看到过这个 我认为很容易实现的对象。但我们能否实现 在创建对象时相同(我找不到任何 除了switching 之外的逻辑解决方案。

另一件事是,如何有效地处理$_POST 数据作为 数组的键将来可能会改变,任何事情都可能发生。如何 你会处理这种情况吗?


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

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

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


我欢迎所有愿意为我提供使用 SOLID 原则解决此问题的方法的人。我会非常感谢所有人,并希望我能学到很多关于原则和我做错的事情。

谢谢。


编辑

SOLID 原则链接:SOLID Principles Wikipedia

【问题讨论】:

  • 您能否提供一个指向上述 SOLID 原则的链接?在你的情况下,我会实现一个抽象的 Shape 类并做这些事情,这对那里的所有 Shapes 都是通用的,以避免冗余。
  • 我已经包含了链接。我也可以,但是create() 方法必须调用一些外部api 来获取一些数据并与UserShape 对象一起存储。 create() 的功能因形状而异。或者在我的情况下,帐户之间的功能不同。

标签: php oop solid-principles


【解决方案1】:

终于想出了解决这两个问题的办法。

开关问题

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

$_POST 数据问题

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2013-01-01
    • 1970-01-01
    • 2010-12-03
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多