我有一个关于类设计的问题。我想我理解了面向对象编程和设计背后的理论,但是我很难在我的web应用程序上实践它。
让我们假设我有一个web应用程序,我记录我的习惯。我有名为"习惯"、"事件"one_answers"目标"的数据库表。我想我会开一门叫做"习惯"的课,在我看来这听起来很合乎逻辑。到目前为止一切顺利。但我也有应用程序的主屏幕,我想在那里显示我所有习惯的列表(每个习惯都有一个名字,但我还需要显示"事件"表中的一点信息)。现在我的问题来了:这一系列习惯,是一个不同的类别吗?还是一般"习惯"类的方法?什么是好的练习?这取决于什么样的东西?在做这些决定时,我需要考虑哪些方面?
Habit
类应该代表一个单一的、独特的习惯;它不应该知道如何生成其他Habit
对象的集合。PeteH给出了一个很好的答案,只是PHP不支持类java泛型。
在这种情况下,我要做的可能是有一个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
对象组织成适当的数据结构是系统的另一部分的责任。
不,"习惯列表"位于习惯类的上方。
我不懂php,但是在c#中你可能有:
class Habits : List<Habit>
{
....
}
允许你在"习惯"级别添加功能,或者更直接,你可以直接使用
List<Habit>
,如果习惯级别不需要任何功能。
但是习惯和习惯是完全不同的。