程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++代碼重構——從C global到C++ template

C++代碼重構——從C global到C++ template

編輯:C++入門知識

在學數據結構的時候,我常有這樣目標——寫出能夠最大程度復用的代碼(算法正確,封裝優秀)。我常想——如何能在短時間內達成“算法正確,封裝優秀”這樣的目標。經過一段時間的摸索,我的結論是:先用C寫出正確的算法,再將它改寫成C++ class,最後再考慮改為template。這種方法簡單可行,基本實現了 邏輯(算法)設計與接口設計兩個步驟的分離。

在寫數據結構代碼的場景下,使用這種方法的前提是——你必須先把這個數據結構需要哪些操作弄清楚,並且有如何實現的大致思路(如果不清楚,翻翻書?)。

下面以一個有界隊列為例,進行演示。

正確的算法

在考慮如何實現算法時,可以完全不用任何封裝(C struct的封裝也不用),只要實現最小操作集合就行了,但測試必須要寫。
這裡就是實現所謂的“環形緩沖”,空出一個用於區分隊滿和隊空。連同測試,代碼如下: (運行結果不在此貼出,感興趣的同學自己運行) 在只考慮算法不考慮接口的情況下,寫出這樣的代碼很容易(相信有點語言功底的都能寫得出來)。當然,上面的#define TEST可以不寫,用編譯選項定義也是可以的。

封裝為class

有了這樣的基礎,封裝為C++ class就很容易了(這裡直接包裹,實際情形可能有功能類似但參數不同的接口,略作封裝即可)。這麼簡單的成員函數,沒有必要分開來了,這裡就用一個.h:
封裝為類之後,測試代碼有必要分開來寫:

重構為class template

顯然,這樣直接封裝的有界隊列存在問題——元素類型固定(這通常是寫成template的理由),緩沖大小固定。對於第一點,可以通過將代碼重構為C++的類模板實現;即將元素的類型作為類模板的一個參數。對於第二點,也可以借助模板參數實現(模板除了有類型參數,也可以有值參數)。當然也可以把buffer改為指針,在ctor傳入大小,這裡不做介紹。代碼如下:
此時的測試代碼:
這裡描述的方法(C->OO->template)主要是從代碼復用的角度考慮,並非與傳統OOP教材上的“先接口後實現”相違背。你可以理解為——如何讓《數據結構》教材上的C代碼的到最大程度上的復用。(多數《數據》教材采用C代碼講解,當然也有使用其他語言的) 直接使用“先接口,後實現”的方法,並非不行,只是可能要多改很多次代碼(尤其是考慮模板的時候T^T,想想都是淚,不能讓學弟學妹們掉同樣的坑了)。使用本文所述方法的好處就是——可以讓邏輯設計與接口設計兩個過程解耦。

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