论坛首页 编程语言技术论坛

一个新手对类的疑惑(转)

浏览 3323 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-10  

在使用java中,我常常遇到一个问题,我只需要一个函数,但我不得不创建一个类。
类常常让我很困惑,特别是在ruby中。
比如:
-3.abs()和abs(3),难不成,-3.abs 就面向对象了,在我眼中可没有任何区别。
如果是python的话,充其量是 abs(self)。
类有无比伦比的优点,我曾经写纯c程序时,深深的体会到了。
但我觉得有点怪异。但是有无法表达。为什么我觉得诡异啊。在无聊的英语课上,我想出了一种解释。

我心里的所期望的是  类>>>函数

类只提供访问数据的基本的功能,比如Complex(复数)类只提供 get set等等最基本的。
函数对类进行操作,比如Complex abs(Complex); Complex operator+(Complex, Complex); Complex operator*(Complex, Complex);

也就是 "类"+函数 才是"完整"的类。

这样的好处是简单,我们了解一个类无需花太多时间,而函数要用的时候再查找,找不到自己写。

在使用ruby的时候,我常常被众多方法吓住,比如string类就有60多种方法,吓人吧。如果是新手,那得花多长时间才能掌握这个类啊。
在.net中,那是有过之无不及,把类弄到了极致,我擦,上万个类,每个类上百个方法。

坏处吗,呵呵,有点行不通,继承啊,多态啊,神马的。。。

总而言之,函数是第一等公民,一切基于函数。

新手奇怪的想法,见笑了。。。

 

   发表时间:2012-10-17  
最接近人类语言的编程语言,就算有上万个方法,也是如同英文单词,看名字就知道用法。让电脑自动编程才牛。

上万个类,每个类上百个方法。如果换成函数,就是上百万个函数吧?
0 请登录后投票
   发表时间:2012-11-05  
我也经历了你这个阶段,说说我自己的感受。
我很早接触的函数化编程,也遇到了理解类困难的阶段。
对于一个抽象问题,函数化变成,是从流程的角度来看切入的,要解决这个问题,例如需要3个大步骤,每个大步骤需要3个小步骤。每个步骤都是对应一个函数。要设计一个流程,从一开始就自然会引入大量抽象。一旦你习惯了这种思考编程问题的方式,要转化成面向对象就会有困难。
因为面向对象,思考问题是这样的:这个问题,有几个“主体”,每个"主体"是怎么通过交互来解决问题。自然而然的产生了对象,类。和函数从流程切入的思考方法是截然不同的。这种思考方式更简单,更直接,很多时候就是现实的直接映射而来。需要的抽象更少。我觉得这个也就是面向对象受到推崇的基本原因。
要对各种“主体”进行更好,更高效的抽象,而引入了继承,动态绑定等工具。
0 请登录后投票
   发表时间:2012-11-16  
楼主说的“函数”+“只有getter/setter的类”,不就是C的函数+结构(struct)么。当初就是这种方式玩不转,面向对象才冒出来的。面向对象要结合封装、继承和多态来看才能体现其价值,尤其是多态。

另外所谓“函数是一等公民”,并不仅仅是函数可以独立存在这么简单。而是指函数本身就是数据,一个函数可以接受其他函数作为参数或者返回一个函数,并且被返回的函数能保持上下文中的自由变量形成闭包。这要玩起来并不比面向对象简单。
0 请登录后投票
   发表时间:2012-11-19   最后修改:2012-11-19
你可以理解为:对象是现实世界中的“可观实体”在计算机世界中的一个“映射”。那么如何在计算机中表示对象呢?肯定要有一个数据结构(Struct),这个数据结构就是“类”,类是对象的抽象,是对象的“原型(Prototype)”。可以把类理解为现实世界的“概念”在计算机中的实现。

类是抽象的,抽象的东西不可以直接用,一定要一个实实在在的“可观实体”才可以用,即需要类的一个实例,这就需要实例化,实例化的结果就是对象。静态方法调用实际上也是作用在一个“特殊对象”上的(而不是作用于类上,更不是完全没有对象)。

一个对象有状态和行为,在Java中表现为变量和方法(Java中一般不叫属性和函数)。所以方法和变量依附于对象的(而不是类)。

与传统的面向过程开发不同,面向过程中是以“数据”为中心的,数据在各函数之间传递和被处理。而面向对象是以“对象”为中心,对象本身就包含数据,数据只是对象的一个状态,对象之间互相传递消息,并且在消息传递过程中“对象状态被改变”或“改变其它对象状态”。

