从宏观到微观理解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所示,网络采用的是一种自底向上的结构,低层只对其紧邻的高层提供接口(请回顾我们关于接口的论述)。以数据链路层为例,数据链路层对网络层提供定义好的接口及其使用规范,这些接口完成数据链路层的工作;网络层依据使用规范,调用这些接口来完成数据链路层工作。好处是,在数据链路层接口极其规范不变的情况下,我们拥有极大的自由选择数据链路层的实现方式。网络的其他层也采用了同样的原理。目前,我们日益丰富的网络应用就得益于这种架构的设计。
程序接口理解之升华
接口的本质究竟是什么,她背后的哲学思想又是什么呢?对这种问题的看法因人而异,下面笔者结合经验谈谈自己的一些体会。
要实现一个复杂的系统,通常情况下,我们是将该系统划分为几个相对简单的功能模块,然后定义各个功能模块的功能及其接口。当然,相对简单的功能模块也可以继续按照我们上述的方式进行划分,直到模块易于实现为止。这是一种自上而下的设计范式,接口是将各个模块组装起来的粘合剂。(以前只知道存在这么一种设计范式,但是对怎么组装各个模块一直处于懵懂状态,而接口可以理解实现组装各模块的一种方式)
要实现一个特定的功能模块,通常我们会去寻找一些实现类似功能的库函数或者源代码,接着就是,了解现有库函数或者源代码要用到的数据结构,理清她们函数调用之间的先后关系,函数输入、输出,然后在此基础上加入我们特定的处理,按照接口规范封装为接口。(这可以理解为一种自底向上的设计范式,接口提供了如何使用该模块的方法)
举一个不太恰当的例子,各个底层模块可以理解为原子,而接口是这些原子之间进行连接的规范。按照规范进行连接的原子可以形成具有特定功能的分子。如果将分子也视为一种具有特殊功能的原子,那么分子与分子、分子与原子、原子与原子的各种结合可以构建更加复杂的功能。从这个角度可以得出,接口是组合现有资源(程序、分子、原子等)的一种途径。
概括:每个模块尽可能简单易于实现(哲学韵味),同时提供由简单模块构造更加复杂模块的机制(接口),对于构建复杂系统具有重要意义。
总结:接口及其所对应的功能可以理解为任务,让程序员自己决定如何完成任务,这种模式可以称之为,程序任务式管理法。
让听到炮火的人呼唤炮火!让一线直接决策! --任正非
从宏观到微观理解coding的更多相关文章
- 程序员从宏观、微观角度浅析JVM虚拟机!
1.问题 1.JAVA文本文件如何被翻译成CLASS二进制文件? 2.如何理解CLASS文件的组成结构? 3.虚拟机如何加载使用类文件的生命周期? 4.虚拟机系列诊断工具如何使用? 5.虚拟机内存淘汰 ...
- HDFS的读写流程——宏观与微观
HDFS的读写流程--宏观与微观 HDFS:分布式文件系统,负责存放数据 分布式文件系统:就是将我们的数据放到多台电脑上存储. 写数据:就是将客户端上的数据上传到HDFS 宏观过程 客户端向HDFS发 ...
- php程序执行过程--非宏观和微观而是写的程序一行一行的路径----利用xdebug了解一段程序的执行过程----覆盖率
1.xdebug_start_code_coverage();//在需要开始跟踪程序执行路径时使用 2.var_dump(xdebug_get_code_coverage());//在结尾使用打印程序 ...
- 微观SOA:服务设计原则及其实践方式
大 量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA, 集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式, ...
- python-快速排序,两种方法→易理解
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- java 内存模型的理解
之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...
- Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...
- python中对类的方法中参数self的理解
我们通过下面的代码来对参数self进行理解 #coding:utf-8 2 class washer(): 3 def wash(self): 4 print("洗衣服") 5 p ...
随机推荐
- Laravel学习笔记(五)数据库 数据库迁移案例2——创建数据结构,数据表,修改数据结构
默认假设 所有的列在定义的时候都有默认的假设,你可以根据需要重写. Laravel假定每个表都有一个数值型的主键(通常命名为”id”),确保新加入的每一行都是唯一的.Laravel只有在每个表都有数值 ...
- 如何彻底卸载Oracle
如何彻底卸载Oracle 因为Oracle在Windows下的卸载颇有一些麻烦,如果不能完全卸载有可能影响将来的再次安装!常规卸载方法是运行Oracle的自带的卸载程序,可遗憾的是我在卸载时总不能完全 ...
- html基础 1
大三已经快要结束的时候才意识到自己真的一点东西都没有学到,然后就决定要在大四结束前能学多少是多少,自己要尽力.之所以要开博客是因为自己总是坚持不了,要给自己一个坚持下去的动力所以开始了.慢慢的一步一步 ...
- 让reddit/r/programming炸锅的一个帖子,还是挺有意思的
这是原帖 http://www.reddit.com/r/programming/comments/358tnp/five_programming_problems_every_software_en ...
- 无需写try/catch,也能正常处理异常 (转)
原文地址: http://www.cnblogs.com/artech/archive/2012/10/28/automatic-exception-handling-aspnet.html 对于企业 ...
- [转载]tlb、tlh和tli文件的关系
tlb.tlh和tli文件的关系 tlb文件:com类型库文件.在需要使用对应com类的模块里,“#import ...*.tlb”使用之. tlh.tli文件:他们是vc++编译器解析tlb文件生成 ...
- android上下文菜单
XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...
- 古诗词api,诗词接口,诗词api,中国诗词
服务商:api.getlove.cn 分类:诗词 更新时间:2016-03 如果接口不满足您的要求,您可以联系qq:2265658022购买完整的数据库 免费apikey:56eab527a0facb ...
- javascript 中slice,substr,substring方法的对比
实际开发过程中,字符串是一种最常用的一种数据类型,而在程序中对字符串的操作也是十分繁琐,javascript中就提供了很多字符串相关的方法,然而由于方法过多,很多方法功能有交叉,参数有雷同,容易使用混 ...
- 傻瓜式操作Nagios
傻瓜式操作Nagios 不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...