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经典代码实践指南
查看: 1771|回复: 3

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

[复制链接]

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






评分

参与人数 2鲜花 +4 收起 理由
lipton + 2 值得肯定
autocadr41 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

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

本版积分规则

关注官方微信,高效办公专列,每天发车

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

GMT+8, 2019-8-18 12:35 , Processed in 0.077560 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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