让定义的接口可读性更强

做程序开发一段时间之后,会慢慢意识到面向过程编程与面向对象编程之间的差异。两种方式,都可以解决具体的问题,只是,面向过程编程无法应对复杂而多变的需求,随着项目不停迭代,复杂度上升,你会逐渐意识到它的短板以及灾难性的维护成本,这还只是其一;第二个会遇到的难题,就是用面向过程的编码方式,无法将简单的小功能堆砌为复杂而灵活的大功能,太多不必要的代码裸露出来,分散了你的注意力,无法将心思放在实现逻辑之上。如果不锻炼你的面向对象编程思维,你无法提高你的编码技术,犹如武侠中练武之人,不注重内功心法,学再多的武功秘籍,也无法将武技发挥到极致,更无法持久的输出战力。在面向对象编程中,有很多规定来约束对象的创建,以及接口的使用。约束对象创建方面,有里氏代换原则(遵循里氏代换原则可以让你将多态发挥到极致)以及开闭原则(对修改关闭,对扩展开放);接口使用方面,有依赖倒转原则(针对接口编程)以及接口隔离原则(保持接口职能单一)。

这篇文章中,本人分享一些自己的心得体会,强调定义接口的重要性,侧重点在于如何让接口见名知意,是如何定义接口的一个片段而已,并不囊括全部如何定义接口全部的内容。直接切入正题。

只处理抽象对象的情形

这个抽象基类定义了一些基本的属性值,强调的是取值的特性,行为特征少(方法很少或者没有方法)。而某些取值的差异化,是通过派生子类的方式重载对应属性的getter,setter方法而已,比方说,我们需要在子类中对取name值加一个前缀,那么,子类重载了其name属性的getter方法即可,接口的定义就用抽象基类输入参数为主:

只处理抽象接口的情形

这是一个协议,我们注重的是协议中通用的行为,任何对象,只要实现了这个行为,都可以作为接口的参数,那么,我们需要用下面的定义方式,来强调,你需要一个实现了此协议的对象:

对抽象对象与抽象接口都有要求的情形

如下所示,我们可以将抽象的接口附着在抽象的基类上,强调了这个抽象基类需要实现这些抽象的行为才能达到客户端的需要:

为了达到强调的效果,接口需要这么定义:

* 以上三个都是为了强调接口的可读性,让人知道你想表达什么,以及让使用者如何操作

万能适配的情形

你很有自信适配所有类型的数据,你会这么写:

这么写其实并不好,因为没人知道id类型的model到底是做什么用的,因为你没有对model进行任何行为的规范(没有指明model的类型,或者model需要遵守的协议),只有当你的接口适配了所有的对象,或者内部写好了适配器,才能这么做,即使是这样,也会让可读性变差。

以上讲的几点,都是基于抽象基类与抽象行为彼此分离的这种设定,抽象基类本身也会带有方法,只有在某些方法需要子类重载的时候,我们才会将其提取出来放在抽象行为(协议)当中,我们做这些事情的目的,核心思想都是在增加程序可读性以及可维护性。还有,代码是写给别人看的。

时间: 2024-10-05 04:15:11

让定义的接口可读性更强的相关文章

可读性很强的C语言的函数指针定义

通常C/C++程序里面要用到大量的指针,其语法非常难以阅读.比如下面的vp指针类型: #include <iostream> using namespace std; typedef void (*vp) (float&,float&); void foo(float &a,float &b) { a = a + b; } int main() { // float a=1; float b=2; vp t=&foo; t(a,b); cout <

创建功能更强的类型

抽象的过程 *计算机的工作是建立在抽象的基础上. -机器语言和汇编语言是对机器硬件的抽象 -高级语言是对汇编语言和机器语言的抽象 *现有抽象的问题: -要求程序员按计算机的结构去思考,而不是按要解决的问题的结构去思考. -当程序员要解决一个问题时,必须要在机器模型和实际要解决的问题模型之间建立联系. -而计算机的结构本质上还是为了支持计算,当要解决一些非计算问题时,这个联系的建立是很困难的 面向对象的程序设计 *为程序员提供了创建工具的功能 *解决一个问题时 -程序员首先考虑的是需要哪些工具 -

EffectiveC#03--用委托表示回调,用事件定义对外接口

1.回调的场景:我给了儿子一个任务且他可以报告状态来(重复的)打断我.而我在等待他完成任务的每一个部份时不用阻塞我自己的进程.他可以在有重要(或者事件)状态报告时,可以定时的打断我,或者向我询求帮助 我:“儿子,到院子里除草去,我要看会书.” 斯科特:“爸,我已经打扫过院子了.” 斯科特:“爸,我已经把草放在除草机上了.” 斯科特:“爸,除草机不能启动了.” 我:“让我来启动它.” 斯科特:“爸,我做好了.” 2.回调就是用于异步的提供服务器与客户之间的信息反馈.它们可能在多线程中,或者可能是简

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indicate that an interface * type declaration is intended to be a <i>functional interface</i> as * defined by the Java Language Specificat

STM32的Cortex-M3核与ARM7有何区别?哪个性能更强?

STM32的Cortex-M3核与ARM7有何区别?哪个性能更强?,布布扣,bubuko.com

JcJc对政府网站公文错别字识别的能力更强了

JcJc对政府网站公文错别字识别的能力更强了 最近一直在忙着改进JcJc错别字检查软件的识别准确度, 特别是应客户的要求添加了对政府网站公文内容的检查. 说实话,做错别字检查这么长时间,深刻体会到文章中被查出错别字的苦衷. 拼音输入法,五笔输入法都会产生错别字.大家平常工作都很忙,如果不是有任务在头上,谁也不会,对着文章看好几遍. 报社.杂志因为有专业的岗位负责校对,所以从流程上会降低错别字出现的概率. 可是政府网站你总不能设立类似的岗位吧? 今天太晚了, 先上个图吧,大家看看效果:   htt

利用pyinotify监控文件内容,像tailf命令但比它更强

Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能. watchfile.py #!/usr/bin/python import sys, os, pyinotify notifier = None monfile = None lastsize = 0 wm = None wd = 0 def roll_file(filename): global lastsize fd = os.op

[原创]spring源码解析-- 定义Advice接口的作用和意图

Spring在包org.aopalliance.aop下定义了Advice接口,该接口没有任何方法和属性: public interface Advice { } 那么Spring定义该接口的意图是什么呢?该接口的作用是什么呢?针对这些问题,我会不断通过研究Spring源码,持续更新最新的发现.

马云最新发言:让员工、客户、合作伙伴比自己更强

在10月25日举行的第三届世界浙商大会在浙江举行,阿里巴巴董事局主席.浙商总会首任会长马云做主旨演讲表示,从强我变成利他思想,是21世纪企业必须要有的素质,你要让你的员工比你聪明.比你更了解信息和数据.让你的员工有更强的能力,让你的客户.合作伙伴更强. 等到30年后,你再回头看看.我的好处在于,我们公司其他人在干活,而我是在胡思乱想. 第三届世界浙商大会_马云 以下为演讲内容: 感谢大家的信任,当了“官”(浙商总会会长),我上一次当官是1985年,杭州师范学院的学生会主席.这两个“官”,在我看来