数据与程序分离——程序中那些表的事儿
我們先來看一小段程序:
const char *GetString(int key) {if (key == 1)return "first";else if (key == 2)return "second";else if (key == 3)return "third";else if (key == 4)return "forth";//...return "none"; ]這是我們經常會看到的一段程序,設計模式中著名的工廠方法。它封裝了將“材料”生產成“產品”的過程,使程序更加容易讀懂,并方便后期修改(易讀性與可維護性)。當然,在“產品”很少的時候,這樣的程序又簡明又易寫,很是適合。但當我們的工廠逐漸變大,產品的種類越來越多的時候,你就不得不寫上一堆又一堆的 else if 了,這可是非常麻煩和煩人的一件事。后期修改的時候,讀程序的人也會不禁咒罵之前的作者——這樣的意大利面條可不是誰都愿意吃的。
沒錯,當面對這種情況時,你馬上會想到用 switch 來代替。你很聰明,switch 從形式上,確實要比 else if 明了得多了,但是它也有一個缺點:如果 key 變為了非整型或 char 型,又該怎么辦?
?
這個時候,我們會想到,如果有一種方法,能將數據與程序分離開,每次出現新產品,只需要將產品的樣式填到菜單里就可以,那多好。啊,數據庫,它可以很方便地管理這些字段。這是個好的建議,當數據項和數據量多到一定程度時,使用數據庫幾乎成為必然手段。然而,我們面對的卻是一種尷尬的情況:問題的規模不適合用 else if 和 switch 處理,如果使用數據庫,且不說運行效率,僅從操作的麻煩程序上來說,還不如直接寫 else if 了。。。所以在這里,我們需要的不是強大卻麻煩的大型數據庫,我們需要的,僅僅是編程上的一點小技巧。說到這里,也許您已經明白了,沒錯,就是在程序中實現一個數據表與查詢方法。查詢方法只按固定的方式去數據表中查詢對應項的數據,然后返回。這樣,既不必連接消耗資源的數據庫,提高程序運行效率,又可以明了簡便地完成我們想要的模式。查詢方法很簡單,只要給一個數據結構,遍歷就是了,那么表呢?用什么來實現?對,在C中,數組是一個必然的選擇。表是二維的,那么用二維數據嗎?顯然不行,二維數據只能維護一堆數據類型相同的數據,這顯然不符合我們的需要。我們是要將int型數據對應為string型的。于是我們想到了一個利器:結構體數組。
?
那么讓我們來改寫一下之前的代碼:
#define END 9999typedef struct {int key;char *str; }ITEM;const ITEM table[] = {{1, "first"},{2, "second"},{3, "third"},{4, "forth"},//... {END, NULL} };const char *GetString(int key) {for (int i = 0; table[i].key != END; i++) {if (table[i].key == key)return table[i].str;} }table維護了數據的對應,而GetString只是遍歷table去查找相應項。每當產品增加時,我們只需要在table中添加一個對應項即可。這樣就解決了我們所面對的用 else if? 和 switch 不足,用數據庫又有余的數據對應問題。
同樣的方法也適用于Java。Java中使用枚舉來替代結構體數組。
轉載于:https://www.cnblogs.com/qyit/archive/2012/05/30/2525801.html
總結
以上是生活随笔為你收集整理的数据与程序分离——程序中那些表的事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取一个目录下文件扩展名为txt或htm
- 下一篇: Linux环境变量的修改(永久,暂时)