我有几个对象,如产品、订单等。当我从数据库中获取信息时,我会连续创建一种对象类型。然后我使用创建的那个对象。我读到这叫做工厂。
这样做有什么好处吗?特别是在像 PHP 这样的松散类型语言中?
谢谢
编辑:这是我获得数据库不可知论的地方吗?这就是 ORM 的本质吗?
我有几个对象,如产品、订单等。当我从数据库中获取信息时,我会连续创建一种对象类型。然后我使用创建的那个对象。我读到这叫做工厂。
这样做有什么好处吗?特别是在像 PHP 这样的松散类型语言中?
谢谢
编辑:这是我获得数据库不可知论的地方吗?这就是 ORM 的本质吗?
通过从数据库查询创建对象,您定义了对象和关系数据库之间的映射。这正是 ORM 软件所做的。
通过这样做并确保您的对象永远不会直接访问数据库,而是使用您的数据库访问函数/对象,您可以通过两种方式保护您的代码免受更改:
对数据库架构的更改不会影响您的代码。相反,代码更改将仅位于您的数据库访问对象中。
您可以通过实现遵循与原始接口相同的新数据库层来切换到不同的 DBMS。您的其他对象不需要更改。
我想从这个意义上说,你获得了一些数据库不可知性,但你可能最好使用提供开箱即用的不可知性的数据库库。
在我看来,优势在于您正在使用对象并获得面向对象语言提供的所有优势。然后,您可以在更高级别(根据您定义的对象)读取域逻辑,而无需筛选数据库查询。自己编写 ORM 可能很困难,但有一些工具可以帮助您。
这是我通常采取的路线,但我不做任何 PHP 开发,所以我不能说它适用于那种语言的效果如何。
您所描述的是数据访问层的实现 - 它听起来不像工厂方法模式的示例,也不是抽象工厂模式。
是的,ORM 弥合了从对象到关系数据库的鸿沟,并且可以充当您的数据访问层。请记住,您使用的任何 ORM 都有某些优点/缺点/限制。根据您的经验和要求,编写自己的数据访问层有时是个好主意;不要觉得你必须使用第 3 方 ORM。
是的,一个好的数据访问层可以很容易地替换你的存储机制(不同的数据库、XML、平面文件等等),而不需要改变你的业务逻辑、UI 或其他代码。
无论是松散类型语言还是强类型语言,如果您使用的是 OO 语言,使用数据对象(由 ORM 或本地数据访问层提供)编写代码会容易得多。我确信可以编写一个没有数据访问层的系统,您的业务层直接与数据库一起工作。但实施和维护可能更具挑战性。