首页 > 解决方案 > 如何现代化:数据库对象作为整个应用程序的关联数组

问题描述

我是一个相对较新的程序员,所以希望我使用的是正确的术语;如果有不清楚的地方,请告诉我。在一个非常大的遗留应用程序中,我们有一个users数据库:

users
id       type      name
1        3         Jeff
2        2         Holly
3        4         Tyler

在大多数应用程序中,用户的信息都是作为关联数组获取的。我们碰巧使用 php,但我认为这个问题适用于任何语言。

问题

在整个应用程序中,我们有数百个从users关联数组中获取一行,$user['type']并使用它来执行一些业务逻辑;现在我们想改变type工作方式,甚至很难找到所有使用该字段的地方。“类型”一词用于注释、其他变量等。

问题

这是 OOP 的原因之一吗?OOP 是我们的主要解决方案,不会导致更多这个问题/修复它,还是有其他方法?似乎如果我们有一个用户对象而不是关联数组,并且正在做一个用户对象,$type = $user->getType();那么我们使用我们的 IDE 来查找所有用法会容易得多->getType()

标签: ooparchitecture

解决方案


抽象解决了这类问题。例如,假设用户被定义为具有用户名和电子邮件地址,数据类型均为“字符串”。如果这两个属性在它们的赋值中被意外切换,编译器不会拒绝它,并且由此产生的错误只会在应用程序运行时出现。

但是,如果将用户名和电子邮件地址分别抽象为“用户名”和“电子邮件地址”,则必须分配正确类型的值才能使编译器接受代码。

抽象可以在 OO 以外的编程范式中完成,但通常 OO 更适合它,因为抽象概念基本上是根据对象进行思考。

至于您的特定情况,它也可以通过抽象来解决。不是使用代表用户的“值数组”,而是使用用户的抽象,实现为具有“id”属性、“类型”属性和“名称”的类“用户” ' 财产。当您传递该抽象(或对象,当以 OOP 语言实现时)时,它所代表的内容及其物理定义是没有歧义的(即 int 类型的 'id'、int 类型的 'type'、' name' 类型的字符串)。

有人说强类型解决了这个问题,但如果不强制抽象,这不一定是正确的。回想一下反转用户名和电子邮件地址的示例:即使编译器强制检查用户名是字符串,电子邮件地址是字符串,它仍然无法检测到您在分配它们的值时已经切换了两者。

也有人说只有面向对象的语言才能解决这个问题。同样,这是不正确的:只要语言支持抽象并且程序员投入工作,就可以避免问题。例如,struct在 C 中可以做到这一点——这也是声称可以使用非 OOP 语言进行 OOP 的论据。

说了这么多,在实践中,你会权衡你需要多少抽象与这样做所需的努力的好处。例如,对于上面的示例,不一定要抽象用户名和电子邮件地址,因为现代 IDE 提供了足够的提示来帮助减少此类潜在错误。


推荐阅读