文艺复兴时期,现代科学产生了两个重量级理论: 理性主义和经验主义。java
理性主义认为理智是信息的首要来源。给出一个假设,只要经过思考就能理解和描述这个世界,如著名的伽利略自由落体实验。mysql
经验主义则认为人类对世界认识的主要来源是经验。程序员
咱们开一辆车,没必要知道其内部实现细节。web
若是孤立地基于两种极端的方式来观察世界都是片面的。对大多数人来讲,懵懂无知是一种生活方式,也是理性主义和经验主义结合在一块儿的结果。今天的程序开发和软件工程方法也是如此。sql
咱们能够发如今软件演变的过程当中, 理性主义几乎已无存身之处。数据库
由于软件的趋势是: 程序员在能够不深刻了解不少内容的状况下就能够写出很是好的代码。编程
现状: 开发团队每每直接复用现有的一些软件框架,彻底不重视这些重量级的框架是否超过咱们的须要的。现代软件都是基于大型组件的方式进行组装的。 我要一个web服务器就装一个tomocat, 要一个数据库就装个mysql。 这彻底是一种推土机式的开发方式,无论你的组件有多大, 总会找到合适的推土机把他推上去。 运行效率太差 就 加内存,搞服务器集群,windows
这种方法是好仍是坏呢?实际上绝大多数公司已经用这种方式了。api
由于推土机式的工做方式可使你在不关注内部细节的状况下,也能够获得不错的结果。 咱们能够在不了解汽车原理的状况下,能够把汽车开得很好。 在写win32程序时候,也没必要了解系统是怎么实现。 咱们只须要关注windows 系统API, 以及这些API的功能。缓存
理解一个系统有两个层面:
而在软件开发中, 通常只要作到浅层理解就能够了。
咱们说明软件开发实际上是一个经验的积累过程,而且能够是复用前人的经验积累的。
好的API可使功能的使用者聚焦在使用层面而不是其内部细节
为何须要好的API:
一个软件开发的生命周期:
变化是万恶之源。
第一步先确认什么才叫好。
不少人认为所谓的API,不过是类和方法。可是这是比较片面的。
强调一点, 咱们为何须要开发好的API:咱们但愿可以将大块的构建模块,”无绪“地集合成应用程序。
那么如何评价一个API的质量: 漂亮? 可是评价漂亮的标准是很主观的。咱们应该设计易于使用、广为接受且富有成效的API。咱们能够有一下几个方面来衡量一个API的好坏。
第二步弄清楚写API的步骤
写一个API有三个步骤:用例, 场景, 文档。
一个用例就是一种用法的描述,他指出用户可能要面临的问题,而这个问题不是一个具体的问题,而是不少问题的抽象。
举个例子
用例: 设计一个数据库管理器,他的功能是注册JDBC驱动。
场景:对用例的回答。咱们把API要描述的每个功能下列出来:
第三步 学习一些设计原则和通用方法
咱们所设计的API都会被可能误用。几乎全部的API设计者都会有这样的共识:一我的API设计的时间越长,他设计的API公开的内容会越少。
设计API的几种方法:
这个不用说了。 geter setter。 这样作会有不少改变的余地。 如计算、转换、校验、覆盖
工厂方法会带来很大的灵活性,三个好处:
一般状况下, 在设计一个类的时候,若是不考虑让拥有子类,那就不该该让这个类被继承。 用final 来修饰。 还有些其余方案来: 不公开构造函数转而提供工厂方法。把大部分方法变为final或者private
一个宝贵的教训: 如无必要,绝对不要再正式的API中声明setter方法。
在java中,所谓的友元就是用默认的package方式访问,即容许同一个包内的代码进行访问。
有个实际的例子
避免深层次的继承,定义程序的接口,并让用户来实现这些接口。 若是一个类继承了某个类或者接口,那么就能够做为响应的类或接口被使用。
如在swing中, frame间接继承了compoment,这样就表示全部使用compoment的地方,均可以使用frame. 实际上frame继承 compoment是为了复用compoment的代码。这是一种典型的面向对象的复用的误用。 因此若是发现继承提醒超过2层,必定要想清楚“我是在设计API仍是在复用代码”,若是是后者,则作好子类化准备。
本质上讲,这个原则倡导的是,当咱们写一个函数或一个方法时,咱们应该引用相应的接口,而不是具体的实现类。接口提供了很是优秀的抽象概括,让咱们的开发工做变得容易不少。 让API的使用者和API的实现者解耦出来。
随着软件规模的增大以及功能的复杂性增长。只要代码开始访问其余无关模块的内容,那么架构的退化不可避免。模块化能有效变缓这种退化。
模块化的目的很是简单,就是要实现程序中各个组成部分的松耦合。若是两个模块是独立的,那两个模块就不须要知道对方的存在。若是两个模块要交互,那么他们应该经过具备良好定义的接口来进行交互。
声明式编程的基本思路, 不是让API用户一步一步告诉程序如何作,而只是须要告诉程序他们要的结果,而后交给API去完成。声明式编程的好处是能在较高的抽象层次来定义操做。
好比写一个资源管理API: API的使用者很容易找到一个方法去注册一个功能,运行一下成功了,而后再也不往下继续找注销的方法了。 声明式编程就是解决这个问题的一剂良药: 开发人员只须要声明注册什么,响应的注销和清理由系统完成。
最后提醒一点,任何极端的想法都是有害的,在软件框架设计中也同样, 有如下单不只限几个点:
现代的大型工程不多是有一我的单独开发完成的,因此团队协做很是重要。一下几个点能很好帮助在大型软件工做中完成好的API设:
以上很是简单,可是在外面日常工做中缺乏的就是执行。