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

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

程序接口

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

程序接口理解之升华

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

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

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

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

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

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

 

让听到炮火的人呼唤炮火!让一线直接决策!  --任正非

从宏观到微观理解coding的更多相关文章

  1. 程序员从宏观、微观角度浅析JVM虚拟机!

    1.问题 1.JAVA文本文件如何被翻译成CLASS二进制文件? 2.如何理解CLASS文件的组成结构? 3.虚拟机如何加载使用类文件的生命周期? 4.虚拟机系列诊断工具如何使用? 5.虚拟机内存淘汰 ...

  2. HDFS的读写流程——宏观与微观

    HDFS的读写流程--宏观与微观 HDFS:分布式文件系统,负责存放数据 分布式文件系统:就是将我们的数据放到多台电脑上存储. 写数据:就是将客户端上的数据上传到HDFS 宏观过程 客户端向HDFS发 ...

  3. php程序执行过程--非宏观和微观而是写的程序一行一行的路径----利用xdebug了解一段程序的执行过程----覆盖率

    1.xdebug_start_code_coverage();//在需要开始跟踪程序执行路径时使用 2.var_dump(xdebug_get_code_coverage());//在结尾使用打印程序 ...

  4. 微观SOA:服务设计原则及其实践方式

    大 量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA, 集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式, ...

  5. python-快速排序,两种方法→易理解

    快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...

  6. java 内存模型的理解

    之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...

  7. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  8. 彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...

  9. python中对类的方法中参数self的理解

    我们通过下面的代码来对参数self进行理解 #coding:utf-8 2 class washer(): 3 def wash(self): 4 print("洗衣服") 5 p ...

随机推荐

  1. grub4dos

    default 1 timeout 5 gfxmenu (hd0,0)/grub/message configfile #####以上不在第一分区无法加载 title HITSZ_COMMAND co ...

  2. LeetCode 374. Guess Number Higher or Lower

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  3. Dictionary的几种遍历方法

    Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("d", 1) ...

  4. C++11 thread

    //这里使用c++的thread创建了5个线程,并支持传递多个参数 void thread1(int aa,int bb) { cout << aa << bb << ...

  5. Django 后台管理设置(admin.py)

    上面是两种后台效果图,第一张是默认情况下Django的后台,第二张是稍作修改后的情况,下面记录下作了哪些修改: 代码: class ArticleAdmin(admin.ModelAdmin): li ...

  6. bootstrap2.0与3.0的区别

    在阅读这篇bootstrap2.0与3.0的区别的文章之前,大家一定要先了解什么是响应式网站设计?推荐大家看看这篇"教你快速了解响应式网站设计" . 我觉得bootstrap的可视 ...

  7. 牛客网程序员面试金典:1.1确定字符互异(java实现)

    问题描述: 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同, ...

  8. IntelliJ IDEA - 注释模板

    IntelliJ IDEA 注释模板自定义的方式有许多,如Live Templates和File and Code Templates,我比较喜欢File and Code Templates,在新建 ...

  9. copy elision

    http://book.51cto.com/art/200810/93007.htm 1.2.2  数据传送指令 mov:数据移动.第一个参数是目的,第二个参数是来源.在C语言中相当于赋值号.这是最广 ...

  10. Linux下安装JDK并配置环境变量

    1. 查询是否默认安装有JDK [root@localhost bin]# java -version java version "1.6.0_22" OpenJDK Runtim ...