读《面向对象的思考过程》作者matt Weisfeld

最近接触了很多java代码,开始于机缘巧合,读了《java编程思想》的大概前四分之一,这比我读《C++primer》还要多了,两本都是大部头,我能完整读完还需毅力。惊讶于两门语言语法非常的相似,之前对C++很熟悉,看java代码完全不费劲。C++与Java的区别在于java的纯粹,它是完全面向对象的,对于掌握面向对象的思想是有好处的。虽然C++也是面向对象的语言,但它同时也支持过程式编程,所以有人说,很多C++程序员只不过是使用C++编译器的C程序员。也有人说C++它什么都想要,导致它很灵活和庞杂。


我最近搜罗的好多新书,书中的实现代码也是Java,所以java也是避不开了。我本是C++水平也只是入门,多学其它,不会到最后一无所成吧。看到一本关于阿里笔试心得的书,其中一段话使我稍微释怀:

在基础编程语言方面,不同候选人可能重点学习的编程语言是不同的,对各种语言的掌握熟练程度差异较大,如何在考题中屏蔽这种差异带来的影响?我们认为高级语言虽然种类很多,但是编程思想相近,所以考核会尽量做到与具体编程语言无关。但是彻底回避这个问题也是不现实的,所以我们以C/C++这种教学面最广的编程语言作为考试“母语”。同时,有些题目中可能涉及java程序,这是因为阿里巴巴公司大量使用这种编程语言,积累的素材要多一些,不过所有出现java程序应该都可以按照C/C++程序读懂。


上面这段话表达的意思很明确了,C++教学方面用的最多,而且C++特性灵活,适合用来考察数据结构与算法的一些笔试,所以校招通用。另一层意思是java在业界用的最多,与很多业务离不开,有很多技术与java结合的很成熟了,比如我在面经上看到java多线程的知识,基础理论不难,但用好还需要理解很多经验知识。那么,现在Java开发的岗位远大于C++开发,我认为自己不能局限于一门语言,学习和阅读java代码是有好处的,主要就是理解业务。我还查了查面java岗的时候,能不能用C++写笔试题,答案是肯定的,所以之前用C++刷题,对C++的熟悉总算没有白费。


现在语言那么多,但一些编程思想是不分语言的,比如面向对象的编程范式,设计模式,所以但凡好书,java和C++也不必纠结。我个人未来想投身于互联网行业,学习java能快速帮我理请关于网络方面的一些业务。


这本书里的例子大部分也是用java 实现的。本书一个鲜明的特点是面面俱到,又点到为止,对初次树立一些概念非常有好处。本书对面向对象的思想反复阐述,介绍了面向对象在互联网领域的应用程序的应用,同时对可移植数据存储与传输做了介绍。


下面提取了我从本书得到的收获:

1.面向对象编程与过程式编程完全是对立的吗?

答案是否定的,即使java这种完全面向对象的语言,细化到方法层面,里面也是包含顺序逻辑的,比如if else之类的。再者,面对一些使用过程式编程范式的遗留代码,完全重构代价太高,这时可以将其包装起来,这说明根据两种范式编写的代码是能够共存的。

2.类图?

UML是直译就是统一建模语言,统一的限定是因为它吸收了历史上不同的建模语言。它的细节很复杂,有些功能很简单很好用,比如可视化的类图。它还能清晰描述不同类之间的关系:继承,接口与实现,聚合、联合。

3.接口/实现的范式

这里的接口并非java里的interface。此范式涉及类对信息的封装与隐藏,公共属性和方法为接口,用户不可访问的私有资源为实现。接口是面向用户的,良好的接口设计可以保证在修改代码的实现时不对用户产生影响。在设计类时一个重要的问题是保持公共接口最小化,因为针对一定的功能,接口总是够用的,就算出现了新的功能,也可以较容易的扩展接口,但过多接口容易造成混乱和安全问题。

构建对象有3种方式:继承、接口(interface)与组合。继承提供了数据封装的灵活性,但有些计算机科学家认为继承并非良好的编程实践。因为过多的继承层级以及多重继承的存在会增加系统的复杂性,想象一下如果父类的修改会对其下层级的所有子类造成影响,这个系统是不容易稳定的。C++中有多重继承,java中没有,java提供了另一种灵活的方式,即可以继承一个类和实现多个接口。接口可以看成C++里的纯虚类,它不包含任何实现。接口和组合都是一致赞同的良好的编程实践。

接口实现了契约,契约的优势之一是标准化编码的约定。比如毫不相关的(事物)类都有名字这一属性,如果使用这些类的人需要翻看文档来查明如何获取名字,那太糟糕了。这就是namable接口存在的意义,它要求每个实现它的类都提供setName和getName方法。

