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

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