※ 引述《[email protected] (汀)》之銘言:
: ※ 引述《[email protected] (10/100天自我觀察)》之銘言:
: 其實啦,其實呢.....
: 剛看到上面的兩個 styles 時就知道你想幹嘛了,
: 但是很遺憾大家慣用的寫法還是 style 1,
: 出現需要用到 style 2 的情形,
: 通常就是所謂的程式結構設計不良,
: 你需要一些中介層或抽象層來解決這種型別交互相依性。
: #include "a.h" <------- 抽象型別 1
: #include "b.h" <------- 抽象型別 2
: ...
: #include "X.h" <------- 具象型別 1
: #include "Y.h" <------- 具象型別 2
: ...
: 因為你應該讀過 OO design pattern,
: 所以我想你知道我在說什麼。
: 而且抽象型別在 C++ 還可以用 template 寫出來,
: 這時只要在 instantiation 的點看到 template argument 用的 type,
: 以及 template 本身的 definition,
: 無論其先後順序都可以 instantiate。
: 如果你連寫抽象型別都遇到要型別交互相依的問題,
: 你或許就該考慮再抽出一層抽象層,
: 或是直接 template 化,
: template 化可以省下一個單位的繼承樹高度,
: performance 上也會表現得比較良好。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.225.145.74
其實我還沒到你說的那種境界的說,論開發實務,
我經驗很不夠的。不過您這篇我會存起來,因為以後還是會很有機會用到。
謝謝你^___^
主要是三件事來講
1.指導小弟的人說,合作做系統開發是要用分層的架構
2.我把每個可以獨立出來使用的IC,都有自己的一個目錄與其對應的.so
3.如果說把全部的程式碼都全寫在一個檔案下我懂,但許多檔案時便知自己沒概念
+++++++ 以下是對1. 2. 3. 特別說明 +++++++
1.指導小弟的人說,合作做系統開發是要用分層的架構
====================================
其實,我也是第一次開發這種大程式的
我作東西是與人有分層,而層與層之間是使用callback機制
而callback機制的實用是用傳統的方式
就是 concrete class 去繼承一個原本已經談好的abstract class
而下層要將資料傳到上層的時候
下層的人只要去呼叫 the pointer to object of abstrct class
上的pure virtual function 即可
而concrete class 則是由上層的人來實現。
這concrete class 與 abstract class是分別定義在不同的 .h檔裡的
而concrete class的實作 本身就要使用到 非常多的 .h檔
這些.h檔含有很多class,但是這些class彼此之間又很頻繁的要去使用到
別個.h檔 的class 作P 或者 像 P* 之類的指標參數
這些是我還沒使用 template的。
===================================================
2.我把每個可以獨立出來使用的IC,都有自己的一個目錄與其對應的.so
================================================================
我寫template的部份,是在於一些比較獨立好用的東西,會寫template
真的程度可能就是停留在"巨集"的概念吧 >"<
譬如在 ./includexr 下有五個檔 xxx.h xxx.cpp Templates.cpp rrr.h rrr.cpp
g++ -c xxx.cpp -fPIC 作成xxx.o檔
g++ -c rrr.cpp -fPIC 作成rrr.o檔
g++ -c Templates.cpp -fPIC 作成Templates.o,所以需要instantiate的就都寫這邊。
g++ xxx.o rrr.o Templates.o -shared -o "libxr.so" 作出 libxr.so檔
cp libxr.so ../libs
所以./ 目錄下的main.cpp有要使用這.so檔裡面東的話
就可以這麼作
在main.cpp 裡面多加
#include "includexr/xxx.h"
#include "includexr/rrr.h"
最後連結時就用如下方式即可
g++ -o main.cpp -Llibs -lxr
譬如這些template class 可能有一堆不一樣的人開發而成時
就把每個人開發的東西自訂一個目錄,因為最後都可以作出.so 檔
所以我就在每個目錄寫個很單純的shell script,故每個目錄下的instantiate都可調整
只要我把該include到的.h檔都include到,而不同人開發的東西又放在不同目錄
最後我就 透過 g++ -o main.cpp -Llibs -lxr -lxr2 -lxr3 ...
這樣子的方式都串聯起來。
====================================================================
3.如果說把全部的程式碼都全寫在一個檔案下我懂,但許多檔案時便知自己沒概念
=======================================================================
我總是對於這種牽址到要跨資料夾的,很理不出頭緒
而我對編譯的概念一直不是很搞的清楚,有時候自己只會知道,這邊如果沒宣告會錯
這邊如果沒有include會錯,但是就是不能曉得說,是編譯跟連結間,他們的原理是怎樣
,因此我們才知道 什麼時候 要include ,什麼時候要 宣告。
然後像別人如果又來搞個全域變數的東西時,可能又變成說摸索怎樣去compile
才把這全域變數用進來。這樣都是一直try and try的
但是不是說如果有聽編譯器的課,可能就會比較清楚知道,什麼時候自己要幹嘛
就不用一直不斷的try了呢? 因為指導的人本身沒有許多檔案下的開發經驗,
所以我一直在研究怎樣才能夠順利的在多檔案下開發,
也許就是因為沒概念又經驗不夠,所以開發的動點總是變成在處理這一堆檔案。
==================================================================