2016-08-19 59 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