Stella 知識庫--模型類的設計

weixin_34377065發表於2005-05-22

-- 系列文章與Stella Forum v2.0搭配使用效果更好 --

這裡的模型類,在有些地方也叫“業務實體”等名字,一句話,是一些代表了軟體世界需求的剝離了行為的類。
沒有了行為,這些類自然就是一些資料的集合,而他們的作用,自然也是傳遞資料。在分層的架構中,使用模型類來傳遞資料更加的有意義。
說了這麼多,下面來看為什麼要使用這個
1.方便在層間傳遞資料
2.物件導向設計的需要


先來看一個例子。
private void doLogin()
{
//構造一個遊客
Model.Guest g=new Stella2.Model.Guest();
g.Name=this.uname.Text;
g.Pwd=this.pwd.Text;
//系統檢查出示的憑證
Business.Forum f=new Stella2.Business.Forum();
//返回一個登入使用者
Model.User user=f.Login(g);

if(user==null)
{
//錯誤處理
}
else
{
//這裡是把當前使用者儲存到session中
StellaContext.Current.User=user;
//其他設定
}
}
第一眼看這個程式,基本上就和現實世界中的情況差不多,一個遊客過來,出示他的身份憑證(使用者名稱和密碼),然後系統檢查,如果合法,那就讓遊客進入,這時 該遊客就成了一個登入使用者,如果他提供的憑證不合法,那就禁止入內。所有這一切都很自然,這也是物件導向設計的魅力吧。
Guest和User是用到的兩個模型,篇幅限制,我們只看前者的定義吧。
/// <summary>
/// 遊客
/// </summary>
public class Guest
{
private String m_Name; //使用者姓名
private String m_Pwd; //使用者密碼

///<summary>
///使用者姓名
///</summary>
public String Name
{
get { return m_Name;}
set { m_Name = value;}
}
///<summary>
///使用者輸入的明文密碼
///</summary>
public String Pwd
{
get { return m_Pwd;}
set { m_Pwd = value;}
}
}

這個模型很簡單,就包括兩個屬性,使用者名稱和密碼。
想象一下,如果不這樣,那我們就需要這樣來做驗證
Business.Forum f=new Stella2.Business.Forum();
//返回是否合法
bool isLogin=f.Login(this.uname.Text,this.pwd.Text);
if(isLoginl)
{
//繁瑣的session,cookie設定
}
else
{
//錯誤處理
}

想象一下那裡的設定都需要做什麼,把使用者資料一個一個的儲存到session,然後設定許可權...

更恐怖的是:
Business.Forum f=new Stella2.Business.Forum();
string msg=f.CreateUser(newUser);
這個是使用者註冊時的程式碼,如果不使用模型類,那就需要這樣
Business.Forum f=new Stella2.Business.Forum();
string msg=f.CreateUser(name,pwd,email,answer,question,qq,homepage,signature,honour,skins);
好長啊……
別忘了,分層結構意味著,這種方法簽名至少要出現三次!!!
所以……

模型類的討論到這基本結束,最後要說的一句,模型類也並不是萬能的。如您的資料結構很複雜,比如說有一百多張表……要全部建模型類估計就不是那麼容易,這 個時候,或許有更好的選擇,那就是:DataSet。從本文的觀點看,DataSet的缺點,或許只是不符合物件導向的設計而已。

相關文章