再次理解编程中的:抽象数据类型(ADTs)

抽象数据类型(ADT,abstract data type)是指一些数据以及这些数据所进行操作的集合。面向对象编程中,理解 ADT 是很重要的,当程序员充分理解了 ADT 后可以写出更加容易实现、修改的类(也就是 Go 中的 struct 以及方法)。

假如我们有一个界面,可以显示多种颜色、各种大小,如果没有用到 ADT,那么代码看起来类似于这样:

currentColor = "red"
currentHeight = 10
也就是说很直观的直接将功能代码写上去,如果是一个更复杂的功能,那么等号后面的内容就会更多。这样写不是不可以,而是我们可以使用更好的方式来实现。

隐藏实现细节

可以将数据类型隐藏起来,意味着如果数据类型发生改变,你只需在一处修改而不会影响到整个程序。用白话来说,只在一个地方为这个字段信息赋值,而为其赋值这个操作封装起来,即使以后我们在赋值时改了代码,甚至说换了一种语言,对于调用者来说都是一样的。


改动更加独立

当我们想为界面增加更多功能时,只需在一处添加代码即可,而且这一改动不会影响到其他程序。


接口更加见名知意

对于直接用等号赋值这种代码,其实是不容易阅读的,就拿高度的赋值语句,10的单位是多少我们是不确定的,可能是mm,cm(尽管界面上都用px)。更好的做法我们在其接口就说明,甚至说对于不同的单位我们可以创建不同的接口。


代码正确性

假如我们界面有一个主题是边界都是黑色,那么我们之前的做法就是将 black 赋值给对应字段。其实这样做是有风险的,这样我们看代码时需要看到 black 这个单词才能知道是否正确,更好的做法我们可以增加一个接口:SetBlackTheme()。尽管这样我们看的是三个单词,但是对于使用者来说,不需要关心 black 这个单词了的赋值了。


无需在程序内传递多余数据

如果没有使用 ADT,对于当前界面的颜色来说,red 这个数据就需要一直使用,或者说将他定义成一个全局变量,但是将这个封装到结构内,在 ADT 的子程序内才可以使用这个结构,ADT 之外的子程序就不必关系这些数据了。


这样你的代码看起来就是大概就是这样:
currentTheme.SetRedColor()
currentTheme.SetBlackThemt()

currentTheme.SetHeightInPixels(10)


这些子程序的代码可能非常短---很可能就像此前我们看到的代码那么,拼凑法控制界面主题。这里的区别在于,你已经把主题的相关操作都隔离到一组子程序中了,这样就为需要操作主题的的其他部分程序提供了更好的抽象层,同时它也可以在针对主题的操作发生变化时提供一层保护。
今天就是非常简单的举了一个例子来简单的了解一下 ADT,但是大家在针对具体项目时还要具体分析的。希望对你有所帮助。
感谢阅读,祝大家生活愉快!