在面向对象的编程中获取特定类的所有对象

时间:2011-01-20 19:15:07

标签: java php oop design-patterns factory-pattern

我最近看到了一些如何获取所有对象的替代方法,我特别喜欢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;
     }
}

2 个答案:

答案 0 :(得分:3)

你已经实现了DAO design pattern的一部分(即使它返回用户实例也不是工厂)。 DAO通常负责查找,创建,保存,编辑和删除相同类型的对象。

另请参阅Repository pattern - 存储库是更高级别的抽象 - 它可以查询多个DAO以获得预期结果,但是一个DAO应该只查询一个数据库表。

PHP持久性框架

  • Doctrine ORM - 类似Java的ORM,没有依赖关系,请参阅examples(getters / setter应该是可选的)
  • Kohana ORM - ActiveRecord,Kohana 3.0 Web框架的一部分
  • Zend_Table - ActiveRecord,Zend framework的一部分
  • 其他人很少(google orm / activerecord / persistence for php)

然后你可以定义关系并使用这样的对象:

//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 - > save(),
  • $ user - >删除(),
  • User :: find_all()
  • User :: find_by_id($ id)

不应该是User类的一部分,因为对象有责任知道如何找到所有实例,如何将它存储在db中等等。无论如何 - 这是一个好的开始,它迫使你思考丰富的领域模型。所以 - 去ActiveRecord并在达到某种技能后尝试切换到一些真正的ORM

其他语言

  • 对于 JAVA 项目,google for JPA,Hibernate,Toplink,iBatis。
  • 对于 Ruby ,有一个ActiveRecord类
  • 如果你真的喜欢OOP,请谷歌寻找小型持久性: - )

答案 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语言的克隆。