以2/8原則指導我們的底層框架設計 (轉)
原創文章,轉載請注明作者:Nomad,出處: www.jialing.net ???? 我想很多人都聽說過“2/
??? 在應用軟件的研發中同樣遵守這個原則,我們寫的20%底層代碼將會起到80%的作用。做過Web項目的人應該都知道,大多數程序都是圍繞增、刪、改、條件查詢等主題實現的,只是需求不同,具體的實現不同罷了。當項目重復性太高的時候,我們開始學習、使用框架技術,比如Hibernate就幫我們提取了很多對數據庫操作的程序,目的也是減少程序員編寫代碼的數量與時間。而框架技術并不能包含我們工作的方方面面,我們依然需要在工作中不斷總結、不斷歸納,猶如Template設計模式,我們需要將重復的工作總結提煉出來,做成一個個模版,以此來不斷簡化我們的工作。所以我們需要以2/8原則指導開發設計,讓更多的活交給框架去工作,讓各種業務流做成模版類,做足底層的工作,將20%的底層代碼發揮出80%貢獻。
??? 下面以我熟悉的平臺框架舉個模版的例子。在Hibernate框架下編寫DAO層代碼,我們需要從數據庫中取出數據,以列表形式顯示在頁面上。這個例子將向你展示,只要做好底層工作,上層的業務邏輯就會變得非常簡單(只有短短兩行)。
??1
//CommonalityObject.java
??2
??3
//用以裝載數據并輸出的Java?Bean
??4
??5
public?class?CommonalityObject?
{
??6
???private?String?str1;
??7
???private?String?str2;
??8
???private?String?str3;
??9
???private?String?str4;
?10
???private?String?str5;
?11
???private?String?str6;
?12
???private?String?str7;
?13
???private?String?str8;
?14
?15
?
?16
?17
???
?setters?&?getters
?18
?19
}
?20
?21
//SQLTemplate.java
?22
?23
/**?*//**
?24
?*?報表中執行SQL查詢的模版
?25
?*?以CommonalityObject來裝載數據,運用反射機制加載返回List
?26
?*
?27
?*?@author?李嘉陵
?28
?*?@since?2006-7-14
?29
?*/
?30
?31
public?class?SQLTemplate?
{
?32
?
?33
?private?static?Log?logger?=?LogFactory.getLog(SQLTemplate.class);
?34
?
?35
?public?List?getQueryList(String?sql,?Session?session)?throws?DAOException
{
?36
??logger.info(sql);
?37
??
?38
??try?
{
?39
???ResultSet?reset?=?getReset(session,sql);
?40
???logger.info("r="+reset);
?41
???return?reflectList(reset);
?42
??}
?43
??catch?(Exception?e1)?
{
?44
???//?TODO?Auto-generated?catch?block
?45
???e1.printStackTrace();
?46
???throw?new?DAOException(e1);
?47
??}
?48
?}
?49
?
?50
?//?插入SQL獲得相對應的數據集
?51
?public?ResultSet?getReset(Session?s,?String?sql)?throws?Exception?
{
?52
??
?53
??Connection?conn?=?null;
?54
??Statement?stat?=?null;
?55
??ResultSet?reset?=?null;
?56
???
?57
??//獲得連接
?58
??conn?=?s.connection();
?59
??
?60
??//裝載數據塊
?61
??stat?=?conn.createStatement();
?62
??//System.out.println("------運行的SQL語句--------"+sql);
?63
?64
??//獲得對應的數據集
?65
??reset?=?stat.executeQuery(sql);
?66
?
?67
??return?reset;
?68
?}
?69
?
?70
?/**?*//**
?71
??*?通過反射機制講ResultSet中的數據以CommonalityObject形式載入List中,最后返回List
?72
??*?@author?李嘉陵
?73
??*?@since?2006-7-14
?74
??*?@param?reset?SQL搜索出來的集合
?75
??*?@return?List<CommonalityObject>
?76
??*?@throws?Exception
?77
??*/
?78
?public?List?reflectList(ResultSet?reset)?throws?Exception
{
?79
??List?list?=?new?ArrayList();
?80
??
?81
??ResultSetMetaData?meta?=?reset.getMetaData();
?82
??
?83
??while(reset.next())
?84
??
{
?85
???CommonalityObject?co?=?new?CommonalityObject();
?86
???String?tmp="0";
?87
???
?88
???for(int?i=1;i<=meta.getColumnCount();i++)?
{
?89
????if?(reset.getString(i)?==?null||?reset.getString(1).equals("")??)
{
?90
?????tmp="0";
?91
????}
?92
????else
{
?93
?????tmp=reset.getString(i);??????
?94
????}
?95
????
?96
????String?method_name?=?"setStr"+i;?//需要動態調用的函數名
?97
????Class?cls=co.getClass();?//得到要在其中查找方法的類
?98
????Class?partypes[]?=?new?Class[]
{String.class};?//函數調用的參數類型,這里為String。
?99
????Method?mth=cls.getMethod(method_name,?partypes);?//得到方法
100
????Object[]?objs=new?Object[]
{tmp};?//生成函數要調用的數據,這里為tmp。
101
????mth.invoke(co,?objs);?//調用得到的函數。
102
???}
103
???
104
???list.add(co);
105
??}
106
??
107
??return?list;
108
?}
109
}
110
111
//最終只要簡單的兩句就能完成報表的輸出工作
112
public?class?OrderQryDAOImpl?extends?BaseDAOImpl?implements?OrderQryDAO?
{
113
114
?public?List?getList(String?cond)?throws?DAOException??
{
115
??
116
??//SQL語句
117
??String?sqlStr?=?"
"?+?cond;
118
119
??return?new?SQLTemplate().getQueryList(sqlStr,getSession());
120
?????
121
?}
122
}

??2

??3

??4

??5



??6

??7

??8

??9

?10

?11

?12

?13

?14

?15

?16

?17


?18

?19

?20

?21

?22

?23


?24

?25

?26

?27

?28

?29

?30

?31



?32

?33

?34

?35



?36

?37

?38



?39

?40

?41

?42

?43



?44

?45

?46

?47

?48

?49

?50

?51



?52

?53

?54

?55

?56

?57

?58

?59

?60

?61

?62

?63

?64

?65

?66

?67

?68

?69

?70


?71

?72

?73

?74

?75

?76

?77

?78



?79

?80

?81

?82

?83

?84



?85

?86

?87

?88



?89



?90

?91

?92



?93

?94

?95

?96

?97

?98



?99

100



101

102

103

104

105

106

107

108

109

110

111

112



113

114



115

116

117


118

119

120

121

122

看懂了嗎?如果項目中我們需要完成幾十個這樣的報表輸出,有了這樣的底層代碼結構,編寫起來是不是很簡單呢。
posted on 2006-07-21 01:35 liaojiyong 閱讀(371) 評論(0) 編輯 收藏 所屬分類: Hibernate