|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 夜行 于 2015-4-22 14:27 编辑
第一篇写了如何封装包裹传入的简单参数,小喽啰总是好解决的。现在如果传入的是一个数组,我们应该如何处理?大部队来了……
第一篇的链接:http://club.excelhome.net/thread-1200059-1-1.html
我们照样弄个长方体的类Cuboid- Private ar
- Function init(crr)
- ar = crr
- End Function
- Property Get arr()
- arr = ar
- End Property
- Function perimeter() '计算一个长与两个宽的和
- brr = arr
- For i = 1 To UBound(brr, 1)
- perimeter = brr(1, 1) + brr(i, 2) * 2
- Next
- End Function
- '……其他大量索引该数组的方法
复制代码
传入的参数是一系列长、宽的二维数组:arr = [{10,3;10,4;10,5}]
按第一篇的思路,我们把传入的数组用一个方法包裹封装起来了。但arr这个方法仅仅是返回了这个数组,而使用它的方法,必须了解数据的哪一部分位于这个数组的哪一个索引位置上。
方法perimeter不仅知道如何计算类周长(周长是2个长2个宽),它还清楚的知道在数组的什么地方可以找到长与宽的数据。
遍历数组时,长在第一个位置,宽在第二个位置,它依赖于数组的结构。
如果这个数组的结构变了,比如,长与宽的位置颠倒了,那么这个方法就必须更改了,而其他引用该数组的方法也要进更改,这些方法是脆弱的。
它们明修栈道,暗渡陈仓,表面上说投降我们了,可背后捅了我们一刀,暗箭难防啊。
它们不符合DRY原则,长跟宽在哪个索引位置的信息不应该被多次复制,它们只应该存在于一个地方,我们应该用一个方法把它们包裹起来。
修改后的类如下所示:
- Private Type Taller
- length As Long
- wide As Long
- End Type
- Private tall() As Taller
- Private count
- Function init(arr)
- tallify arr
- End Function
- Function perimeter()
- For i = 1 To count
- perimeter = tall(i).length + tall(i).wide * 2
- Next
- End Function
- Private Function tallify(arr) As Variant '这个方法用来包裹传进来的数组参数,如果数组内部结构有变动,我们只需要再这一个地方进行更改。
- For i = 1 To UBound(arr, 1)
- ReDim Preserve tall(1 To i)
- tall(i).length = arr(i, 1)
- tall(i).wide = arr(i, 2)
- Next
- count = i - 1
- End Function
复制代码 上面的这个perimeter方法对那个传入数组的内部结构一无所知,它所知道的都是我们可以控制。tallify这个方法只包含少量的几句代码,只有它能理解传入的数组参数,大部队敌人来了又怎样,我们派一个小分队就解决了!
这种样式的代码让你不会受到外部所属数据结构变化的影响,并且还能提高代码的可读性(你说你不懂英文?咳咳,学学就懂了),同时它也更符合DRY原则。
当然如果你能够控制输入,那么以上完全都不是必要的;如果你不能确定,请将这种不确定的影响降到最低。
看懂的朋友,觉得还行的,给赏个花吧……写手不容易啊……呵呵……
|
评分
-
9
查看全部评分
-
|