十年Java面向对象编程心路——函数与方法的概念区别

       十年Java面向对象编程心路——函数与方法的概念区别

     

       最早接触方法这个名词还是十年前刚开始学习Java的时候,老师说Java没有函数这个说法,只有方法,行为定义和C/C++的函数差不多。当初刚学会一点C/C++,对于老师的说法内心是很不认同的,一来老师是属于照本宣科类型,二来Java老师是女的,大学女老师大部分的实际编码经验少,理论和论文水平比较OK,都是名牌大学毕业的硕士研究生以上的讲师甚至已经是副教授了,教学只是副业。好了,说的有点远,在学习Java时也去图书馆借了国外教材的中文翻译版本,书中确实也没有任何地方把Java的方法称作函数,当时也很不是理解,想想可能是因为大部分翻译教材是那些没有实际工作经验的研究生帮导师翻译的缘故,所以是为了赶工,没有推敲。

       总之,从第一天认识Java方法的概念开始,在接下来近十年的时间里一直都把Java的方法和C/C++的函数划上等号,认为Java的方法就是C/C++的函数,但是在讨论问题的时候我从来都是直接把Java的方法称为函数,例如A的add函数。当然这并不影响交流,也不从来不会因为“函数”的称呼起争执;同时也对于“A的add方法”概念称呼的同行认为是开发概念学习不严谨,没有学过C/C++,所以一开始只学习了Java就先入为主,不知道其实叫做函数。

       Java的函数与方法概念的区别一直是心头之结,一直对于这个概念为什么会称为方法耿耿于怀。甚至查过了Oracle的官方文档:

       A Method provides information about, and access to, a single method on a class or interface. The reflected method may be a class method or an instance method (including an abstract method).

       A Method permits widening conversions to occur when matching the actual parameters to invoke with the underlying method's formal parameters, but it throws an IllegalArgumentException if a narrowing conversion would occur.

       非常简洁的定义了什么是方法——“方法是提供了一种访问某个类或者接口的操作方式。”(翻译仅供参考,水平有限勿怪)。可是还是没办法解除心头之惑——函数和方法这两个概念到底有什么区别?

       随着工作经历的增长,开发的项目也多起来,已经熟练使用Java结合设计模式来搭建项目的基础架构了,深信Java是一门非常成功的面向对象语言,相对于C++是更适合普通人开发的面向对象语言,对于C这样的面向过程开发的语言来说更加现代一点。也懂得了面向对象编程和面向过程编程的概念和区别,但是还是没有体会到为什么Java把C/C++中函数称为方法,而不是沿用函数的称呼,一直都认为方法的叫法是sun工程师为了自立门户臆想出来的概念(有一定关系)。

       直到最新因为需要开发IOS应用必须学习swift语言和objective-C,在学习swift时惊讶的发现swift居然同时使用的函数和方法两个概念,于是仔细阅读了Apple官方文档对于函数和方法的概念定义。

      Functions are self-contained chunks of code that perform a specific task. You give a function a name that identifies what it does, and this name is used to “call” the function to perform its task when needed.

      Methods are functions that are associated with a particular type. Classes, structures, and enumerations can all define instance methods, which encapsulate specific tasks and functionality for working with an instance of a given type. Classes, structures, and enumerations can also define type methods, which are associated with the type itself. Type methods are similar to class methods in Objective-C.

         ——因为本人英语水平有限,很难恰到好处的翻译到位,请大家多看看原文吧。

        Apple对于swift中的函数和方法的定义非常到位,函数是基于任务处理的闭包代码块;方法是依附于某个类、结构体、枚举类型、接口的一个任务处理代码块,可以通过操作某个类或者对象的方法完成特定任务并且可能改变该类或者对象的属性值(类的成员变量)。最最核心的区别就是函数是完整独立的任务体,自成一体;方法是类的操作入口,类是一个抽象的模型,方法依附于类,方法与类的关系是部分与整体的关系,没有 类就没有方法。

       于是swift的官方概念解答了十年来对于Java为什么只有方法没有函数的概念问题,也对于面向对象编程概念理解更加深刻。

       最后贴上百度百科词条对于面向对象和面向过程两种程序设计概念的解释温习一下,所谓温故而知新。

       面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

       面向过程的语言也称为结构化程序设计语言,是高级语言的一种。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。其概念最早由E.W.Dijikstra在1965年提出,是软件发展的一个重要里程碑。它的主要观点是采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择、循环三种基本控制结构构造。

       本人对于两个概念的理解如下: 面向对象编程的理念是基于抽象思维建立事物的模型,然后对模型进行操作,在开发过程中的焦距点在于模型的操作与属性变化,并维系各个独立模型之间的关系。面向过程编程的理念是通过大而化小,小而化无基于一定处理顺序的各个击破原则完成任务,尽量精细化任务的粒度,让一个小任务只完成某一个功能。

       最后,当对函数与方法的概念彻底理解后,发现以前对于Java方法的同行的鄙视行为真是——Too Young too naive!

       学技术的始终要保持一颗谦逊的心来接纳自己不理解的事物,学而不思则罔,思而不学则殆!一起共勉。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值