类有3大基本特征:封装、继承、多态。
封装使得类对外部透明,使用类的对象的调用者不需要知道类内部情况。
继承使得可以对现实世界的概念进行不同级别的抽象。
多态则允许不同的类的对象可以共享相同的代码。


刚刚说到面向对象中对象的行为表现为方法,而不是函数。函数是什么?与数学中“函数”的概念一样,f(x)=y则f是函数,函数(Function)表示每个输入值对应唯一输出值的一种对应关系。即函数只是输入域和输出域之间的一个“映射”。
一个很明显的特征是:一个输入“有且仅有”有一个输出。在计算机中是一样的,因此所有的函数“必定”有一个返回值(Java中的void并不是没有返回值,而是返回一个特殊的结果而已)。
计算机中的函数可以理解为“一个有固定入口和出口的数据运算与转换‘法则’”。函数同样是以封装和代码重用的目的。

至于JavaScript中说的“函数是一等公民”就是上面的4楼的"kidneyball"说的那个意思。
0 请登录后投票
   发表时间:2012-11-22  
我现在只会用perl,但是想学一点ruby.我感觉类的好处是,可读性好。
比如说perl,函数不多,但是有上下文,有很多符号,还有很多语法。经过一系列的排列组合,产生的方法,要比面向对象的类方法要多。但是新手很难看懂,老手时间长了也会忘。但是类方法不一样,一看单词就知道干啥的了,而且也好记。
还有一个好处,比如说a.func(b) 很容易区分两个参数的次序。
但是func(a,b),a,b 的次序要记清才行。如果是func(a,b,c)就更难记了。但是a.func(b,c)就好记一点。
0 请登录后投票
   发表时间:2012-11-23  
对类的疑惑无非是源于没有见识过类的厉害。


我以前也不明白什么类,继承,接口的。毕竟做程序的天性都是崇尚简洁。

直到有一天要读XML,用类!要访问数据库,用类! 生成随机数,转换数据格式,加密解密,都用类!!各种杂七杂八的功能,类库全都搞定。什么算法你都不用想,不用会,只要会对象.方法()的格式调用人家写好的功能就行了。

这个时候你才意识到,类是多么伟大。如果没有类,就得把这些功能的代码copy到你程序里面一份吧? 那样的话你的程序要看晕了,难怪会有过劳死,过劳晕。
0 请登录后投票
   发表时间:2012-12-07  
kidneyball 写道
楼主说的“函数”+“只有getter/setter的类”,不就是C的函数+结构(struct)么。当初就是这种方式玩不转,面向对象才冒出来的。面向对象要结合封装、继承和多态来看才能体现其价值,尤其是多态。

另外所谓“函数是一等公民”,并不仅仅是函数可以独立存在这么简单。而是指函数本身就是数据,一个函数可以接受其他函数作为参数或者返回一个函数,并且被返回的函数能保持上下文中的自由变量形成闭包。这要玩起来并不比面向对象简单。

差不多吧,我搞混了。现在觉得主要还是接口,多态吧。
只是有时候,明明不用访问私有变量,又和接口毫无关系,还弄成方法,明明弄成静态方法也可以。

0 请登录后投票
   发表时间:2012-12-08  
悲伤逆流成河 写道
kidneyball 写道
楼主说的“函数”+“只有getter/setter的类”,不就是C的函数+结构(struct)么。当初就是这种方式玩不转,面向对象才冒出来的。面向对象要结合封装、继承和多态来看才能体现其价值,尤其是多态。

另外所谓“函数是一等公民”,并不仅仅是函数可以独立存在这么简单。而是指函数本身就是数据,一个函数可以接受其他函数作为参数或者返回一个函数,并且被返回的函数能保持上下文中的自由变量形成闭包。这要玩起来并不比面向对象简单。

差不多吧,我搞混了。现在觉得主要还是接口,多态吧。
只是有时候,明明不用访问私有变量,又和接口毫无关系,还弄成方法,明明弄成静态方法也可以。



完全不访问私有变量的方法理论上是可以写成静态的,如果这个方法是private的那就完全可以改成静态方法,不过只要这个方法不会被其他静态方法使用,写成非静态的也没有什么大问题。通常如果是工具函数性质的有独立功能的方法,就写成静态的。如果只是从其他非静态方法抽取出来的公共代码,就继续用非静态的。

但如果是非private的方法,改成静态的话子类就不能覆盖这个方法了。大量使用静态方法也不方便做单元测试。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics