当使用ORM表示表时,使用非表特定函数是否明智?

当使用ORM表示表时,使用非表特定函数是否明智?,orm,language-agnostic,Orm,Language Agnostic,例如(不是逐字记录) 或者ORM应该只是桌子,而不是别的 这可能是一个主观的观点,因为每个人都有自己的观点,但在编程中,你做的事情和你真正不应该做的事情。我只是想知道这是不是其中之一。不是,这不是个好主意。如果没有别的,那就是违反 如果您正在制作ORM,那么您的实例应该只处理数据存储/检索。在您的示例中,getDuration()是域业务逻辑的一部分,应该驻留在域中 基本上,这里讨论的是和模式之间的差异。而且,如果你试图编写遵循坚实的原则的代码,你会认为主动记录是一种反模式,这在长期内是不可减轻

例如(不是逐字记录)

或者ORM应该只是桌子,而不是别的


这可能是一个主观的观点,因为每个人都有自己的观点,但在编程中,你做的事情和你真正不应该做的事情。我只是想知道这是不是其中之一。

不是,这不是个好主意。如果没有别的,那就是违反

如果您正在制作ORM,那么您的实例应该只处理数据存储/检索。在您的示例中,
getDuration()
是域业务逻辑的一部分,应该驻留在域中


基本上,这里讨论的是和模式之间的差异。而且,如果你试图编写遵循坚实的原则的代码,你会认为主动记录是一种反模式,这在长期内是不可减轻的。

< P>不,这不是一个好主意。如果没有别的,那就是违反

如果您正在制作ORM,那么您的实例应该只处理数据存储/检索。在您的示例中,
getDuration()
是域业务逻辑的一部分,应该驻留在域中


基本上,这里讨论的是和模式之间的差异。而且,如果你试图编写遵循坚实的原则的代码,你会认为主动记录是一种反模式,这在长期上是不起作用的。

< P>除非有一些没有特定功能的应用特定的原因,答案是一个大的“是”。让我解释一下原因:

  • 在OOP中,对象不仅仅是数据结构。它把国家和行为联系在一起。这是面向对象编程的基本原理。它有一个状态,它有修改状态的方法。什么是实体?它是一个对象,一个业务对象。业务对象包含业务数据和逻辑。因此,他们确实需要有执行业务逻辑的方法。从业务对象中删除业务逻辑违背了OOP的本质。因为,最终你需要在某个地方实现这个逻辑,但那不是正确的地方。这段代码需要访问业务对象的状态,在大多数情况下,这会破坏信息隐藏(封装)的原则,这是我们首先使用OOP的原因之一

  • 现在,关于ORM!在这里,您需要满足两个需求:面向对象的设计和ORM。现在问问哪一个优先于另一个,或者,哪一个优先。你首先考虑ORM(或者其他任何存储手段),然后设计你的课程吗?还是设计类,然后将它们映射/存储?第一种方法是正确的方法。您可以设计应用程序,然后让ORM遵循此设计

  • 非访问器方法会阻止您使用ORM吗。不可以。这些方法不会阻止您在对象上使用ORM。ORM框架的设计者在设计它时就知道这个原理


  • 除非有一些特定于应用程序的原因导致没有该功能,否则答案是肯定的。让我解释一下原因:

  • 在OOP中,对象不仅仅是数据结构。它把国家和行为联系在一起。这是面向对象编程的基本原理。它有一个状态,它有修改状态的方法。什么是实体?它是一个对象,一个业务对象。业务对象包含业务数据和逻辑。因此,他们确实需要有执行业务逻辑的方法。从业务对象中删除业务逻辑违背了OOP的本质。因为,最终你需要在某个地方实现这个逻辑,但那不是正确的地方。这段代码需要访问业务对象的状态,在大多数情况下,这会破坏信息隐藏(封装)的原则,这是我们首先使用OOP的原因之一

  • 现在,关于ORM!在这里,您需要满足两个需求:面向对象的设计和ORM。现在问问哪一个优先于另一个,或者,哪一个优先。你首先考虑ORM(或者其他任何存储手段),然后设计你的课程吗?还是设计类,然后将它们映射/存储?第一种方法是正确的方法。您可以设计应用程序,然后让ORM遵循此设计

  • 非访问器方法会阻止您使用ORM吗。不可以。这些方法不会阻止您在对象上使用ORM。ORM框架的设计者在设计它时就知道这个原理


  • 谢谢你的回复。这对我来说是有道理的,有时候在做正确的事情和把事情搞砸之间有一条细微的界限。谢谢你的回复。这对我来说是有道理的,有时候在做正确的事情和把事情搞砸之间有一条很好的界限。你的建议是,应该围绕ORM构建域业务逻辑。这太疯狂了。目标应该是让ORM和业务逻辑独立工作。如果ORM存储一个域对象,它应该只需要该域对象实现一个特定的接口。“你的建议是,应该围绕ORM构建域业务逻辑”。我说的恰恰相反,我的建议有三个理由。他的类(一个实体)是一个域对象,因此它应该包含业务逻辑。。没有关系。看起来“是”是对文章主体中问题的回答,而不是标题。是的,我后来意识到我回答的第一句话有点含糊不清。你的建议是,应该围绕ORM构建域业务逻辑。这太疯狂了。目标应该是让ORM和业务逻辑独立工作。如果ORM存储一个域对象,它应该只需要该域对象实现一个特定的接口。“你的建议是,应该围绕ORM构建域业务逻辑”。我说的正好相反,给三个r
    /**
    @Entity
    */
    class Event
    {
       /**
          @Column 
       */
       protected $time_start;
       /** .. */
       protected $time_end;
    
       /** getters, setters, etc */
    
       /** @return duration of event as a string, non-table function */
       public function getDuration() { ... }
    }