What I write, what I lose.
以下為個(gè)人關(guān)于Linux下C程序的可擴(kuò)張性的一點(diǎn)想法.
?
可擴(kuò)展性的應(yīng)用場(chǎng)景:
1. 有兩個(gè)項(xiàng)目都需要使用的一個(gè)相同功能的程序, 但是有些要求不一樣.
? ? 比如:升級(jí)程序, 一個(gè)是2個(gè)分區(qū),一個(gè)是3個(gè)分區(qū).
2. 具體使用的參數(shù)可能產(chǎn)生變化.
? ? 比如:服務(wù)器地址, 可能在開(kāi)發(fā)階段和正式上線(xiàn)階段不同.
?
如何讓程序具有可擴(kuò)展性. 我理解到的增加可擴(kuò)展的方式.
1.代碼級(jí)別的修改.
比如針對(duì)服務(wù)器地址:
……
const char* server_url = “http://testserver:8080/service/xxInterface”;
https_post(server_url, ……);
……
當(dāng)程序更新服務(wù)器地址為正式服務(wù)器后, 則在代碼中找到對(duì)應(yīng)的地方, 修改為
……
const char*server_url=“http://domainserver:8080/service/xxIterface”;
https_post(server_url, ……);
……
修改時(shí)需要找到所有使用此地址的變量. 全部加以修改.
2.代碼級(jí)別的宏定義修改.
……
#define SERVER_URL “http://testserver:8080/service/xxInterface”;
……
https_post(SERVER_URL, ……);
……
當(dāng)程序更新服務(wù)器地址為正式服務(wù)器后, 則只需要修改此一處宏定義即可.
這種方法修改比較簡(jiǎn)單. 但是缺點(diǎn)是需要手動(dòng)更新源代碼.
3.腳本控制/修改代碼中的宏定義.
源代碼中的一些宏定義是由腳本統(tǒng)一生成的. 修改此宏定義只需要修改對(duì)應(yīng)的控制腳本或者控制腳本解析的文件. 然后由腳本生成源代碼中的宏定義頭文件.
具體的簡(jiǎn)單示例如下:
控制腳本config.sh 負(fù)責(zé)生成宏定義選項(xiàng)到 common_def.h頭文件中.
common_def.h中定義程序需要使用到的宏定義選項(xiàng).
具體實(shí)現(xiàn)的.c源代碼include 頭文件common_def.h.
修改宏定義則需修改config.sh或者控制腳本解析的文件 .執(zhí)行腳本生成新的common_def.h頭文件. 然后重新編譯.
4.編譯選項(xiàng)修改.
編譯預(yù)處理時(shí)的宏定義由編譯選項(xiàng)確定.
具體的簡(jiǎn)單示例如下:
代碼中有:
#if DOMAIN_SERVER
const char* server_url = http://domainserver:8080/service/xxIterface;
#else
const char* server_url =“http://testserver:8080/service/xxIterface”;
#endif
DOMAIN_SERVER的定義不在源代碼中設(shè)定, 而是在編譯的時(shí)候有編譯器選項(xiàng)確定.
gcc –o a.out -DDOMAIN_SERVER=1 src.c //打開(kāi)#if DOMAIN_SERVER
gcc –o a.out -DDOMAIN_SERVER=0 src.c //關(guān)閉#if DOMAIN_SERVER
使用不同的編譯選項(xiàng)重新編譯即可讓程序擴(kuò)展使用不同的server_url.
5.硬編碼配置文件.
在代碼中增加一個(gè)配置信息模塊. 程序需要的可配置信息從此模塊中讀取. 需要程序針對(duì)配置擴(kuò)展修改時(shí), 只需要修改此模塊重新編譯即可.
具體的簡(jiǎn)單示例如下:
update_config模塊. update_config.c
……
add_config_item(“server_url”, “http://domainserver:8080/service/xxIterface”);
……
修改時(shí)只需要修改對(duì)應(yīng)的update_config模塊中的代碼.
此方法跟統(tǒng)一宏定義的方法類(lèi)似. 區(qū)別在于增加獨(dú)立的配置信息模塊.
6.動(dòng)態(tài)配置文件.
程序在需要可配置信息時(shí), 需要讀取獨(dú)立的配置文件, 解析此配置文件得到具體的配置信息.
具體的簡(jiǎn)單示例如下:
配置文件 update.conf:
server_url=http://domainserver:8080/service/xxIterface
配置信息模塊解析文件update.conf. 得到server_url的值. 封裝提供給其它模塊使用.
配置文件的格式可自行設(shè)定. 如設(shè)置成鍵值對(duì)的文本文件, 或者xml格式都可以.
此方法的優(yōu)點(diǎn)是不需要重新編譯代碼, 只需修改config配置文件即可使獲得可擴(kuò)展性.
7.使用環(huán)境變量
程序在需要使用可配置信息時(shí), 使用getenv讀取環(huán)境變量. 注意需要在程序運(yùn)行之前設(shè)置該環(huán)境變量.
具體的簡(jiǎn)單示例如下:
run.sh是程序運(yùn)行腳本. a.out是可執(zhí)行程序, a.out需要使用server_url.
run.sh中內(nèi)容
export SERVER_URL=http://domainserver:8080/service/xxIterface
./a.out
a.out實(shí)現(xiàn).
const char* server_url = getenv(“SERVER_URL”);
……
此方法的優(yōu)點(diǎn)是不需要重新編譯代碼, 只需要在程序運(yùn)行前修改對(duì)應(yīng)的環(huán)境變量定義.
8.使用可執(zhí)行程序的參數(shù)
可執(zhí)行程序在實(shí)際執(zhí)行時(shí), 可對(duì)參數(shù)進(jìn)行解析, 根據(jù)不同的參數(shù)內(nèi)容得到不同的可配置信息.
具體的簡(jiǎn)單示例如下:
a.out實(shí)現(xiàn)的時(shí)候先解析參數(shù).
a.out –ddomainserver 解析為使用domainserver
a.out –dtestserver 解析為使用testserver
實(shí)際使用過(guò)程中, 可根據(jù)不同的應(yīng)用場(chǎng)景, 使程序執(zhí)行具有可擴(kuò)展性.
以上, 謝謝......
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
