一次次的代码更新,SVN上的代码号直接蹦到了5位数;当你部署代码时,看着运维冒着幽光的怨恨眼神,你叔忍了,但你婶认为绝不能忍;于是你发粪图墙……
4.2 福音
有一天,某位先祖发现自己的神器青铜大剑居然被一柄小匕首斩断了,擦啊,这是什么玩意?超神器?
呵呵,猪脚模式开启了,在代码界,你也发现了“神器”。
你先把这个名单弄到了数据库里(表名famous_persons):
然后,你用这把“神器”大刀阔斧把臃肿的CFamousPersons剁的稀烂。
再然后,你重造了一个轮子:
...
typedef void* (__stdcall*PExportClass)();
…
class CFamousPersons {
…
private:
CConnectionconn;
...
constchar* findPlugin(string name) {
char*pluginFile = "";
stringsqlCmd = "SELECT * FROM famous_persons WHERE Name=\"";
sqlCmd +=name;
sqlCmd +="\"";
CRecordset*rs = conn.executeQuery(sqlCmd);
if(!(rs->Eof()|| rs->Bof())) {
pluginFile= new char[256];
strncpy(pluginFile,rs->fieldValue(2), 256);
}
rs->destroy();
returnpluginFile;
}
public:
CPeople*find(string name) {
CPeople*people = NULL;
stringpluginFile = findPlugin(name);
if(!pluginFile.empty()){
HMODULEplugin = LoadLibrary(pluginFile);
if(plugin){
PExportClassexportClass = (PExportClass)GetProcAddress(plugin, "exportClass");
if(exportClass)
people = (CPeople*)exportClass();
}
}
returnpeople;
}
};
...
哇噢,酷!从此,你远离了CFamousPersons;远离了那糟糕的日子。生活貌似从这一刻又重新燃起了希望……
嗯,出乎意料的,你又做梦了,在梦里,你抛弃了数据库,增加了好些个辅助模块,代码简洁而优雅,充满美感……
5 蒸汽机时代
5.1 贪婪的欲望
终于,当我们的先祖们还沉浸在冷兵器时代,突如其来的炮火,把国门轰得稀烂;战火不断,黄金白银都顶不住火药的贪婪……
代码界里,你也终究没来得及亲自尝试抛弃数据库的喜悦,各种框架猝不及防的降临。
5.2 神赐
好吧,时间线已经很接近现实,不过先祖们始终没有得到神赐,一切都靠自力更生。
代码界里不一样,我们有了很多框架(神器)。比如说COM(恩,还有个学模学样的跨平台的XPCOM)。说起COM(应算是业界如雷灌招风耳的大神器了),听上去好像不是很沾边,但COM的CreateInstance其实现原理和应用机制,仍然是工厂模式。
当然,实现形式有了很大变化,就如他不采用名字,而是采用GUID映射;他不用数据库,而是使用注册表保存映射关系;他甚至还有自己的内存机制;有自己的数据类型等等。(广告:预知详情,请关注后续分享)。
6 另一个梦想