很久很久前就想寫這個話題的文章了,但是,總是找不到合適的例子。例子簡單不足於說明問題,例子複雜可讀性就會降低,就會達不到文章的目的。兩難總讓人激發解決問題的鬥志,於是乎自己試著寫寫這個例子吧。這個例子就是學籍管理中增加學籍資訊的乙個功能。我想通過這個例子的不同的解決思路,來說明程式設計的層次步步提高。(注意:文中所有函式都是即興編寫,沒有通過除錯驗證,僅用於說明)
已知:1)資料庫名為:
mydb
,密碼:
1234
2) 主表名為:
student
3)student
欄位名:
id char(6
);學籍編號
name char(10)
;學生姓名
*** char(2)
;學生性別
born_date char(8)
;學生出生日期
f1 char(10)
;其他字段
1 f2 char(20)
;其他字段
2 f3 char(30)
;其他字段
3 f4 char(40)
;其他欄位4
求:將介面上的學生資訊增加到資料庫中。
注意:此功能不考慮學籍編號的重複等問題,不考慮例外處理,採用
insert
語句進行資訊插入,為了便於簡化問題,以上欄位都採用
char
型等。方法
1:
1、 設計介面拖拉
8個控制項用於接收
8個學生資訊。控制項名為:
ctrl1
、ctrl2
、ctrl3...ctrl8
2、 假定控制項均為文字框。
3、 設計乙個增加命令按鈕
4、 命令按鈕程式:用
c#編寫:將控制項中的資訊寫入到資料庫
student
表中。 public void add_data()
方法1分析:
此程式設計為最常見,特點就是就事論事,一氣呵成,達到設計要求。此為一般之水平。
方法
2:同方法
1,但是編寫時注意到了方法
1沒有邏輯劃分,不便於閱讀。於是改進之處是:將程式進行邏輯劃分,通過函式呼叫來清晰功能的結構。主函式只有三行語句。
其命令按鈕程式為:
public void add_data()
public
oledbconnection open_db(string db_name,string password)
public string get_insert_str()
public void exec_sql(string sql_str,
oledbconnection
conn)
方法2分析: 方法2
強調了邏輯劃分,將乙個功能分成了
3個函式。可讀性大大加強。初步地使用了引數和引數呼叫,為函式公用打下了基礎,但是,在
get_insert_str()
中,還是和方法
1一樣,沒有什麼技巧。
方法
3:
同方法2
,但是要解決
get_insert_str()
中語句簡單、語句行數過多問題,以及字段變化對程式的影響問題。其方法是,對控制項命名進行重新命名:
txt_id,txt_name,txt_***,txt_born_date,txt_f1,txt_f2,txt_f3,txt_f4
。使之包含欄位名。
public
string
get_insert_str()
public
string
get_insert_str1(string
flds)
values_str= values_str + ")"
; string
sql = fld_str + " values "
+ values_str;
return
sql;
} public
string
get_ctrl_value(string
ctrl_name,system.web.ui.page
page) }
} return"";
} 方法3
分析:
通過重新命名控制項名,建立欄位名和控制項名的關係,利用欄位名的字串,將控制項中的值通過迴圈語句,逐一的計算處理,並形成了
insert
語句。這個技巧的好處在於,當欄位增加和減少時,只要通過編輯
filds
的字串便可解決了。不需要增加減少任何語句。當欄位增加很多時,語句行數仍然不變。另外,
get_ctrl_value()
函式成了公共函式,與實際功能只存在被呼叫的關係。
方法
4:
以上方法都是著眼於本功能的優化。分離出的函式只滿足本功能使用,眼界很低。我們可以擴充套件我們的眼界將函式用於我們的整個系統。因為系統中還有很多地方有類似的資料插入功能的。
這個時候,我們可以考慮編寫乙個程式,將功能中的一些子函式打造成通用函式,例如:
open_db,exec_sql,
get_insert_str1,
get_ctrl_value
等,並將它變成
dll,供整個系統的呼叫。 方法
4分析: 方法
4是一種革命性的變革,程式設計師終於將自己目光投向整個系統,也就是說,編制一段程式不僅僅是用於乙個功能,而是用於整個系統中相同的功能。很多程式設計師很難跨出這一步,他們懶得考慮程式的復用性,相同功能可能因時間的不同,而導致程式的不同,更多的程式設計師則滿足於複製貼上這種簡單的複製,當源程式出錯的時候,所有貼上的地方都要改變。我們說程式的復用性樹立是程式設計師水平提高的重要標誌。
方法
5:方法4
的眼界雖然提高到整個系統,但是,眼界還是比較低。因為有太多的應用系統都用到資料插入的功能。因此,我們可以考慮到將函式用於多個系統。
如果我們還是採用
dll方式,我們還可以在引數上作些文章,由於呼叫這些函式時,有關使用者名稱、密碼和欄位名串都寫在程式中,因此,可以將這些引數放置在程式之外。
一種寫在檔案之中,例如
congfig
檔案,自定義的引數文字檔案,自定的引數
xml檔案,另一種將引數放置在資料庫的參數列中。
方法5分析: 方法5
將函式的復用提高到多系統之中,這就意味著這個函式講用於多個系統,程式設計師開發的效率將會有很大的提高,程式的復用性大提公升;並且引數化的運用,提公升了程式的靈活性和擴充套件性。方法
5體現了程式設計師較高的水平。
方法
6:方法5
雖然,提公升了函式的復用範圍和提高了引數化程度,但是,軟體的構架還是處於乙個靜態思考階段。函式和系統還處於緊耦合方式,函式還僅用於自己開發的系統。我們可試著將這些函式功能變成
webservice
方式加以使用。即編寫功能的
webservice
放在網上,讓程式進行非耦合式呼叫。這樣其他程式設計師也可以輕鬆的呼叫了。(當然許多函式是很難變成
webservices
,例如引數需要格式化等要求)
方法6分析:大大提高的函式功能的使用範圍。使得函式變自己使用為大家使用。程式設計師此時已經達到很高的水平。
方法
7:
儘管方法
6已經使得程式設計師達到了乙個很高的水平,但是這種水平還是停留在技術層面和實用層面。程式設計師要想在此基礎上有所提高,就要對這個功能進行理論上的分析,分析這個功能與其他功能的關係,分析這個功能在整個系統或多個系統中的地位,並且將這個功能上公升到標準功能高度,建立這個功能和其他功能的介面,使得這個功能於其他功能有機的融為一體。 方法
7,體現了程式設計師的理論分析的水平,他不是單單從單一功能上考慮問題,而是從標準化和其他功能的相互關係上考慮問題了。通過這個思路再去改造這個函式,這樣將大大擴充套件了其功能的使用範圍。
以上從乙個資料插入的例項來說明了程式設計水平的步步提高。我們看到程式設計師的水平與函式的邏輯劃分有關、與程式設計技巧有關、與程式的引數化有關、與程式的復用範圍和形式有關、與程式設計師的理論意識有關、與程式的標準化有關、與多功能統一考慮有關。我們雖然寫到了方法
7這個層次,但這個層次決不是最高層次,學無止境,藝無止境,在此之上還有更大的天空。這就需要程式設計師不懈地努力、不懈地進取。唯有這樣我們的程式設計師的視野才會更開闊,我們程式設計師的水平才會有更加提高。
從乙個例項看程式設計水平的步步提高
很久很久前就想寫這個話題的文章了,但是,總是找不到合適的例子。例子簡單不足於說明問題,例子複雜可讀性就會降低,就會達不到文章的目的。兩難總讓人激發解決問題的鬥志,於是乎自己試著寫寫這個例子吧。這個例子就是學籍管理中增加學籍資訊的乙個功能。我想通過這個例子的不同的解決思路,來說明程式設計的層次步步提高...
《從乙個例項看程式設計水平的步步提高》
很久很久前就想寫這個話題的文章了,但是,總是找不到合適的例子。例子簡單不足於說明問題,例子複雜可讀性就會降低,就會達不到文章的目的。兩難總讓人激發解決問題的鬥志,於是乎自己試著寫寫這個例子吧。這個例子就是學籍管理中增加學籍資訊的乙個功能。我想通過這個例子的不同的解決思路,來說明程式設計的層次步步提高...
從乙個物件例項看資料抽象與封裝
本章目標 1 用c的方式實現棧2 用c 資料抽象的方式實現棧 3 比較兩者的差異性 棧的插入用頭插法,這樣子訪問最快 不採用頭節點。c include include include 定義棧中的元素 struct link 定義乙個棧結構體 只需要頭指標 沒有頭結點 還有結構體的大小維護 struc...