如何在CakePHP中重构更好的模型函数?

时间:2009-12-06 11:59:17

标签: php cakephp cakephp-appmodel

我正在阅读编程最佳实践,据说在创建函数时我们应该让它只做一个特定的任务。

我有模型函数来检索数据及其相关数据。例如:

$这 - >学生为> StudentAssignments();

目前,此功能会检索学生的作业以及每项作业的问题和有关学生的数据。我全部使用它们。我的困境是,如果我尝试创建单独的函数来检索相关数据(学生和问题数据),那么因为我正在生成更多对数据库的调用,所以它很费力。

你们会建议什么?

3 个答案:

答案 0 :(得分:1)

我觉得你做得很好。但是你应该重新考虑将你的功能重命名为

$this->Student->getStudentAssignmentsWithQuestions

或者你认为合适的任何东西。我认为应该尝试尽可能少地调用数据库(我假设您在那里执行某个连接),而不是通过特定方法获取每组元素。这可能会导致您获得更多方法(因此必须编写更多测试),但我认为这是正确的方法。

捍卫设计论点: 您的方法只执行一项任务;它根据每个作业的问题获取学生的作业。

答案 1 :(得分:1)

进行这种重构时要记住一些事情......

我的模型中通常会有一个Model-> getSomethingAndSomethingElse函数。 这些函数是公共的,可以被称为代替从Controller执行复杂(或任何)查找调用。

我通常会在模型中构建一小部分私有函数。 在你的情况下,我可能会有...... ...

学生为> getStudentAssigmentsWithQuestions

然后调用一些私有函数,即

Student-> getStudent可能会调用Student-> joinStudentAssignment,而后者可能会调用Assignment-> joinAssignmentQuestion等。

双下划线前缀已被删除,因为降价因为它们而需要加粗。如果您使用的是php5,只要您使用“私有”或“保护”关键字,下划线就不是很重要。

基本上,我使用public方法作为一组非常具体的查询构建或建立模型内私有函数的关联的容器。这允许我有一个返回复杂数据的api,但是我从小块构建查询或结果集(取决于数据的类型,涉及的关系或查询复杂性) - 理想情况下可以用于超过一个公共函数调用。

答案 2 :(得分:0)

不,如果您严格关注代码重构,您应该将该blob分解为执行单个任务的简单函数,如您所说。是的,您将获得更多数据库,但考虑到在cakephp中使用缓存是多么容易,性能应该不是问题。如果是,那么你不应该担心代码重构。