【发布时间】:2022-11-25 09:47:32
【问题描述】:
都说面向对象编程就是封装,数据隐藏。让我们举个例子:
class Rectangle
{
private int a,b;
public function __construct(int a, int b)
{
this.a = a;
this.b = b;
}
int public function getA()
{
return a;
}
int public function getB()
{
return b;
}
}
var r = new Rectangle(3, 4);
var area = r.getA() * r.getB();
这是一个糟糕的代码,所以让我们重新制作:
class Rectangle
{
private int a,b;
public function __construct(int a, int b)
{
this.a = a;
this.b = b;
}
int public function getArea()
{
return a*b;
}
}
r = new Rectangle(3, 4);
area = r.getArea();
更好的方法是,完成数据隐藏,并将 getArea 带到它所属的位置。 好的,Active Records 来了:
class Record
{
private int ID;
private string username;
public function __constructor(int ID, string username)
{
this.ID = ID;
this.username = username;
}
int public function getID()
{
return ID;
}
string public function getUsername()
{
return username;
}
}
r = new Record(1, 'test');
dbEngine.save(r);
这又很糟糕,因为所有数据都是公开的。 (尽管 Doctrine 是这样工作的) 但如果我像 Propel 那样做:
class Record
{
private int ID;
private string username;
public function __constructor(int ID, string username)
{
this.ID = ID;
this.username = username;
}
public function save()
{
dbEngine.save([ID, username]);
}
}
r = new Record(1, 'test');
r.save();
这也说不好,因为 Active Records 是反模式的。那什么时候好,什么时候坏?什么时候应该将“行为”(getArea,保存)引入对象内部 - 什么时候在外部行为?
【问题讨论】:
标签: activerecord separation-of-concerns