ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6932|回复: 12

[分享] 编写拥抱变化的代码(二)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-22 13:27 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:类和类模块
本帖最后由 夜行 于 2015-4-22 14:27 编辑

第一篇写了如何封装包裹传入的简单参数,小喽啰总是好解决的。现在如果传入的是一个数组,我们应该如何处理?大部队来了……
第一篇的链接:http://club.excelhome.net/thread-1200059-1-1.html
我们照样弄个长方体的类Cuboid
  1. Private ar

  2. Function init(crr)
  3.     ar = crr
  4. End Function

  5. Property Get arr()
  6.     arr = ar
  7. End Property

  8. Function perimeter()   '计算一个长与两个宽的和
  9.     brr = arr
  10.     For i = 1 To UBound(brr, 1)
  11.         perimeter = brr(1, 1) + brr(i, 2) * 2
  12.     Next
  13. End Function
  14. '……其他大量索引该数组的方法
复制代码

传入的参数是一系列长、宽的二维数组:arr = [{10,3;10,4;10,5}]
按第一篇的思路,我们把传入的数组用一个方法包裹封装起来了。但arr这个方法仅仅是返回了这个数组,而使用它的方法,必须了解数据的哪一部分位于这个数组的哪一个索引位置上。

方法perimeter不仅知道如何计算类周长(周长是2个长2个宽),它还清楚的知道在数组的什么地方可以找到长与宽的数据。
遍历数组时,长在第一个位置,宽在第二个位置,它依赖于数组的结构。
如果这个数组的结构变了,比如,长与宽的位置颠倒了,那么这个方法就必须更改了,而其他引用该数组的方法也要进更改,这些方法是脆弱的。

它们明修栈道,暗渡陈仓,表面上说投降我们了,可背后捅了我们一刀,暗箭难防啊。
它们不符合DRY原则,长跟宽在哪个索引位置的信息不应该被多次复制,它们只应该存在于一个地方,我们应该用一个方法把它们包裹起来。

修改后的类如下所示:
  1. Private Type Taller
  2.     length As Long
  3.     wide As Long
  4. End Type

  5. Private tall() As Taller
  6. Private count

  7. Function init(arr)
  8.     tallify arr
  9. End Function

  10. Function perimeter()
  11.     For i = 1 To count
  12.         perimeter = tall(i).length + tall(i).wide * 2
  13.     Next
  14. End Function

  15. Private Function tallify(arr) As Variant  '这个方法用来包裹传进来的数组参数,如果数组内部结构有变动,我们只需要再这一个地方进行更改。
  16.     For i = 1 To UBound(arr, 1)
  17.         ReDim Preserve tall(1 To i)
  18.         tall(i).length = arr(i, 1)
  19.         tall(i).wide = arr(i, 2)
  20.     Next
  21.     count = i - 1
  22. End Function
复制代码
上面的这个perimeter方法对那个传入数组的内部结构一无所知,它所知道的都是我们可以控制。tallify这个方法只包含少量的几句代码,只有它能理解传入的数组参数,大部队敌人来了又怎样,我们派一个小分队就解决了!

这种样式的代码让你不会受到外部所属数据结构变化的影响,并且还能提高代码的可读性(你说你不懂英文?咳咳,学学就懂了),同时它也更符合DRY原则。
当然如果你能够控制输入,那么以上完全都不是必要的;如果你不能确定,请将这种不确定的影响降到最低。

看懂的朋友,觉得还行的,给赏个花吧……写手不容易啊……呵呵……








评分

9

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-23 15:21 | 显示全部楼层
谢谢【普发银行】赏的鲜花哈……

TA的精华主题

TA的得分主题

发表于 2015-4-23 19:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
嗯,从类模块引出设计模式理念,对会员来说是个好事

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-4-24 08:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好文!收藏学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-24 19:48 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-10 18:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

发表于 2015-5-10 21:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-2-2 19:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-2-2 19:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-2-2 19:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不过还是有点疑问,不是用get和set方法就可以解决问题了吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 16:23 , Processed in 0.052931 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表