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

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

程序接口

图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. 【原】redis插件安装

    wget -c https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz -O phpredis-2.2.4.tar.gz tar xzf ...

  2. sql2008r 收缩数据库日志log文件;删除errorlog文件的方法

    1.清空log文件,以减少数据库文件log所占的空间 USE dbname1 ; GO ALTER DATABASE dbname1 SET RECOVERY SIMPLE;--设置简单恢复模式 GO ...

  3. HTML5移动端图片上传模块

    上传图片的功能是极为常用的,之前做过一个移动端上传文件的功能(基于jquery的),总结梳理一下. html <div class="uploadPic clearBox"& ...

  4. gulp使用笔记

    gulp简介 gulp 是基于 Nodejs 的自动任务运行器,能自动化地完成javascript/coffee/sass/less/html/image/css等文件的的测试.检查.合并.压缩.格式 ...

  5. map和list遍历基础

    本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5456085.html (Robin) Map import java.util.HashMap ...

  6. 2016-10-17: source insight插件

    使用快捷键注释,单行注释,多行注释,#if 0注释 将文件 mycomment.em点此下载放到sourceinsight的Base工程的路径下(一般是在C:\Documents and Settin ...

  7. Spring概念

    1.控制反转IOC:即生成对象,相当于new的功能,用IOC有利于维护. 2.依赖注入DI:即给属性赋值,相当于JavaBean的setter方法. 3.面向切面方程AOP:使得各个切面和目标类完全松 ...

  8. html尖角提示框的实现

    <style type="text/css">        .box {            background-color: #bebf22;          ...

  9. JAVA学习笔记(1-32)

    1:数据的输入中,也需要提前声明变量.java区分大小写,注意保留字的问题,注意分号. 2:用import调用一个类.用new新建一个对象,相当于c中的malloc. 3:用final定义一个宏,相当 ...

  10. 一张图说懂java中 private default protected public 的区别

    private:修饰完全隐藏类的成员,这样,就不能从类的外边直接访问他们,我们提供set和get方法,保证类中数据域的安全. default:指默认修饰符,什么都不加,实际上它限制的范围就是一个包内可 ...