我有一个与类设计有关的问题。我想我理解面向对象编程和设计背后的理论,但我很难在我的网络应用程序上练习它。
我们假设我有这个网络应用程序,我正在跟踪我的习惯。我有称为“习惯”,“事件”和“目标”的数据库表。我想我会做一个叫做“习惯”的课程,这听起来很合乎逻辑。 到现在为止还挺好。但我也有应用程序的主屏幕,我想显示我所有习惯的列表(每个习惯都有一个显示的名称,但我还需要显示每个习惯的'事件'表中的一些信息) 。 现在我的问题是:这个习惯清单,是一个独特的阶级?还是一般的'习惯'级方法?什么是好的做法?这取决于什么样的事情?在做出这些决定时我需要考虑哪些方面?
答案 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
个对象组织到适当的数据结构中是系统另一部分的责任。