作者contagious (布谷饱吃不堡)
看板Ruby
标题Re: [分享] 另一个 Parallel Assignment 玩法
时间Thu May 25 02:54:36 2006
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 那我也可以在 Java 这样子搞
: Object[] aParallelMethod(){
: java.util.Vector v = new Vector();
: //倒入要回传的值
: v.add(...);
: //
: Object[] result = new Object[v.size()];
: return result;
: }
是不是少了把 v 的内容 copy 到 object array 的部份?
: 问题是,离开初期 Coding 之後
: 我今天面对一个 function or method
: 我怎麽知道他回传的东西是什麽?
传回值是 method 行为的一个很重要的部份,
如果连 method 的传回值到底是什麽东西都不知道的话,
会知道这个 method 到底在做什麽事吗?
为什麽一开始会要用这个 method 呢?
: 可是,传统罗唆的方式,以 Java 来说
: 如果搭配 IDE 的程式码协助下(不要显示 Javadoc 也没差)
: 我可以在几乎不用翻 API 的前提下
: 就可以继续 coding 下去,不用担心型态记错
就算 IDE 提示了传回值的型态,型态并不代表传回值的意义,
也没有说明这个 method 到底做了些什麽事。
Type match 不代表程式正确,程式就算是 compile 都成功了,
也不保证一定是正确的程式。
这麽说来,提示传回值型态只是给了一个虚假的安全感。
程式的正确与否还是要靠 testing 来确认。
另外, Ruby 根本不担心型态的问题,
只要物件能完成要求的动作就好了。
这就是所谓 Duck Typing。
比如说这个例子:
class Cat
def speak
puts 'meow'
end
end
class Dog
def speak
puts 'woff'
end
end
def talk_to_me (obj)
obj.speak
end
talk_to_me(Cat.new)
talk_to_me(Dog.new)
Cat 和 Dog 都有 speak 这个 method,所以他们都能完成 talk_to_me 所需要的功能。
不用去建立 interface 或是继承架构来强迫他们是同一种「型别」。
不过要是那一天我传了一个不会 speak,
或是有 speak method 但是做的是完全不同的事的东西进去怎麽办?
所以你一定要写 Unit Test
其实这里在讲的就是 Static Typing 和 Dynamic Typing 的争议
可以参考 wikipedia 的说明
http://en.wikipedia.org/wiki/Type_system
只是想不到 parallel assignment 竟然会扯到 Typing 的问题..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.224.49.91