2016-08-19 38 views
-2

這不是關於編碼本身的問題,而是關於代碼結構中的良好實踐的問題。我目前正在構建一個WinForms應用程序,並且在幾個小時之後,我的主窗體包含130行代碼。這可能不會太多,但是這隻包括事件處理 - 因爲我基本上都是通過單獨的類文件來避免這種確切的情況......但現在所有的控件和事件都讓我的主代碼難以閱讀。保持主窗體整齊 - 約定

現在,這是一個主題,我能找到令人驚訝的一點上和我做對如何解決這個問題,如創建自定義的控制和分裂的形式進入大的部分的一些想法。這是否有一種最佳做法?當80%的用戶交互發生在這裏時,如何保持主窗體清潔?還有一個關於如何構建項目的基本指導(不是代碼),你可以推薦?

(希望這可以作爲一個有效的問題)

謝謝!

編輯:我決定在代碼中添加。看到什麼冗餘?

public partial class MainForm : Form 
{ 
    string currentFilter = "all"; 

    public MainForm() 
    { 
     InitializeComponent(); 
    } 
    private void MainForm_Load(object sender, System.EventArgs e) 
    { 
     RefreshGenres(); 
     RefreshMovies(currentFilter); 
    } 

    private void addToolStripMenuItem_Click(object sender, System.EventArgs e) 
    { 
     var fAdd = new AddNewForm(); 

     fAdd.SetDesktopLocation(MousePosition.X, MousePosition.Y); 
     fAdd.ShowDialog(); 
    } 

    private void refreshToolStripMenuItem_Click(object sender, System.EventArgs e) 
    { 
     RefreshGenres(); 
     RefreshMovies(currentFilter); 
    } 

    private void addCategoryToolStripMenuItem_Click(object sender, System.EventArgs e) 
    { 
     tvCategories.Nodes.Add(new TreeNode("category")); 
     tvCategories.Nodes[tvCategories.Nodes.Count - 1].BeginEdit(); 
    } 
    private void tvCategories_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) 
    { 
     var genre = e.Label; 
     var writer = new Writer(); 
     writer.AddGenre(e.Label); 

    } 


    private void everythingToolStripMenuItem_Click(object sender, System.EventArgs e) 
    { 
     EraseData("all"); 
    } 
    private void clearGenres_Click(object sender, System.EventArgs e) 
    { 
     EraseData("genres"); 
    } 
    private void clearMovies_Click(object sender, System.EventArgs e) 
    { 
     EraseData("movies"); 
    } 
    private void EraseData(string eraseThis) 
    { 
     DialogResult r = MessageBox.Show("Are you sure?\nLost data can NOT be retrieved.", "Clear Data", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 

     var cmdText = ""; 

     if (r == DialogResult.Yes) 
     { 
      switch (eraseThis) 
      { 
       case "all": 
        cmdText = "TRUNCATE TABLE MOVIES GENRES"; 
        break; 

       case "movies": 
        cmdText = "TRUNCATE TABLE MOVIES"; 
        break; 

       case "genres": 
        cmdText = "TRUNCATE TABLE GENRES"; 
        break; 
      } 
      conn.Open(); 
      using (var cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = cmdText; 
       cmd.ExecuteNonQuery(); 
      } 
      conn.Close(); 
     } 
    } 


    private void RefreshGenres() 
    { 
     tvCategories.Nodes.Clear(); 

     var reader = new Reader(); 
     var genres = reader.GetGenreList(); 

     foreach (string str in genres) 
     { 
      tvCategories.Nodes.Add(str); 
     } 
    } 
    private void RefreshMovies(string filter) 
    { 
     lvMovies.Items.Clear(); 

     var reader = new Reader(); 
     var movies = reader.GetMovieList(filter); 

     foreach (ListViewItem item in movies) 
     { 
      lvMovies.Items.Add(item); 
     } 
     reader.conn.Close(); 

    } 

    private void tvCategories_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     currentFilter = e.Node.Text; 
     RefreshMovies(currentFilter); 
    } 
} 
+1

主要目標應該是嘗試說明ui邏輯,即來自業務邏輯的事件。所以事件處理程序不應該包含比控制實際邏輯的busness logic對象更多的調用。 – TaW

回答

1

我覺得這裏的問題是不是你的代碼的長度,但你是混合了很多不同的東西,你不處理以一致的方式您的活動的事實。 這些是我會改變的主要事情:

EraseData:此方法打開並使用數據庫連接,這是您通常應避免的事情(更改DB中的某些內容會導致您修改UI代碼) ,您的WinForm代碼不應該知道它公開的數據來自哪裏。在這裏你最好在Writer類中添加一個EraseData。

RefreshMovies:它是從RefreshGenres完全不同,即使這兩種方法基本上做同樣的事情:他們越來越被添加到一些UI控件的數據列表。 RefreshGenres看起來沒問題,但看着RefreshMovies,你立即發現你正在關閉一個未在此方法中打開的連接。可能你是在Reader類中打開它的,但這也是你應該關閉它的地方。事實上,conn最好是私有的(記住,UI不必知道數據是來自數據庫,文本文件還是用戶輸入)。此外Reader的GetGenreList返回一個字符串列表,這是正常的,但GetMovieList返回一個ListViewItem列表,這是不好的,因爲這是與你的特定UI實現強烈相關的東西。這意味着您的Reader實現不能用於WPF或Web應用程序。 ListViewItems應該使用來自Reader的純數據在RefreshMovies中創建。

+0

會這樣做,謝謝!當然,不從主窗體打開數據庫連接是有意義的,但是當我研究編碼約定時,這並不是我讀過的內容 - 我決定關閉連接的原因是因爲我的讀者類有3種方法,每種方法都有打開和關閉連接,但其中一個實際上使用另一個方法,該方法在完成後關閉第一個方法的連接。是的,我明白爲什麼這不是理想的:D – momo

相關問題