程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 從宏觀到微觀理解coding,宏觀微觀coding

從宏觀到微觀理解coding,宏觀微觀coding

編輯:關於C語言

從宏觀到微觀理解coding,宏觀微觀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所示,網絡采用的是一種自底向上的結構,低層只對其緊鄰的高層提供接口(請回顧我們關於接口的論述)。以數據鏈路層為例,數據鏈路層對網絡層提供定義好的接口及其使用規范,這些接口完成數據鏈路層的工作;網絡層依據使用規范,調用這些接口來完成數據鏈路層工作。好處是,在數據鏈路層接口極其規范不變的情況下,我們擁有極大的自由選擇數據鏈路層的實現方式。網絡的其他層也采用了同樣的原理。目前,我們日益豐富的網絡應用就得益於這種架構的設計。

程序接口理解之升華

接口的本質究竟是什麼,她背後的哲學思想又是什麼呢?對這種問題的看法因人而異,下面筆者結合經驗談談自己的一些體會。

要實現一個復雜的系統,通常情況下,我們是將該系統劃分為幾個相對簡單的功能模塊,然後定義各個功能模塊的功能及其接口。當然,相對簡單的功能模塊也可以繼續按照我們上述的方式進行劃分,直到模塊易於實現為止。這是一種自上而下的設計范式,接口是將各個模塊組裝起來的粘合劑。(以前只知道存在這麼一種設計范式,但是對怎麼組裝各個模塊一直處於懵懂狀態,而接口可以理解實現組裝各模塊的一種方式)

 

要實現一個特定的功能模塊,通常我們會去尋找一些實現類似功能的庫函數或者源代碼,接著就是,了解現有庫函數或者源代碼要用到的數據結構,理清她們函數調用之間的先後關系,函數輸入、輸出,然後在此基礎上加入我們特定的處理,按照接口規范封裝為接口。(這可以理解為一種自底向上的設計范式,接口提供了如何使用該模塊的方法)

 

舉一個不太恰當的例子,各個底層模塊可以理解為原子,而接口是這些原子之間進行連接的規范。按照規范進行連接的原子可以形成具有特定功能的分子。如果將分子也視為一種具有特殊功能的原子,那麼分子與分子、分子與原子、原子與原子的各種結合可以構建更加復雜的功能。從這個角度可以得出,接口是組合現有資源(程序、分子、原子等)的一種途徑

 

概括:每個模塊盡可能簡單易於實現(哲學韻味),同時提供由簡單模塊構造更加復雜模塊的機制(接口),對於構建復雜系統具有重要意義。

 

總結:接口及其所對應的功能可以理解為任務,讓程序員自己決定如何完成任務,這種模式可以稱之為,程序任務式管理法。

 

讓聽到炮火的人呼喚炮火!讓一線直接決策!  --任正非

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved