4

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

我得到了检索数据及其相关数据的模型函数。例子:

$this->Student->StudentAssignments();

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

你们有什么建议?

4

3 回答 3

1

我觉得你做得很好。但是您应该重新考虑将函数重命名为

$this->Student->getStudentAssignmentsWithQuestions

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

为设计论点辩护:您的方法只完成一项任务;它使用每个作业的问题来获取学生的作业。

于 2009-12-06T12:08:29.143 回答
1

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

我的模型中通常会有一个 Model->getSomethingAndSomethingElse 函数。这些函数是公共的,旨在被调用以替代来自控制器的复杂(或任何)查找调用。

然后我通常会在模型中建立一小部分私有函数。在你的情况下,我可能有一些类似的东西......

学生->getStudentAssigmentsWithQuestions

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

Student->getStudent 可能会调用 Student->joinStudentAssignment 进而可能会调用 Assignment->joinAssignmentQuestion 等。

双下划线前缀已被删除,因为 Markdown 想要加粗。如果您使用的是 php5,只要您使用“private”或“proteced”关键字,下划线并不重要。

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

于 2009-12-07T19:42:22.273 回答
0

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

于 2009-12-06T22:25:59.920 回答