我最近看到了一些如何获取所有对象的替代方法,我特别喜欢Factory方法,但我见过人们在类之外使用函数,在用户对象上调用getAll方法等等。
以下示例是我最常从数据库中获取所有用户的方式。虽然这是PHP代码,但我想看看人们如何在不同的编程语言中做同样的事情。
您更喜欢什么?为什么?这是一个更多的讨论,我希望下次我这样做可以给我更多的想法。
class userFactory extends Factory {
public function __construct(){
}
public function getAllUsers() {
$users = array();
$result = $this->db->Execute("SELECT * FROM user");
while (!$result->EOF) {
$users[] = new user($result);
}
return $users;
}
}
答案 0 :(得分:3)
你已经实现了DAO design pattern的一部分(即使它返回用户实例也不是工厂)。 DAO通常负责查找,创建,保存,编辑和删除相同类型的对象。
另请参阅Repository pattern - 存储库是更高级别的抽象 - 它可以查询多个DAO以获得预期结果,但是一个DAO应该只查询一个数据库表。
然后你可以定义关系并使用这样的对象:
//ORM/ActiveRecord way
$user = Repo :: get ( "users" ) -> find_by_id ( $user_id );
$user = User :: find_by_id ( $user_id );
$user_payments = $user -> payments;
$user_articles = $user -> articles;
而不是:
$user_repository = Repo :: get ( "users" );
$articles_repository = Repo :: get ( "articles" );
$user = $user_repository -> find_by_id ( $user_id );
$user_articles = $articles_repository -> find_all_for ( $user );
ActiveRecord更简单易用,但它不是非常OOP。方法如:
不应该是User类的一部分,因为对象有责任知道如何找到所有实例,如何将它存储在db中等等。无论如何 - 这是一个好的开始,它迫使你思考丰富的领域模型。所以 - 去ActiveRecord并在达到某种技能后尝试切换到一些真正的ORM
答案 1 :(得分:1)
好吧,如果您只是在寻找想法,可以考虑使用对象关系映射器(ORM)。这允许您将数据库查询的结果用作您选择的语言中的第一类对象。例如,如果我有一个公司和员工表,我可以在Ruby / Rails(使用ActiveRecord ORM)中执行此操作:
mycompany = Company.where(:name => "MyCompany").first
employee1 = mycompany.employees.first
这会生成一个SQL查询,并自动创建一流的对象系统。在上一个示例中,您可以使用以下类型的代码来完成它:
$users = UserQuery::create()=>all();
如果您使用PHP,那里已经有一些好的ORM,只需谷歌“php orm”即可找到它们。有一些ActiveRecord克隆,以及一些更适合php语言的克隆。