ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 2599|回复: 6

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-22 13:27 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:类和类模块
本帖最后由 夜行 于 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原则。
当然如果你能够控制输入,那么以上完全都不是必要的;如果你不能确定,请将这种不确定的影响降到最低。

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








评分

参与人数 3鲜花 +6 收起 理由
YZC51 + 2
zhouzhongchi + 2 优秀作品
普发银行 + 2

查看全部评分

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2015-4-23 19:55 | 显示全部楼层
嗯,从类模块引出设计模式理念,对会员来说是个好事

评分

参与人数 1鲜花 +2 收起 理由
夜行 + 2 谢谢大大的肯定哈!

查看全部评分

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-10 18:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-5-10 21:25 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

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

GMT+8, 2019-7-19 18:42 , Processed in 0.088513 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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