课堂设计:习惯级或不同类别中的“习惯”列表?

时间:2013-05-10 19:59:39

标签: php oop class

我有一个与类设计有关的问题。我想我理解面向对象编程和设计背后的理论,但我很难在我的网络应用程序上练习它。

我们假设我有这个网络应用程序,我正在跟踪我的习惯。我有称为“习惯”,“事件”和“目标”的数据库表。我想我会做一个叫做“习惯”的课程,这听起来很合乎逻辑。 到现在为止还挺好。但我也有应用程序的主屏幕,我想显示我所有习惯的列表(每个习惯都有一个显示的名称,但我还需要显示每个习惯的'事件'表中的一些信息) 。 现在我的问题是:这个习惯清单,是一个独特的阶级?还是一般的'习惯'级方法?什么是好的做法?这取决于什么样的事情?在做出这些决定时我需要考虑哪些方面?

2 个答案:

答案 0 :(得分:2)

不,“习惯清单”位于习惯类之上。

我不知道php,但是例如在c#中你可能有:

class Habits : List<Habit>
{
   ....
}

这将允许您在“习惯”级别添加功能,或者甚至可以更直接地添加

List<Habit>

如果在习惯级别不需要任何功能。

但习惯和习惯肯定是彼此不同的。

答案 1 :(得分:2)

Habit课程应该代表一种独特的,独特的习惯;它不应该知道如何生成其他Habit对象的集合。 PeteH有一个很好的答案,除了PHP不支持Java-like generics

在这种情况下,我要做的是HabitModel,它提供了一种通过标识符检索特定Habit对象的方法,以及提供Habit个对象集合的方法。最常见的是在PHP中,你会看到这个集合作为一个数组返回。

<?php

class HabitModel {

    public function getHabitById($id) {
        $data = $this->db->query($habitSql); // assuming this will be something that returns data associated to $habit_id
        return new Habit($data);
    }

    public function getAllHabits() {
        $allData = $this->db->query($allHabitSql);
        $habits = array();
        foreach ($allData as $data)
        {
            $habits[] = new Habit($data);
        }

        return $habits;
    }

}

我建议考虑如何正确设计,你应该努力遵守单一责任原则。一个班级应该负责做一个单一的事情。在这种情况下,Habit对象负责表示与Habit相关联的数据;它不负责收集数据或处理多个Habit对象的结构。将Habit个对象组织到适当的数据结构中是系统另一部分的责任。