這不是關於編碼本身的問題,而是關於代碼結構中的良好實踐的問題。我目前正在構建一個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);
}
}
主要目標應該是嘗試說明ui邏輯,即來自業務邏輯的事件。所以事件處理程序不應該包含比控制實際邏輯的busness logic對象更多的調用。 – TaW