Oop 如何在整个应用程序中将数据库对象现代化为关联数组

Oop 如何在整个应用程序中将数据库对象现代化为关联数组,oop,architecture,Oop,Architecture,我是一个相对较新的程序员,所以我希望使用正确的术语;如果有什么不清楚的,请一定告诉我。在一个非常大的遗留应用程序中,我们有一个用户数据库: users id type name 1 3 Jeff 2 2 Holly 3 4 Tyler 在大多数应用程序中,用户的信息都是以关联数组的形式获取的。我们碰巧使用php,但我认为这个问题适用于任何语言 问题 在整个应用程序中,我们有成百上千的

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

users
id       type      name
1        3         Jeff
2        2         Holly
3        4         Tyler
在大多数应用程序中,用户的信息都是以关联数组的形式获取的。我们碰巧使用php,但我认为这个问题适用于任何语言

问题

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

问题


这是OOP的原因之一吗?OOP是我们的主要解决方案,不会引起更多的问题/解决问题,还是有其他方法?似乎如果我们没有关联数组,而是有一个用户对象,正在执行一个
$type=$user->getType()使用IDE查找
->getType()

抽象解决了这类问题,这将更容易。例如,假设用户被定义为具有用户名和电子邮件地址,这两种数据类型都是“string”。如果这两个属性在其赋值中被意外切换,编译器将不会拒绝这一点,并且产生的错误只会在应用程序运行时出现

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

抽象可以在除OO之外的编程范式中完成,但通常OO更适合它,因为抽象概念基本上是从对象的角度来思考的

至于您的特殊情况,它也通过抽象来解决。与使用表示用户的“值数组”不同,您将使用用户的抽象,实现为具有“id”属性、“type”属性和“name”属性的类“user”。当您传递该抽象(或对象,在OOP语言中实现时),它所表示的内容及其物理定义(即int类型的'id',int类型的'type',string类型的'name')没有歧义

有人说强类型可以解决这个问题,但如果不强制执行抽象,则不一定如此。回想一下颠倒用户名和电子邮件地址的例子:即使编译器强制检查用户名是字符串,电子邮件地址是字符串,它仍然无法检测到您在分配其值时是否已切换了这两个值

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

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