我最近开始学习OOP和MVC但我已经遇到很多问题了! :)
我希望澄清一下此网站上的列表http://c2.com/cgi/wiki?DomainObject
- 识别哪些[他们的]引用表明聚合,哪些表示关联
- 复制自己
- 维护业务逻辑
- 将自己与同类型的其他域对象进行比较
- 促进选择打印或显示它们的其他对象
- 对其域名信息进行测试"
- 表明自己
- 验证自己
醇>
1:他们是指一个返回ID其他域对象的方法列表吗?
7& 8:他们的意思是什么"识别并验证自己"?应该如何工作,因为识别和验证可能需要访问持久层?
我在过去几个月里经常阅读但我实际上并不能说我对OOP / MVC有一个很好的想法:(
这是什么验证?为什么我需要它?它应该如何执行?如果数据来自数据库,为什么我需要验证,因为持久数据已经有效?
凭借我自己的洞察力,我为每个模型实体构建了这组类:
// it holds Student information, it can also contain partial data
// (for updating just certain fields in the database)
interface Student
{
getID($id)
setID($id)
getName()
setName($name)
getSurname()
setSurname($surname)
}
interface StudentValidator
{
validateInsert(Student $data)
validateDelete(Student $data)
validateUpdate(Student $data)
}
interface StudentMapper
{
getByID($id)
getAllByClassroomID($crid)
updateByID(StudentValidator $v, int $id, Student $data)
deleteByID(StudentValidator $v, int $id)
deleteAllByClassroomID(StudentValidator $v, int $crid)
insert(StudentValidator $v, Student $data)
}
这距离合适的代码有多远? :)
提前致谢!!!
答案 0 :(得分:4)
域对象中的验证仅限于其包含的业务规则。例如,当调用$student->isValid()
时,域对象会看到,如果已经设置了名称和姓氏,以及它们是否在陌生的地方不包含数字(例如," Frederick William III"是完美的有效的,但不可能的,名称)。
这不包括数据完整性检查(例如检查学生的电子邮件地址是否尚未注册,因此违反了UNIQUE
约束)。数据完整性由映射器验证。如果您使用PDO进行持久性抽象,那么在完整性错误的情况下,它将抛出异常,您可以在映射器内部处理该异常,并在您尝试存储的域对象上设置错误状态。
"识别自己"有点模糊的描述。我会假设它会将这种操作称为比较对象(例如:$studentA === $studentB
以验证它是否是同一个学生)。
识别哪些[他们的]引用表明聚合,哪些表示关联
这一点讨论了域对象之间的交互。就像调用$course->addStudent($student);
一样,它会定义Course
和Student
实例之间的某种关系。我在UML方面有点生锈,但我认为这表明:
一个简化,有点笨拙的例子,它说明了你所遇到的所有问题可能会是这样的:
$student = new Student;
$studentMapper = new StudentMapper($pdo);
$student->setId(42);
if (!$studentMapper->fetch($student)) {
// error , missing student
return;
}
// found the one with ID 42
$course = new Course;
$courseMapper = new CourseMapper($pdo);
$course->setId(31);
if (!courseMapper->fetch($course)) {
// missing course
return;
}
$course->addStudent($student);
if ($course->isValid() && $student->isValid()) {
// check if there are free spots in course
// and student has prerequisites
$courseMapper->store($course);
$studentMapper->store($student);
}
是否有课程 - 当地图选手试图存储数据时,会检查学生双重预订。
注意:您也可能会注意到,这开始闻起来像交易的情况。这是大规模OOP代码库中使用Units of Work的常见原因之一。
注意nr.2:请记住"域对象"和#34;域对象集合"是两件事。这些实体的持久性也是如此。有点像this旧帖子中描述的那样。