2010-07-17 59 views
0

一段時間以來,我試圖弄清楚如何重構我的一些代碼以減少整個應用程序的冗餘。我只是學習OOP的基礎知識,可以創建簡單的類和方法,但我的知識在實際應用方面受到限制。下面的代碼位說明了我的無奈:ASP.Net C# - 從Codebehind移動代碼到類文件

#region DELETE selected users - button 

protected void btnDeleteSelected_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      CheckBox cb = (CheckBox)row.FindControl("chkRows"); 
      if (cb != null && cb.Checked) 
      { 
       // get the row index values (DataKeyNames) and assign them to variable 
       string userName = GridView1.DataKeys[row.RowIndex].Value.ToString(); 

       // delete selected users and their profiles 
       ProfileManager.DeleteProfile(userName); 
       Membership.DeleteUser(userName); 

       Msg.Text = "User(s) were sucessfully <b>DELETED</b>!"; 
       Msg.Visible = true; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Msg.Text = "Oops! " + ex.Message; 
     Msg.Visible = true; 
    } 
    finally 
    { 
     // refresh gridview to reflect changes 
     GridView1.DataBind(); 
    } 
} 

#endregion 

這段代碼是我在頁面代碼隱藏的項目文件的多個頁面中使用。我如何將它移到一個類文件中。我不知道如何在類中引用像gridview這樣的對象,因爲它不像它在實際頁面上那樣存在。

請問有人能幫忙嗎?謝謝。

+0

如果沒有看到ASP以及背後代碼中的其他示例方法,將很難推薦如何最好地重構此代碼。你可以多發一點這個項目嗎? – 2010-07-17 00:49:11

回答

2

在嘗試重構代碼時,您通常會應用許多原則。目前,你試圖重構你的代碼,以免提出DRY原則(DRY =不要重複自己)。重構該代碼將是一個偉大的舉措。

但是,其他一些校長可能會進來玩,你可能要考慮。 single responsibility principle會建議每種方法只有一個毫不含糊的東西。考慮你目前的方法所做的操作。它從GridView中提取用戶名,然後刪除與該用戶關聯的一些數據。兩種方法可能會更好。

另外,loosely coupled代碼是好的。你不需要你的類之間的一堆依賴關係。例如,如果將整個方法按原樣移動到單獨的類或庫,則該類或庫將依賴於ASP.NET庫,因爲它會特別引用GridView控件。但它並不需要。你可以有一個單獨的方法,將用戶名從GridView中取出(這種方法與ASP.NET緊密耦合),然後是一個單獨的方法來執行其餘的操作(如刪除用戶的數據),它只需要用戶名。第二種方法不會以任何方式與ASP.NET耦合。因此,通過分別具有單一職責的方法,您將擁有更鬆散耦合的代碼。兩個一個。

至於你在這裏說什麼:

我不知道如何引用一個對象 像一個GridView中的一類,因爲 它不存在像它 實際的頁面上。

當您調用提取用戶名的方法時,您只想傳遞對GridView的引用。事情是這樣的:現在

public static class Util 
{ 
    public static IEnumerable<string> GetUsernames(GridView gv) 
    { 
     List<string> userNames = new List<string>(); 
     foreach (GridViewRow row in gv.Rows) 
     { 
      CheckBox cb = (CheckBox)row.FindControl("chkRows"); 
      if (cb != null && cb.Checked) 
      { 
       // get the row index values (DataKeyNames) and assign them to variable 
       string userName = gv.DataKeys[row.RowIndex].Value.ToString(); 
       userNames.Add(userName); 
      } 
     } 
     return userNames; 
    } 
} 

,在任何的網頁背後的asp.net的代碼,你可以這樣做:

IEnumerable<string> usernames = Util.GetUsernames(GridView1); 
foreach(string username in usernames) 
    doSomething(username); 

doSomething(username)將是,做你的刪除操作一些其他方法的調用,或者任何你想要的。

希望這會有所幫助。噢,如果你剛剛學習OOP的基礎知識,我會推薦像Head First Object-Oriented Analysis and Design這樣的東西,或者任何看起來能夠充分涵蓋這個主題的書。我喜歡O'Reilly Head First系列。這些信息非常易於理解。

+0

哇!塞繆爾非常感謝你的迴應。我不得不在c#中對util和IEnumerable進行一些研究,但大部分情況我都乍一看。你的解釋確實有幫助。 我的確有很多關於c#的書籍,但大多數情況下,它們都是如此無聊而枯燥乏味,很難將信息轉化爲實用和可用的知識寶庫。我會看看你建議的書。 – 2010-07-17 01:57:55

1

在Webforms應用程序中,用於將應用程序和/或業務邏輯從代碼背後分解出來的常用技術是使用MVP模式。這並不意味着通常在代碼隱藏中找到的所有代碼都會被移到另一個類中,因爲這確實與代碼隱藏不同。 UI呈現邏輯(例如數據綁定設置,對UI控件的訪問等)最好留給代碼隱藏,但業務邏輯(在這種情況下是用戶的刪除)由Presenter中的方法執行。

在你的情況下,我將建立一個用戶名集合,並在Presenter上調用RemoveUsers()方法,傳遞用戶名列表,以處理與ProfileManager和Membership組件(理想情況下通過抽象)的接口。這使您可以爲Presenter中的邏輯編寫單元測試。