什么是域对象及其目的是什么?

时间:2014-05-12 20:43:28

标签: php oop model-view-controller

我最近开始学习OOP和MVC但我已经遇到很多问题了! :)

我希望澄清一下此网站上的列表http://c2.com/cgi/wiki?DomainObject

  
      
  1. 识别哪些[他们的]引用表明聚合,哪些表示关联
  2.   
  3. 复制自己
  4.   
  5. 维护业务逻辑
  6.   
  7. 将自己与同类型的其他域对象进行比较
  8.   
  9. 促进选择打印或显示它们的其他对象
  10.   
  11. 对其域名信息进行测试"
  12.   
  13. 表明自己
  14.   
  15. 验证自己
  16.   

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)
}

这距离合适的代码有多远? :)

提前致谢!!!

1 个答案:

答案 0 :(得分:4)

验证&东西

域对象中的验证仅限于其包含的业务规则。例如,当调用$student->isValid()时,域对象会看到,如果已经设置了名称和姓氏,以及它们是否在陌生的地方不包含数字(例如," Frederick William III"是完美的有效的,但不可能的,名称)。

这不包括数据完整性检查(例如检查学生的电子邮件地址是否尚未注册,因此违反了UNIQUE约束)。数据完整性由映射器验证。如果您使用PDO进行持久性抽象,那么在完整性错误的情况下,它将抛出异常,您可以在映射器内部处理该异常,并在您尝试存储的域对象上设置错误状态。

自我识别

"识别自己"有点模糊的描述。我会假设它会将这种操作称为比较对象(例如:$studentA === $studentB以验证它是否是同一个学生)。

参考资料

  

识别哪些[他们的]引用表明聚合,哪些表示关联

这一点讨论了域对象之间的交互。就像调用$course->addStudent($student);一样,它会定义CourseStudent实例之间的某种关系。我在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旧帖子中描述的那样。