第2个比较傻的问题.
关于 OOP的问题函数的返回的问题.我正处于perl的OOP初学阶段, java是不会的.python是不会的.
所以问题比较初级.
问题,
初始化一个FreeOZ的类的对象a.
然后FreeOz类中有个函数(方法) 比如叫convert().
convert的作用就是把输入的英文string转成chinese.
因为perl是伪造的OOP,该方法有2种返回. (我估计纯的OOP的语言可能只有一个)
一就是返回1. 表示处理或者说方法执行成功了. 转换的string存在 对象a中的chinese属性中. 直接print 对象 a的chinese属性就ok了.
还有一种就是传统的面向过程的方法 直接把string 直接返回, 在调用的地方用一个变量b把这个值取得了.然后print b .
我感觉第一中方法比较 OOP. 但不是很了解正宗的OOP是怎么处理的. 原帖由 akai 于 2-8-2009 21:10 发表 http://www.freeoz.org/forum/images/common/back.gif
关于 OOP的问题函数的返回的问题.
我正处于perl的OOP初学阶段, java是不会的.python是不会的.
所以问题比较初级.
问题,
初始化一个FreeOZ的类的对象a.
然后FreeOz类中有个函数(方法) 比如叫convert().
conver ...
这个感觉有点过于感性了
如果一定要强调OOP,那么按照high cohesion原则,你这个功能要求的是一个翻译对象,
你无论如何不应该放到FreeOz类中去。至于翻译后的结果是否存放在原来的类中,这是一个值得思考的问题。
不过,再根据Open-closed原则,如果你把翻译后的结果存放到原来的类中,那么你就需要“抽象‘地存放,
比如你不能用chinese这类的属性来存放,否则,如果你那天要转成french/japanese,那就烦了,
你可以这样设计你的类:
Translator
- originalText : String
- resultText : String
- originalLang : enum-Language(可以考虑支持autodetect)
- translateLang: enum-Language
+ Constructor()
+ Constructor(orig : String)
+ Constructor(orig : String, origLang : enum-Language)
+ setOriginalText(String text)
+ setOriginalLang(enum-Language)
+ setTranslateLang(enum-Language)
+ translate() : boolean
+ getTranslateResult() : String
+ translate(orig : String, origLang : enum-Language, transLang : enum-Language) : String //下划线表示静态方法 复杂了 .复杂了. :$ :$
我就是想问 调用某个对象中的方法. 和面向过程一样的那样 有返回值? 原帖由 akai 于 2-8-2009 22:06 发表 http://www.freeoz.org/forum/images/common/back.gif
复杂了 .复杂了. :$ :$
我就是想问 调用某个对象中的方法. 和面向过程一样的那样 有返回值?
OOP并不是返回什么值的问题,而是一套编程的方法体系。
面向过程也是一套方法体系,需要深入学习才能掌握。
刚开始的时候,尽量参考一些proven的设计来学习。
有一本好书是很重要的。而选择一种好的入门语言也很重要。
十年前,Java可能是最好的OOP入门语言。但现在,JDK加入了太多新的语法特性,
不容易掌握,而单单学习JDK 1.4以前的语法子集,似乎又不足够。这是一个两难的问题。
我自己不懂Python,听说是一种“严格”的语言,同时又有点自然语言的味道。
C++太复杂,比Java复杂多了。如果单单比较这两种语言,建议用Java
Perl虽然有OOP的特性,但Perl本身是一个很强的面向过程的语言,
有大量面向过程的库(虽然也有大量面向对象的库)。所以,如果通过Perl来学习OOP,
似乎不是一个好的选择。 其实不必拘泥于oop,关键在于你是否能很好的运用类库。
另外有时间多看看DP, 感谢. 就不拘泥了. 反正能用可读 就ok了. 象叉蓝同学习 , 附上和朋友的一段对话.作为备忘.
Me: 比如 a这个对象有个x和y的2个字段。 test这个方法就是把x转换成hex, 然后存在y这个字段中。 如果a只有一个字段。 那test就直接 return处理后的结果。 如果a有y字段。 那test就返回true,内容存在y中。。
LEE: 对的。
Me: 那 一般第二种是比较“地道”的oop吧
LEE: 是。通常OOP都是把这些认为是对象的属性保存在对象实例本身。甚至 return true 也不是必要的,而是在方法里面抛出各种 Exception 来处理各种 false 的情况
大多数情况下 return $this 即可
Me: ok. 那就是设计的时候 我就要把y这个属性放进去
虽然y只是处理结果 。 而只有x是接受 参数。
Sent at 12:27 PM on Monday
LEE: 嗯。不过也不是绝对的。减少直接的 return value 可以减少对象之间的耦合度,但实际情况中总会有需要输出的。
如果这个y是该对象最终的处理结果,直接返回也没什么不可
Me: 嗯.对 我看到java有个print的方法.好像叫system.print什么的
就是直接返回的
LEE: 对啊。除非你的对象是一个完全独立的对象
Me: 主要就是我对面向对象不通. 而我现在要改的perl代码都是oop的. 我看perl又可以直接返回 又可以不返回 我就蒙了..
以前就糊弄用面向过程能解决问题 就ok了.
LEE: 呵呵。其实所有的理论都是双面性的,面向对象有时候不一定适用于所有的情况
最关键是设计本身的合理性 如果是c#,我会用expection。
回复 #2 key 的帖子
Key说的对,如果我做,我只设置成utility class,不会有状态的。 原帖由 akai 于 3-8-2009 12:48 发表 http://www.freeoz.org/forum/images/common/back.gifLEE: 是。通常OOP都是把这些认为是对象的属性保存在对象实例本身。甚至 return true 也不是必要的,而是在方法里面抛出各种 Exception 来处理各种 false 的情况
大多数情况下 return $this 即可
晕~~
这位LEE同学这句话不是太对吧。
首先,“出错”的时候,通过Exception还是返回值进行表达是一个有趣的话题,你可以参考一些有意思的讨论。
比如某期的程序员杂志。
其次,如果数据的返回是有益,比如能提高程序的流畅性,减少冗余代码,那是应该返回的。
比如Database操作,操作完后返回ResultSet,而不是若无其事的执行一次,你喜欢就去getResultSet()。
至于返回this,是一种很特殊的做法,比如C++的I/O流,Java的java.lang.StringBuffer/StringBuilder
这种返回有助于程序写出很流畅的代码,让人觉得很cool,例如 C++ 的流:
cout << "hello "
<< myValue
<< endl;
而Java的:
new StringBuffer().append("hello ")
.append(myValue)
.append("\n"); 原帖由 akai 于 3-8-2009 10:56 发表 http://www.freeoz.org/forum/images/common/back.gif
感谢. 就不拘泥了. 反正能用可读 就ok了.
如果你把所有的泥都搞懂了,强悍了,那拘不拘都没所谓。
但如果你连泥是什么都没搞清就不去拘,那就有点~~~~
起步的时候,切记踏实 谢谢 key指教了. 所以我的subject已经概括了你的~~~~~~.
我的意思是 我有点牛角尖了. 以为OOP就不应该. return了. 数值应该存在对象的字段中.后来看到 Java 也有个System.out.println(message);这个就是典型的面向过程的rerurn的写法吧.那这里的message属于哪个对象的字段呢? 可见OOP和POP 也不是绝对的... 返回的是一个对象而不是一个地址:xmas
页:
[1]