大家好!在日常的Android开发中,我们经常会遇到需要处理一组相关联数据的情况。比如,表示一个点的坐标(x, y),描述一个控件的位置和大小(left, top, right, bottom),或者存储一条用户信息(用户名、年龄、邮箱)。如果每次都用零散的变量来处理这些数据,不仅代码会显得杂乱无章,也极易出错。
今天和大家分享一个简单但非常实用的面向对象开发技巧:使用结构体来封装自定义的数据。这是一种将多个相关的属性打包成一个独立、可重用的数据类型的绝佳方式。
为什么要封装?不封装会怎样?
想象一下,如果你的项目中有许多地方都需要操作一个二维坐标点。
不封装的做法:
' 在窗口1中
变量 pointX = 10;
变量 pointY = 20;
' 在某个函数里使用它们...
移动坐标(pointX, pointY)
' 在窗口2中
变量 anotherX = 5;
变量 anotherY = 15;
' 同样的逻辑,又是两个参数...
移动坐标(anotherX, anotherY);这种方式的问题显而易见:
参数冗余:每个需要坐标的函数都要传递x和y两个参数,增加了接口的复杂性。
逻辑松散:x和y在逻辑上是一个整体,但在代码中却被拆分开来,容易被误用或遗漏。
难以扩展:如果未来想增加一个z轴变成三维坐标,所有涉及x, y的函数签名都需要修改。
封装后的做法:
定义 坐标 为 结构
变量 X 为 整数型
变量 Y 为 整数型
结束 定义
事件 按钮1.被单击(来源对象 为 视图)
' 将坐标包装成一个整体数据
变量 坐标1 = 创建 坐标(10,20)
移动坐标(坐标1)
变量 坐标2 = 创建 坐标(5,10)
移动坐标(坐标2)
结束 事件如何进行封装?
在上方代码中已演示,使用结构体语句即可封装。结构体相关在线文档:http://doc.vcnstudio.com/q/struct.html
进阶封装
结构体只能封装单一的数据结构,如果要想使“坐标”这个数据类型更强大的话,可以使用面向对象的方式封装,例如给当前“坐标”结构添加内部自定义函数。
定义 坐标 为 类型
变量 X 为 整数型
变量 Y 为 整数型
函数 坐标(X 为 整数型,Y 为 整数型)
本对象.X = X
本对象.Y = Y
结束 函数
函数 增加偏移(X偏移值 为 整数型,Y偏移值 为 整数型)
本对象.X = 本对象.X + X偏移值
本对象.Y = 本对象.Y + Y偏移值
结束 函数
函数 取文本坐标() 为 文本型
返回 "X值:" + 本对象.X + ",Y值:" + 本对象.Y
结束 函数
结束 定义
事件 按钮1.被单击(来源对象 为 视图)
变量 坐标1 = 创建 坐标(10,20)
坐标1.增加偏移(5,5)
调试输出("坐标偏移后的值:" + 坐标1.取文本坐标())
结束 事件封装带来的好处
代码更清晰 :数据的结构一目了然,属性,函数名能清楚地表达意图。
减少参数 :函数参数变得更简洁,只需传递一个对象即可。
提高可维护性 :当数据结构需要变更时(如增加字段),只需修改封装的类,影响范围可控。
增强可复用性 :封装好的类可以在项目的任何地方使用。
易于扩展 :可以在类中添加计算属性、业务方法,让数据“活”起来。
总结
在Android开发中,善用结构或类对自定义数据结构进行封装,是一种非常重要的编程思想。它让我们从面向过程的思维转向面向对象的思维,写出的代码更加模块化、健壮和优雅。
下次当你发现自己在多个地方传递一组相同的变量时,不妨停下来想一想:是否应该把它们封装成一个结构体或类呢?
这会让你的代码质量得到显著提升。
出一期怎么用AI吧,我用豆包写的vcn代码提示编译错误
正在制作中,敬请期待。
出一期怎么用AI吧,我用豆包写的vcn代码提示编译错误