一次成功的重構實踐3 抽象的藝術

2021-09-10 15:09:42 字數 2404 閱讀 9210

黃國強 2019/2/7

抽象能力的培養非常重要。所謂抽象即抓住事物的本質規律,透過現象看本質。乙個程式設計師工作多年,寫**的技術都會掌握。但是如果想做架構,缺乏抽象能力是不行的。

這就好比工匠和藝術家,前者只能做到是技藝純熟,不斷重複自己。藝術家往往可以表達人類普遍情感,探索客觀世界的規律。比如,物理學上補色原理就是印象派畫家最先發現並運用到他們的作品中。

回到程式設計,看乙個具體的例子。

裝置裡用到了多種io控制卡,控制卡負責讀取感測器輸入訊號並輸出訊號控制裝置動作。下面分別是三個控制卡的api。

// 控制卡1的輸入輸出函式

exports void callback piodio_outputword(dword wportaddress, dword woutdata);

exports void callback piodio_outputbyte(dword wportaddr, word boutputvalue);

exports dword callback piodio_inputword(dword wportaddress);

exports word callback piodio_inputbyte(dword wportaddr);

// 控制卡2的輸入輸出函式

exports word callback frb_sendsa(word wport, word san, word woutputdata);

exports word callback frb_receivera(word wport, word ran, word *winputdata);

exports word callback frb_readrastatus(word wport,byte *brastatus);

// 控制卡3的輸入輸出函式

short __stdcall ps400_get_frnet_di

(byte bcardid, /* the specific card id that is configured by onboard dip-switch */

word wsa, /* group address frnet_sa8 ~ frnet_sa15 */

word *pstatus, /* the pointer to the frnet di status */

word wenabledirectaccess = frnet_enable_direct_access /* frnet_enable_direct_access/frnet_disable_direct_access, access the di module directly, or read the stored status in driver */

);short __stdcall ps400_set_frnet_do

(byte bcardid, /* the specific card id that is configured by onboard dip-switch */

word wra, /* group address frnet_ra0 ~ frnet_ra7 */

word wdodata /* the data to do module */

);

很明顯,三個api完全不同,任何其他模組如果用到io,並直接使用這些api的話,將不可避免地導致這些**不可移植,換io卡必須重寫這些**,這很無聊。而且類似模組如果很多的話,工作量也很大。

因而這裡我們需要抽象,我們認為世界上只有標準的io卡,這個io卡包含下面幾個函式。

// 從眾多不同的io卡提煉出以下三個基本函式成為類成員

void biton(const word, const word, const word, const bool); // 輸出on訊號

void bitoff(const word, const word, const word, const bool); // 輸出off訊號

bool bits(const word, const word, const word, const bool); // 查詢當前io狀態

問題來了,這些函式怎麼獲得呢?這裡加重點:要從軟體使用者的角度,獲得得到這些函式。以氣缸為例,對於使用者來說,客戶只關心如何開啟氣缸、如何關閉氣缸以及當前是關還是開的狀態。所以這個io卡抽象出這個三個函式是正確的。如果站錯了角度,你抽象出的函式根本就是不對的。

我們把真實的io卡適配到這個標準卡,達到設計模式裡所提到到的「抽象與實現分離」的目的。架構師的工作就是不斷發掘系統裡形形色色的類和函式,把抽象出乙個又乙個與具體實現無關的類放到領域層中。那麼領域層到底是什麼?賣個關子,以後再寫。

一次成功的重構實踐2 架構設計的目的

黃國強 2019 1 27 華為老總任正非在1月9日在杭州研究所業務匯報會上的講話 表示在軟體工程能力提公升上,我們最缺乏的是對巨集觀架構有清醒認識的人才。建立公司是乙個架構 建立公司的利益體系也是乙個架構 任何產品都是架構第一 軟體重構一定要從巨集觀架構入手。這段話蠻應景的,正好總結了我去年的工作...

一次典型的重構

背景描述 近期要去講一次重構,想收集乙個案例,恰好從網上看到了乙個朋友寫的乙個計算算術表示式的 c 程式,原程式是計算含括號的正整數表示式的四則運算值。讀後,發現問題比較多,而且邏輯有錯誤,因此對其進行了重構。為簡化起間,將程式的功能進行了簡化 1 計算的算術表示式只含有 運算 2 不含有括號 3 ...

一次典型的重構

背景描述 近期要去講一次重構,想收集乙個案例,恰好從網上看到了乙個朋友寫的乙個計算算術表示式的 c 程式,原程式是計算含括號的正整數表示式的四則運算值。讀後,發現問題比較多,而且邏輯有錯誤,因此對其進行了重構。為簡化起間,將程式的功能進行了簡化 1 計算的算術表示式只含有 運算 2 不含有括號 3 ...