OOP实施存在疑虑

时间:2015-03-05 20:26:48

标签: php oop

我今天开始了一个项目,在设计了数据库结构以及数据存储方式等之后,我开始实施了。我在php上做这个,但是这里的语言并不真正相关,因为我的怀疑更多是与架构相关的,或者我猜,因为我在PHP上用OOP实现东西比我想象的还要多。 (最近跳过php,我以前用c ++和java编写过)。

所以,我开始创建我的“User”类,简单,只需要很少的属性,以及__construct,insert,update和delete方法。最后3个,对db的查询。

然后这个疑问浮现在我脑海中,我可能知道自己的答案,但我不知道。

我现在可以创建实例并创建新用户:$user = new User("John", 34)但是,如果我想编辑用户“Dave”怎么办?或者我想向所有用户显示。那个方法,例如,getAllUsers()将返回所有将要实现的用户?因为它真的不属于类用户吗?如果确实如此,那么如果我没有任何User实例,那么我将如何实例化该方法?

我想,我需要一个类或UserCollection类,它将是所有用户的集合,方法'getCertainUser(id)'和'getAllUsers()'将返回某些用户或所有用户,现在我会有一个用户可以编辑,对吗?

话虽如此,我的问题是,应该如何解决这个问题,我是否太过复杂化了?如何在OOP中解决“正确的方法”。我处理类似问题的时间我从未使用过数据库,因此拥有一组用户是存储它们的唯一方法,但拥有存储用户的数据库对于拥有该用户集合感到多余。

提前致谢。

2 个答案:

答案 0 :(得分:1)

首先,通过挑战自己,你做的是正确的事。

显然,有很多方法可以做。

我非常相信,当您想要编写易于维护和测试的代码时,尝试尽可能地将关注点分开并保持类小而简单总是两个很好的指导。

这是一种方法:

处理模型&结构

Entity/User (Define the properties of a user)
Collection/User (implements ArrayIterator, just a structure)

处理与存储库(db)的通信。

Repository/Mysql/User (implements getAllUsers, saveUser, deleteUser, etc.)

这些类应该实现公共接口或继承公共抽象类(如果它们共享公共逻辑)。

对于基本的持久性操作(更新,删除,创建),我有点偏好在存储库类而不是实体中移动它们。我宁愿避免使用“智能”实体对象。在我看来,它更有意义。但是,有很多人不同意(这里确实没有对错)。

答案 1 :(得分:0)

我有一个类似于你的数据模型结构,其中类表示它们的表对应物。在检索多个“用户”或“类别”等的情况下,我在类中有一个静态方法,它返回该类的实例。例如:

class User{
    public static function fetchUsersForBusiness(Business $business){
        //fetch code here into variable $users from database...
        $userObjs = [];
        foreach($users as $userData){
            $userObjs[] = new User($userData);
        }
        return $userObjs;
    }
}

class Business{

}

以下代码将返回符合特定条件的所有用户(在这种情况下,与他们关联的业务)。然后我将它们作为对象返回。

我发现这个模型相当成功,并且已经在多种语言中使用它,包括Java,PHP和Swift。希望它可以帮到你。