ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-6 22:18 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:类和类模块
本帖最后由 夜行 于 2015-5-6 22:32 编辑

咳咳……说了不写,为啥还写呢?——因为版主给了颗糖吃!
本系列基本上是一篇探讨一小点的内容,让大家容易消化,自己写得也没那么累哈。
纯分享啊,无偿啊……各种赔本啊……懒一点也情有可原是吧……
至于会写到哪算数,咳,这是个问题,睡觉前我会想想,目前还没想过,顺其自然哈……

前面几篇中我们探讨了如何管理外来参数的问题,后面几篇,我们来看看如何跟其他的类合作:总的原则当然是低耦合啦。

在最初学习时,经常会冒出个想法,前辈们经常都说要低耦合,那干脆不耦合不行吗?
——不要说我笨哈,这真是我的学习过程,答案公布如下,免得有人跟我一样纠结中:
不耦合就谈不上类的组合运用啦!

所以耦合是必须的,只是如何减少这种耦合度才是我们要考虑的!

那如何减少耦合度呢?——只知道应该知道的,不该知道的东西不要知道!
知道的太多,后果……你懂的!嘿嘿……

扯了一篇的闲话,下面上重点,来看两个类:
零件(Parts类):它负责计算长方形零件(因为现有公司只生产长方形)的总价,总价 = 单价 * 零件周长,当然还有其他功能,我们暂时忽略。
  1. Private pric
  2. Private leng
  3. Private wid
  4. Private rect As Rects

  5. Property Get length()
  6.     length = leng
  7. End Property

  8. Property Get wide()
  9.     wide = wid
  10. End Property

  11. Property Get price()
  12.     price = pric
  13. End Property

  14. Function init(price, length, wide)
  15.     pric = price
  16.     leng = length
  17.     wid = wide
  18. End Function

  19. Function total()
  20.     Set rect = New Rects
  21.     rect.init length, wide
  22.     total = price * rect.perimeter
  23. End Function

  24. '其他功能方法……
复制代码

长方形零件(Rects)
  1. Private leng
  2. Private wid

  3. Property Get length()
  4.     length = leng
  5. End Property

  6. Property Get wide()
  7.     wide = wid
  8. End Property

  9. Function init(length, wide)
  10.     leng = length
  11.     wid = wide
  12. End Function

  13. Function perimeter()
  14.     perimeter = (length + wide) * 2
  15. End Function

  16. '……
复制代码
它们之间的合作是这样的:
  1. Dim o As New Parts
  2. Sub old_parts()
  3.     o.init 2, 3, 4   '单价,长,宽
  4.     o.total
  5.     '……
  6. End Sub
复制代码


这两个类,表面看上去似乎挺平常的,但其实暗藏杀机,我们后面一一分解,这篇分解不完,下篇继续分解。

首先一个耦合是Parts类的,知道了Rects类的名字,如果Rects类的名称改变,相应的Parts类也要改变了。
另外Parts类的total方法中,引用了Rects类,那表明它只能计算长方形零件总价了,如果公司产品创新,有了正方形、三角形、圆形等等零件,这个方法就无能为力了。
当然还有其他问题,我们先关注以上这两点。

其实对于Parts类来说,它只要知道一个可以响应周长的对象就可以了,所以更改后的代码如下:
  1. Private pric
  2. Private part

  3. Property Get price()
  4.     price = pric
  5. End Property

  6. Function init(price, rect)
  7.     pric = price
  8.     Set part = rect
  9. End Function

  10. Function total()
  11.     total = price * part.perimeter
  12. End Function

  13. '其他功能方法……
复制代码

它与Rects类的合作如下所示:
  1. Dim o As New Parts
  2. Dim rect As New Rects

  3. Sub new_parts()
  4.     rect.init 3, 4 '长、宽
  5.     o.init 2, rect   '单价,零件
  6.     o.total
  7.     '……
  8. End Sub
复制代码

将Rects类的实例创建移动到Parts类外部,能将这两个类解耦出来,Parts类现在可以跟任何实现了计算周长方法的零件进行合作了。
这一点能够在VBA中较为方便的实现,依赖于VBA是一种弱类型的语言,变量不需要强制事先声明是哪个类型,它能根据实际需要自动进行切换。

好吧,这篇就告一段落了,这篇中还有一些问题,我们留到下一篇中继续分析。

大大们觉得还行的,赏点花吧……
苦求中——跟求月票似的……哈哈……

前面三篇链接如下:
http://club.excelhome.net/thread-1200059-1-1.html
http://club.excelhome.net/thread-1200435-1-1.html
http://club.excelhome.net/thread-1200865-1-1.html






评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-7 11:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-10 18:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2021-2-2 19:27 | 显示全部楼层
期待下面的帖子会是什么样子
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 16:49 , Processed in 0.044847 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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