豫ICP备17040950号-2

《超越Java》

文章目录
  1. 1. Java从哪里来?到哪里去?
  2. 2. Java的现状
  3. 3. 什么是分布式系统?
  4. 4. POJO和EJB
  5. 5. Java纯面向对象?
  6. 6. 系统编程语言
  7. 7. 面向对象编程的三大特点
    1. 7.1. 封装
    2. 7.2. 继承
    3. 7.3. 多态
  8. 8. 面向对象和基于对象的区别
  9. 9. OOP和AOP
    1. 9.1. 区别:
    2. 9.2. 关系:
  10. 10. SOA
  11. 11. REST
  12. 12. 复杂的问题驱动更高的抽象
  13. 13. 元编程
  14. 14. 泛型编程
  15. 15. 四个准则
  16. 16. 知识欠缺
  17. 17. 结束语

beyond java

题记:没有语言可以永远保持领先地位,Java统治的时代将会结束,这不是“会不会”的问题,而是“什么时候”的问题。

不久前,我以为,Java会是最有前途的编程语言!不久前,我以为,Node.js非常强大!不久前,我以为,编程很苦!

现在,我发现,Java可以超越!现在,我发现,Node.js在很多方面比不上Fib.js!现在,我发现,编程依旧很苦!

之前写过一篇《发展方向的思考》,现在看来,如此幼稚。那么,我的发展方向又在哪里呢?不再定下什么具体的语言,或者前端后端之类。我的发展方向,在于掌握学习的能力!没有什么语言和技术是不会过时的,我要掌握的,是一种快速有效学习的能力!比如,接触一门新的语言、新的工具,能够在一周或者更短的时间内上手!

简而言之四个字:学会学习

Java从哪里来?到哪里去?

1991年,sun公司的James Gosling领导的绿色计划,着力开发一种分布式系统结构,使其能够在各种消费性电子产品上运行,比如机顶盒。刚开始的时候使用C++,后来发现C++的各种不足,非常蛋疼,于是研发了Oak(橡树)来代替C++。

1994年,因特网迅速发展,工业界对适合在网络异构环境下使用的语言有一种非常急迫的需求。这时James决定对Oak进行小规模的改造,于是,1995年Java诞生。(名字取义自开发团队最喜欢喝的咖啡产地——Java。)

Java拥有巨大潜力,发展至今,已经成为全世界最流行的编程语言,未来也将无处不在。但是,它不可能一直保持领先地位,终究会被其他更优秀的语言取代。

Java的现状

1、Java已经结束了领导趋势(大概在2005年),不再是创新的源头。
2、Java不止一个接班者,未来Java仍然是无处不在的语言。
3、Java已经远离它的基础,大型企业的问题获取很容易解决,但是简单的问题反而很难解决。Ruby on Rails 在某些例子中,效率远远高于Java。
4、复杂,门槛高。建立一个简单的web应用程序,使用最普遍的框架,你必须学会一箩筐的知识。
5、不自然的延伸,比如AOP或依赖注入。
6、Java泛型的实现不足取。

1、Java社区很多很活跃。
2、拥有最多的商业厂商和项目。
3、开源项目非常多。
4、可移植性好。(JVM比Java更重要)

什么是分布式系统?

“分布式的”意味着计算的成本或性能取决于数据和控制的通信。

如果一个系统的部件局限在一个地方,它就是集中式的:如果它的部件在不同地方,部件之间要么不存在或仅存在有限的合作,要么存在紧密的合作,它是分散式的。

当一个分散式系统不存在或仅存在有限的合作时,它就被称作网络的;否则它就被称作分布式的,表示在不同地方的部件之间存在紧密的合作。在给出分布式系统具体定义的模型中,分布式系统可以用硬件、控制、数据这三个维度加以检验。

分布式系统=分布式硬件+分布式控制+分布式数据

分布式系统有很多不同的定义,但其中没有一个是令人满意或者能够被所有人接受的。介绍分布式系统,对它的特点的下列大致的描述足够了:

一个分布式系统是一些独立的计算机的集合,但是对这个系统的用户来说,系统就象一台计算机一样。

这个定义有两个方面的含义:第一,从硬件角度来讲,各个计算机都是自治的;第二,从软件角度来讲,用户将整个系统看作是一台计算机。这两者都是必需的,缺一不可。

POJO和EJB

POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

JavaBean定义:一种用Java语言写的可重用组件(是具有某种功能,或者处理某个业务的对象)。

