我目前正在尝试修改现有的Windows窗体项目,以更好地遵守SOLID原则。目前有一个主要类,它将表单初始化,然后所有逻辑都在逻辑类中处理。
这会产生高耦合并且不是不可测试的,因为所有位置都会更改主窗体上的内容。例如,我有一个刷新网格的按钮,这会调用逻辑类来构建数据,然后刷新网格。以下是目前看起来如何的简短示例。
public partial class XpressReports : Form
{
private void refresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
try
{
Globals.DataLogic.RefreshData();
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message);
}
}
}
public class DataLogic
{
public void RefreshData()
{
dataset selectedTableList;
selectedTableList = GetNonRefreshFlagColumnIdList();
dataGridView.Columns.Clear();
dataGridControl.DataSource = null;
dataGridControl.DataSource = dataViewData.Tables[0];
}
}
我不确定这样的事情的理想方法是什么。我可以创建一个新的方法来更新主窗体类中的数据源,但是两者之间仍然会有很多后退和前进。分离出这种事情的最佳方式是什么?
答案 0 :(得分:1)
到目前为止我在Windows窗体中看到的更清晰的方法是使用Presente模式。
您可以直接从表单中调用您的演示者,也可以触发preseter订阅的事件。
演示者将保留对视图(表单)的引用,并将在其上调用相应的方法。
使用视图方法的界面将演示者与实际表单分离。
类似下面的伪代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
int rows;
int cols;
float **row_ptrs;
} Mat;
Mat* Mat_alloc(int rows, int cols);
int main(void)
{
int i;
int rows = 10;
int cols = 10;
Mat *m1 = Mat_alloc(rows, cols);
for (i=0; i<cols; i++)
{
free(m1->row_ptrs[i]);
}
free(m1->row_ptrs);
free(m1);
return 0;
}
Mat* Mat_alloc(int rows, int cols)
{
Mat *m1 = malloc(sizeof(Mat));
m1->rows = rows;
m1->cols = cols;
m1->row_ptrs = malloc((m1->rows)*sizeof(float*));
for(int i = 0; i < m1->rows; i++)
{
m1->row_ptrs[i] = malloc((m1->cols)*sizeof(float));
}
return m1;
}