4.对象包装是什么?

使用包装是非常普遍的现象,可以将结构化的代码包装成类的方法;可以将不可移植的代码包装起来,隐藏具体与平台有关的实现;可以包装已有的类。包装已有的类的需求不是那么明显,其实有很多原因来为已有类创建包装对象。

将对象包装可以是修改接口,也可以是修改实现。两者对应的设计模式,前者符合适配器模式,后者符合装饰器模式。

5.可移植数据XML和json?

我们经常提语言的可移植性,比如“一份代码,到处运行”是java提出的目标,数据的可移植性是指数据交换时采用统一的标准,XML和json就是可供选择的标准。XML的结构和HTML很类似,HTML是用于数据显示,而XML用于格式化数据,所以XML更严格。DTD是一种检验XML格式是否合法的文档。

在不同类型的数据库之间传输数据时,就可以建立一个双方都认同的XML文档,两端的应用程序都会有XML解析器,将数据转换成数据库支持的格式。

和HTML一样,XML也可以用于显示,可与CSS配合使用。

json是另一标准,它比XML更简单,更灵活,处理速度更快。 json即JavaScript对象标记,它使用JavaScript语法,但同时和平台无关,因为很多语言都存在json解析器。

6.怎么持久化对象?

一个对象有属性和方法,还存在生命周期。属性即数据,那么对象消失后,数据也就不见了,那么怎么持久化对象呢?这涉及到对象的序列化,封送,以及存入数据库。

对象的序列化包括私有和公有的方式。私有就是语言层面的,比如java中类要实现Serializable接口,然后将其写入对象输出流和文件输出流。公有方式,比如通过XML序列化器将类数据生成一个XML文档。如果想从这些文档中恢复对象,在调用反序列化操作。XML是一种可移植的方式。

从客户端访问数据库服务器端,需要使用SQL语言。java使用JDBC驱动来与数据库服务器进行通信,也可以采用ODBC驱动。

7.web服务

书中介绍了分布式计算里涉及的很多技术(或协议)。不是很明白,先罗列一下概念,就当占个坑。

CORBA(公共对象请求代理体系)
提供一种标准的协议,使在多个平台和操作系统使用多种语言编写的应用程序之间可以进行通信,是一种中间件。CORBA定义了所有语言必须遵守的接口,IDL(接口定义语言),客户端和服务器端为了支持CORBA,都必须遵守IDL声明的契约。一个叫做ORB(对象请求代理)的应用程序会路由所有通过CORBA系统进行传输的对象。

DCOM(分布式组件对象模型,分布式组件对象模式)
是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。

RMI
是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。

SOAP(简单对象访问协议)
一项通信协议,它是平台与语言无关的,基于XML。使用http协议,所以客户端往往是浏览器。

RPC(远程程序调用)
它是一个通信机制,允许通过共享的网络调用其它计算机上的服务(对象),比如使用SOAP的主要动机是进行远程程序调用。

REST(表述性状态传递)
一种软件架构风格。它的本质是使用HTTP请求来创建、更新、读取及删除数据。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

8.怎么在客户端和服务器端传输对象?

本书实现了两种方式。一种通过java语言实现,是私有的方式;另一种是跨语言的,将对象序列化为XML文件进行传输。

我在另一篇博客中实现了基于java语言的文件传输示例:客户端/服务器端通信:传输对象

9.设计模式

单例模式
限制对象的创建,当用类创建对象时始终只有一个对象实例。
java代码:

public class ClassicSingleton {
    private static ClassicSingleton instance=null;
    
    protected ClassicSingleton() {
        //只是为了防止实例化
    }
    public static ClassicSingleton getInstance() {
        if(instance==null) {
        instance=new ClassicSingleton();
        }
        return instance;
    }
}

适配器模式
实质是修改原类的接口,要新建一个包装类。
比如有一个邮箱类通过retrieveMail()来获取邮件,现需要改为getMail()。

package MailTool

/*
 *原邮箱类
 */
public class MailTool {
    public MailTool() {
    }
    public int retrieveMail() {
        System.out.println("You have got Mail!");
        return 0;
    }
}
package MailTool

/*
 *新的接口
 */
interface MailInterface {
    int getMail();
}
package MailTool

/*
 *新的类
 */
class MyMailTool implements MailInterface {
    private MailTool myMailTool;
    public MyMailTool() {
        myMailTool=new MailTool();
    }
    public int getMail() {
        return myMailTool.retrieveMail(); 
    }
}

迭代器模式
Java和C++语言自身都实现了迭代器,集合类的iterator。

你可能感兴趣的:(Coding&Reading)