如何在更复杂的OOP概述中正确构造类和方法

时间:2014-01-10 03:38:57

标签: php mysql

我正在尝试理解高级PHP OOP原则,已经编写了程序Php多年。我想知道是否有一个经验法则,如何最好地将函数分组到类中以及如何规划要抽象/扩展的类?如果没有,你能否推荐任何可能有用的高级阅读材料。

我已经阅读了一些(自定义的)'高级'OOP教程。这些示例告诉我如何创建非常松散耦合的对象的基础知识,这些对象具有在大量抽象类中定义的非常小的属性。我还阅读了其他(坏)教程,这些教程基本上将函数转换为方法并将它们封装在类中 - 我知道它们编写得不好,所以不想模仿它们。

但是,我不清楚如何决定构建我的项目的类 - 我不确定我是否应该首先考虑应用程序的宏功能或者经常执行的操作。

以一个网站为例:   - 用户可以注册并具有不同的权限,具体取决于用户    水平   - 用户可以编辑其用户详细信息,上传照片,注册邮件列表以及与其他用户加入群组   - 管理员可以在5个不同的模块区域内在站点中创建新的部分   - 用户可以在这些不同的不同部分发布文章和评论

1)如果管理员可以在5个不同的模块区域(单级,双级和三级博客,论坛,民意调查)中创建一个部分,我应该考虑每个模块1个类吗?

或者2)我应该为管理员创建的每个新部分生成一个新的“类”吗?

或3)用户是整个站点的核心焦点 - 用户与模块和部分进行交互 - 所以我是否创建了一个包含插入,编辑,删除方法的大型用户类?

接下来,最好把方法放在哪里?

a)我将需要频繁使用SQL插入子句 - 我需要在有人注册时插入用户表,在有人制作或加入组时插入到组表,或发布文章,评论或IM - 所以我将使用类似下面的方法...但是这应该嵌套在所有其他类中,还是在每个模块类中重复?

    // runs a sql query
    public function runQuery($qry) {
        $result = $this->mysqli->query($qry);
        return $result;
    }

同样可以多次向用户发送电子邮件 - 当他们注册激活他们的帐户时,他们加入邮件列表时,如果他们忘记了密码......所以我想我需要一种方法。

正如你所看到的,我很困惑我应该把我的方法放在哪个类中,以及构建我的网站的类。

我很确定在开始之前我不需要考虑“所有”我的功能,因为这对于用户可能会建议新功能的敏捷开发环境不会很好,所以我希望你可以提供一些相对简单的指导。

这只是我以前在程序上编码的网站的众多示例中的一个,现在想要开始考虑OOP术语,所以任何指针都会非常感激!

由于

1 个答案:

答案 0 :(得分:0)

如果不了解你真正想要的是什么,很难找到合适的解决方案。当您遇到问题/功能请求时,您必须设计应用程序。一切都取决于功能/问题。

有许多不同的解决方案,每个解决方案都适用于特定情况。如果不深入了解你想要解决的问题,我无法回答你的问题。唯一认为我可以建议:   - 亲吻 - 保持简单愚蠢   - 固体原则,特别是单一责任规则 - 每个班级只应对一件事负责。例如,如果您有User对象,则至少应该有三个类。 UserEntity或UserDomain - 对象的简单表示,该用户的存储库/存储,它为您提供给定用户的基本操作(CRUD - 创建,读取,更新,删除),然后您应该有一个处理交互的模块,服务, (例如,在不同的用户之间)。一个班级越少越好。

开始的好方法是至少阅读一些关于设计模式,SOLID,可能关于DDD(领域驱动设计)。我也建议看看CleanCoders。鲍勃叔叔非常(在我看来)有关软件开发的视频教程。

我曾经说过,如果你想做正确的事情,你必须做两次。在第一种方法中,您不知道您可以期待什么,如果不深入了解您所面临的情况,您将无法获得最佳解决方案。 当我写一段代码时,例如一个类,我总是写它至少两次。几乎每个类的部分都在开发过程中被重构,以便删除重复的代码,提高性能。当开发人员第一次提供完美的解决方案时,这种情况非常罕见。