特点:共有类、无参构造、私有属性(共有的get、set方法)、可以有方法,但不作为业务逻辑

优点:Write once,run anywhere,reuse everywhere。(WORA)

EJB(Enterprise JavaBean)定义:EJB 从技术上而言不是一种”产品”,而是一种描述了构建应用组件要解决的标准。可扩展 (Scalable)、分布式 (Distributed)、事务处理 (Transactional)、数据存储 (Persistent)、安全性 (Secure)。EJB有EntityBean、SessionBean、MessageDrivernBean三种。

EJB的详解参见点滴之水的博客,讲的非常好。

Java纯面向对象?

Java的基本类型并非继承自Object,所以Java是混种语言,而非纯面向对象语言。当初基本类型的引入,完全是为了吸引C++开发者。

系统编程语言

系统编程语言,顾名思义,这个语言和操作系统联系很密切。比如C++,它可以精确的控制每个内存单元。但是在应用程序的开发中,根本不需要处理这些底层的细节,比如使用Java开发一个超级玛丽游戏。因此,按照我的理解,系统编程语言是可以处理操作系统细节的编程语言。

面向对象编程的三大特点

封装、继承和多态。为什么是这三大特点,而不是别的?我想,是因为,面向对象编程语言先出现,之后大家才总结出来这三大特点。而不是定好了三大特点,才开始设计面向对象编程语言。

以下内容引用自Veda原型

封装

封装是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承

面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。

要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。在某些OOP语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

继承概念的实现方式有三类:实现继承、接口继承和可视继承。
1、实现继承是指使用基类的属性和方法而无需额外编码的能力;
2、接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
3、可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

抽象类仅定义将由子类创建的一般属性和方法,OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

多态

多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

实现多态,有二种方式,覆盖,重载。
1、覆盖(override),是指子类重新定义父类的虚函数的做法。
2、重载(overload),是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。

比如有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”

那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

面向对象和基于对象的区别

它们最大的区别在于:基于对象,没有继承!

OOP和AOP

以下内容来自丁成云的博客

面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。

区别:

面向领域不同。AOP和OOP是面向不同领域的两种设计思想。

OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分。

而AOP则是针对业务处理过程中的切面进行提取,例如,企业开发中经常会面临的种种非功能性需求(操作日志、权限控制、性能监测等等),用面向对象的思路,将业务操作对象的核心功能和对它的其他服务性功能代码分离,即某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。

AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用AOP将贯穿于各个模块间的横切关注点自动耦合进来。

AOP所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。

AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。

关系:

AOP是OOP的延续和补充。

AOP与OOP并不是相互竞争的两种技术,人们不是为了代替OOP而提出AOP,事实上AOP与OOP两者互相之间是一个很好的补充和完善。

OOP面向对象编程关注的是将需求功能“垂直”划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为。至于对象间的关系则依靠继承和多态等来定义,即OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,将OOP构建的庞大的类体系结构进行进一步的“水平”切割,并将那些影响了多个类的公共行为封装到一个可重用模块,封装成“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

面向方面编程则是希望能够将OOP构建的庞大的类体系结构进行进一步的“水平”切割,将通用需求功能从不相关的类当中分离出来, 封装成方面。

SOA

面向服务架构。

REST

表述性状态转移(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

复杂的问题驱动更高的抽象

机器语言 -> 汇编 -> 结构化编程(C) -> 面向对象编程(Java) -> ?

元编程

元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。

泛型编程

泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。

四个准则

下一个成功的编程语言必须满足四个主要的四个准则:
1、需要建立一个明显的社区。只有让采用者安心,他才会去使用此技术。
2、需要具备可移植性,Java虚拟机已经提高了后继语言的门槛。
3、需要提供经济上的动力。目前,生产力对我来说,看起来就像是经济上的动机,但还是有一些其他的动机在引诱着我,像无线运算以及数据搜索。
4、它需要展示技术优点,这才是最重要的一点。

知识欠缺

Ruby、Perl、AOP(aspect-oriented programming)、Ruby on Rails、Python、Smalltalk、ObjC、Subversion……

结束语

这是一本冲击思维,开启世界的书!上面的摘录,无法展现本书的十之一二。

本书并非是评判java的不足,而是从某种高度上讲述了java以及另外几种语言的优缺点、适合领域,并谈了下一代语言要具备什么特点。值得每个程序员认真读一下!