从宏观到微观理解coding

宏观思维就是对所做事情的整体有一个清晰认识,并知晓我们追求的目标是什么。在理解了整体之后,我们需要针对自己感兴趣部分做深入的了解,这就是所谓的微观思维。古语“不谋全局者,不足谋一域”说的是同样的道理。

个人认为接口是理解从宏观到微观的核心所在,那么究竟什么是程序的接口呢?为什么说她是核心呢?

程序接口

图1 函数实体及其输入、输出

函数是完成特定功能的实体,而接口就是函数的输入、输出,及其所完成的功能。这样的好处是只要函数输入、输出、及其所完成的功能不变,也就是函数的接口不变,函数的具体实现方式与如何运用该函数独立,从而达函数实现与应用的剥离。这样做应用的可以更加专注于应用,做具体实现的可以专注于更好的实现。

下面以一个简单的例子阐述上述程序接口及其妙处

整数乘法实现1

int multiply(int a, int b) # 输入为整形a、b,输出为整形

{

int result = 0;

for(i=1; i<=b; i++)

{

result = result + a;

}

return result;

}

整数乘法实现2

int multiply(int a, int b)# 输入为整形a、b,输出为整形

{

return a*b;

}

这两种实现方式在运算效率、可读性等方面存在差异(实现整数乘法方面有点冗余),但她们的共同特点是实现两个整数相乘,并且输入、输出形式完全相同,也就是功能一致、形式相同,或者说接口相同。假如我们在应用程序中需要使用我们上述定义的乘法运算,即:

int a = 2;

int b = 3;

int result;

result = multiply(a, b);

通过选取适当的实现(实现1或者实现2),编译后即可得到我们应用程序所期望的结果。假如首先选择的是实现1,发现其运行速度不能满足我们的需求,我们需要做的只是选择实现2,重新编译即可,几乎不必修改应用程序的代码。

总结:函数功能一致,输入、输出形式相同是关键(也就是接口前后一致);实现可以因时、因地、因人而异。

程序接口是从宏观到微观的核心

程序接口实例之一

Linux下读写硬盘文件、U盘文件等,对应用程序而言并没有本质的区别。基本都是遵循以下流程,打开文件(open)、读文件(read)、写文件(write)、关闭文件(close)等。open、read、write和close可以理解为Linux下对文件操作的接口。对于应用程序的编写者来说,对文件的操作只需要遵循特定的流程即可,而完全可以忽略这些操作所有的实现细节。

程序接口实例之二

图2 网络分层示意图

在网络应用编程中,我们很少涉及到物理传输层、数据链路层、网络层。如图2所示,网络采用的是一种自底向上的结构,低层只对其紧邻的高层提供接口(请回顾我们关于接口的论述)。以数据链路层为例,数据链路层对网络层提供定义好的接口及其使用规范,这些接口完成数据链路层的工作;网络层依据使用规范,调用这些接口来完成数据链路层工作。好处是,在数据链路层接口极其规范不变的情况下,我们拥有极大的自由选择数据链路层的实现方式。网络的其他层也采用了同样的原理。目前,我们日益丰富的网络应用就得益于这种架构的设计。

程序接口理解之升华

接口的本质究竟是什么,她背后的哲学思想又是什么呢?对这种问题的看法因人而异,下面笔者结合经验谈谈自己的一些体会。

要实现一个复杂的系统,通常情况下,我们是将该系统划分为几个相对简单的功能模块,然后定义各个功能模块的功能及其接口。当然,相对简单的功能模块也可以继续按照我们上述的方式进行划分,直到模块易于实现为止。这是一种自上而下的设计范式,接口是将各个模块组装起来的粘合剂。(以前只知道存在这么一种设计范式,但是对怎么组装各个模块一直处于懵懂状态,而接口可以理解实现组装各模块的一种方式)

要实现一个特定的功能模块,通常我们会去寻找一些实现类似功能的库函数或者源代码,接着就是,了解现有库函数或者源代码要用到的数据结构,理清她们函数调用之间的先后关系,函数输入、输出,然后在此基础上加入我们特定的处理,按照接口规范封装为接口。(这可以理解为一种自底向上的设计范式,接口提供了如何使用该模块的方法)

举一个不太恰当的例子,各个底层模块可以理解为原子,而接口是这些原子之间进行连接的规范。按照规范进行连接的原子可以形成具有特定功能的分子。如果将分子也视为一种具有特殊功能的原子,那么分子与分子、分子与原子、原子与原子的各种结合可以构建更加复杂的功能。从这个角度可以得出,接口是组合现有资源(程序、分子、原子等)的一种途径。

概括:每个模块尽可能简单易于实现(哲学韵味),同时提供由简单模块构造更加复杂模块的机制(接口),对于构建复杂系统具有重要意义。

总结:接口及其所对应的功能可以理解为任务,让程序员自己决定如何完成任务,这种模式可以称之为,程序任务式管理法。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/dab5c8ac047b1ce9996664b57da2d454.html