设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 独孤残云
打印 上一主题 下一主题

[原创发布] 【新手互助】利用Mix-in(糅合)构建低耦合脚本

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
14 小时
注册时间
2008-5-7
帖子
74
11
 楼主| 发表于 2010-8-19 19:25:47 | 只看该作者
回复 紫苏 的帖子
原来如此,所以说系统中一些原有的类才是真正的子类,而其内部也早就留有super关键字以供新增基类的扩展吗?多谢紫苏~ 受教了~

   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
14 小时
注册时间
2008-5-7
帖子
74
12
 楼主| 发表于 2010-8-19 19:32:05 | 只看该作者
回复 红灯 的帖子
Super关键字最早见于java中,用于子类方法执行完毕之后自动调用基类方法。而关键字include,可以指定一个新增的模块成为旧有模块的基类,这样一来,RM在执行原有方法的同时会自动调用我们自己写的方法。使用这种方法可以将自己写的脚本与原系统的耦合度降到最低~

   

点评

不是我说你,连贴也不要这么明显嘛……  发表于 2010-8-19 20:16
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3126
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

13
发表于 2010-8-19 20:20:57 | 只看该作者
Ruby无接口也无多继承,所以用一个模块的include来达成多继承性。
现在来看,Mix-in的模块大多数都是接口协议(比如Comparable)
但是我想说,在大量使用全局变量的情况下,RM脚本已无低耦合性可言。
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
14 小时
注册时间
2008-5-7
帖子
74
14
 楼主| 发表于 2010-8-19 21:18:03 | 只看该作者
本帖最后由 独孤残云 于 2010-8-23 13:10 编辑

回复 IamI 的帖子
解决问题并非一定要依赖于全局变量,尤其不要在新增脚本中再度引入额外的全局变量,以供系统原有脚本调用。全局变量本身就是耦合的主要来源。
另外,我的目的是“将自己写的脚本与原系统脚本的耦合度降到最低”,而不是深入剖析系统原有脚本间的耦合度高低~呵呵~
抱歉,6R是我接触的第一个不允许连帖的论坛,总是不经意就……

   

点评

我想IamI所说的是默认脚本中已然使用了大量的全局变量。此类常识性问题,你总该先花点时间看一看吧  发表于 2010-8-19 21:47
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2010-7-5
帖子
483
15
发表于 2010-8-19 21:44:19 | 只看该作者
事件党的会心一瓢.
多谢LZ共享,我以后也要学学脚本....不过快中考了555初三是不可能的了...
回复 支持 反对

使用道具 举报

Lv1.梦旅人

前进之卒

梦石
0
星屑
55
在线时间
20 小时
注册时间
2010-8-17
帖子
176
16
发表于 2010-8-19 22:08:53 | 只看该作者
受教了,多谢各位前辈。赶紧做笔记。
开始拼吧!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
17
发表于 2010-8-20 06:10:36 | 只看该作者
本帖最后由 紫苏 于 2010-8-20 06:15 编辑

回复 独孤残云 的帖子

原有的类内部有 super 是因为这个类的方法需要调用基类的方法,比如 Game_Player#update 里有 super 是因为还需要调用基类 Game_Character 里的同名方法,这时在 Game_Player 里 mixin 就相当于在继承链中的 Game_Player 和 Game_Character 之间插入了一个新的节点(匿名类),Game_Player 是它的子类,Game_Character 是它的基类,而如果这个节点的同名方法本身也调用 super,那就会依然调用 Game_Character#update ^_^

显然没有爸爸的类就不能这么做了,比如各种场景类,即便把同名的方法绑扎到模块中糅合进去,由于原场景类里没有 super,模块中的同名方法仍然不会被调用
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

18
发表于 2010-8-20 11:18:26 | 只看该作者
本帖最后由 八云紫 于 2010-8-20 11:27 编辑

  1. module A
  2. def a
  3. p "i\'m module method"
  4. end
  5. end

  6. class B
  7. include A
  8. def a
  9. p "i\'m B\'s method"
  10. end
  11. end

  12. B.new.a                       #i'm B's method

  13. class C
  14. def a
  15. p "i\'m C\'s method"
  16. end
  17. include A
  18. end

  19. C.new.a                   #"i\'m C\'s method"
复制代码
六祈的例子在 VX 的运行会变成这样,无论如何都只调用原类的方法,很奇怪。
紫苏大的也一样。

系统不同??

回复 红灯 的帖子

include 给我的感觉就是 类似单纯的复制粘贴,把模块里的全部东东复制一份,贴到 include 所在的地方,感觉上和 C 里的 #include 类似。

super 使用在有继承关系的类中,当子类需要使用已经定义好的父类的同名方法的时候,可以加 super 。

点评

明白了,是我写错了~~悲剧~~~  发表于 2010-8-20 12:31
依照紫苏大人的说法,include的module会插入一个匿名的父模块,不会覆盖原方法,然而原方法调用super,就会调用该匿名父模块的方法  发表于 2010-8-20 11:59

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
14 小时
注册时间
2008-5-7
帖子
74
19
 楼主| 发表于 2010-8-23 08:35:40 | 只看该作者
本帖最后由 独孤残云 于 2010-8-23 08:44 编辑

回复 六祈 的帖子
关于六祈大人“我想IamI所说的是默认脚本中已然使用了大量的全局变量。此类常识性问题,你总该先花点时间看一看吧”的说法……
请六祈大人事先考虑清楚,系统中原有脚本的全局变量是否会对新脚本的低耦合度带来影响。注:我这里所说的低耦合度,当然是指新增脚本相对于原系统自带脚本的低耦合。
新手,只不过是相对于Ruby语法而言;至于软件工程中的基本理论,我多少还是有点自信的。另,当认定他人连“常识性问题”都没搞明白时,请事先考虑自身说法有无疏漏,否则结论一旦被推翻,后果是很尴尬的。


   

点评

不好意思,我【真】没明白你这个低耦合度的复杂含义,以及你哪里有看懂IamI的意思  发表于 2010-8-23 11:58
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
14 小时
注册时间
2008-5-7
帖子
74
20
 楼主| 发表于 2010-8-23 12:27:37 | 只看该作者
本帖最后由 独孤残云 于 2010-8-23 12:33 编辑

回复 六祈 的帖子
在六祈大人怀疑我“常识性问题”没弄明白之前,希望您能回答我几个问题:
1.Train_Actor脚本源码您是否详细看过?
2.Train_Actor中举不胜举的以$为前缀的全局变量您是否注意到过?
3.将此脚本加入到系统或者从系统剔除是否影响原有脚本的正常运行?
如果您这几个问题都能回答上来,但依然没明白我的意思,请恕本人【真】的无能为力。


   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-15 06:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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