以下是该方案:
用户可以使用表单创建形状。
用户将从形状选项列表(圆形,方形,矩形等)中进行选择,并通过单击“创建形状”按钮提交表单。
他创建的形状将链接到他的帐户。
以下是我接近它的方式:
一个接口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)
覆盖用户选择的形状类型,以适当地实例化Square
或Circle
或Rectangle
类。
$data = $_POST;
switch($shapeType) {
case 'square':
Shape $shape = new Square($user, $data);
$shape->create();
break;
and so on...
}
这是我实施
SOLID Principles
和我的第一步 我想我可能弄错了。在这种情况下请原谅我。问题是我认为switch语句(我见过的例子 人们在尝试时尝试消除
switch
或conditions
的地方 使用那些对象)。我只在使用时看过这个 我觉得很容易的对象。但我们能实现这一目标吗? 在对象创建期间(我无法找到) 除switch
形状之外的其他逻辑解决方案。其他方面是,如何有效地处理
$_POST
数据 数组的键可能在将来发生变化,任何事情都可能发生。怎么样 你会处理这种情况吗?
以上解释是我案例的简化版本。
我有一个Accounts
接口,其add()
方法由FacebookAccount
,GoogleAccount
和其他类实现。
现在add()
这些帐户的方法不同,因此用作接口。创建Facebook
或Google
api对象,并提取用户数据以存储到UserAccount
。帐户与用户相关联。
我欢迎所有想要使用SOLID原则解决这个问题的人。我将非常感谢所有人,希望我能学到很多关于原则和我做错的事情。
谢谢。
修改
链接到SOLID原则:SOLID Principles Wikipedia
答案 0 :(得分:0)
最后提出了两个问题的解决方案。
切换问题
创建一个将返回所需对象的工厂类。这将隐藏从场景中检索对象的条件复杂性。
$_POST
数据问题
这实际上非常简单,将数据传递给create
方法而不是传递给构造函数是常识。将数据传递给create
方法可解决此问题,因为该方法仅处理创建新对象,而类的其他部分现在独立于该更改。