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

    程序接口理解之升华

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

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

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

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

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

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

     

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

  • 相关阅读:
    web性能优化
    9.1_the end
    8.28_the end
    1.获取元素绝对位置
    8.14_end
    JavaScript 函数用途
    JavaScirpt事件处理
    《JavaScript语言精粹》读书笔记
    《图解http协议》之HTTPs学习笔记
    Laya 1.x 按文件夹TS代码合并
  • 原文地址:https://www.cnblogs.com/haoguoeveryone/p/haoguo.html
Copyright © 2020-2023  润新知