C Plug in 技術的一些深度思考 1

2021-08-30 08:03:04 字數 3233 閱讀 5673

c++ plug-in 技術的一些深度思考(2)

最近,忙於思考如何重構乙個unix系統。這個系統是由c++寫的,重構的思路是希望能夠抽取出一些公共的東西,作為core。另外一些東西做成plug-in。這樣以後如果客戶的規範更新了,我們只需要增加修改plug-in就好了,core的部分不需要再修改。

要滿足這個要求,有些基本的原則:

[1] core裡面所有的東西不能依賴plug-in裡面。這種依賴可以理解為build(compiler + link)core裡面模組的時候,不需要用到plug-in裡面的標頭檔案或者object檔案;

[2] 部署的時候,可以不用重新部署core。只需要update plug-in,就可以獲得新功能。

[3] 現有**最好能夠最大程度的復用。 

因為這些要求,對c++設計編碼在大型系統中的使用,有了一些新的體會和認識。為了簡化問題,我抽象了乙個簡單的例子。

有這樣乙個需求: 給定乙個整數陣列,我們需要對這個陣列作些運算,這個運算現在看到的有求和,求積,未來可以增加運算規則,譬如求最大值,最小值,平均值等等。現在不能**未來需要那些運算,系統需要擴充套件的能力。

首先來看看運用物件導向和工廠模式給出的初始設計。

我們有乙個icalc的藉口,介面裡唯一乙個需要override的函式是:  virtual void calc(int *p, size_t size, int *result) = 0  這裡說唯一是從設計角度考慮的,因為它本身的析構函式也是純虛函式。另一方面,這個函式沒有要求是const的,這個不會影響我們的討論。因為現有系統中並沒有一致的使用const,所以我們設計這個介面的時候,沒有把const考慮進去。

接下來,我們設計兩個實體類calcadd和calcmul,當然它們都override了calc這個方法。我們又設計了乙個calcfactory,它有個靜態函式getcalc(string calctype)。通過calctype的值,返回正確的calc型別。

目錄結構 

// include/icalc.h

#ifndef _icalc_h_

#define _icalc_h_

#include class icalc

;#endif //_icalc_h_

//include/calcfactory.h

#ifndef _calcfactory_h_

#define _calcfactory_h_

#include #include "icalc.h"

class calcfactory

;#endif //_calcfactory_h_

//include/calcadd.h

#ifndef _calcadd_h_

#define _calcadd_h_

#include "icalc.h"

class calcadd : public icalc

;#endif //_calcadd_h_

給純續函式提供函式體是可以的,在這種情況下也是必需的。

#include "../include/icalc.h"

icalc::~icalc()

// src/calcfactory.cpp

#include "../include/calcfactory.h"

#include "../include/calcadd.h"

#include "../include/calcmul.h"

using std::string;

icalc* calcfactory::getcalc(string calctype)

else if ("mul" == calctype)

else

}

// src/calcadd.cpp

#include "../include/calcadd.h"

void calcadd::calc(int *p, size_t size, int *result)

}calcadd::~calcadd()

// src/main.cpp

#include #include #include "../include/calcfactory.h"

#include "../include/icalc.h"

using namespace std;

int arr = ;

int result; // result = 0

int main(int argc,char* argv)

if (string("add") == argv[1])

else if (string("mul") == argv[1])

icalc *calc = calcfactory::getcalc(argv[1]);

if (!calc)

calc->calc(arr, sizeof(arr)/sizeof(int), &result);

cout << "result = " << result << endl;

delete calc;

return 0;

}

可以看到,這個版本其實是個不錯設計的。因為如果我們要增加乙個求最小值的演算法,只需要設計乙個calcmin,實現icalc介面,重新修改calcfactory的getcalc函式,增加乙個「min」的分支,就ok了。這個設計也符合開閉原則。就是對修改開放,對整個工作流的修改是關閉的。可是,這樣的設計還是有幾個問題:

[1] calcfactory.obj依賴於calcadd.h,calcmul.h。如果增加乙個新的演算法,這個檔案必須重新修改,編譯,鏈結。

[2] calc雖然不依賴於calcadd.h,calcmul.h。換言之,如果calcadd修改了,calc不需要重新編譯,但是卻需要重新鏈結。因為calc需要calcadd.o, calcmul.o。

基於這兩點,我們沒有辦法把calcadd這樣的演算法做成plug-in。因為更新plug-in,我的core程式也需要更新。很多時候這不是乙個嚴重的問題,但是有時候我們確實需要簡單的更新plug-in。因為如果只更新plug-in,我們可以減少很多core程式測試的時間和工作量。這個在大型程式帶來的價值是巨大的。於是,我們繼續改進我們的設計。

c++ plug-in 技術的一些深度思考(2)

對技術深度的一些務虛思考

技術深度 這個詞聽起來很是玄乎,每個人對它的理解都不一樣。我對它的理解主要體現在兩個方面 對業務的理解與思考及對業務 業界中用到的技術點的理解深度。對於業務來說。當我們接到乙個需求或需要去實現某個功能 架構的時候,要有全域性思 維 整體觀,同時又 能透過現象 看到本質 抓住 事情的核心。對專案的思考...

關於Marching Cube的一些疑惑思考

最近學習mc表面繪製,對於開始對於cg方面的一些知識不是很明白,搞的一頭霧水,於是就零零碎碎參考一些網上的程式來學習。主要參考的有3d med 的手冊,網上的一些程式,如 以及跟蹤vtk源 還有這個 但是在閱讀的時候產生的兩個疑惑,表示怎麼算出來的,看了書上的不是很明白,另乙個問題是得到的三角麵片怎...

一些技術書籍

今天下班回來時順便去那個熟悉的舊書攤逛了逛,竟有意外驚喜。之前曾在那裡淘過不少好書,編譯原理 5塊,加密與解密 10塊。比 還便宜不少,而且還是正版書!剛看了看,猛然發現一本好書 資料結構 c 語言描述,近九百頁磚頭般的好書,原價近百塊,老闆開價15塊,大喜,但不能表現出來,還留著砍價的。後來又看上...