C#类与Windows窗体耦合

时间:2016-04-29 14:59:03

标签: c# solid-principles

我目前正在尝试修改现有的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];
    }
}

我不确定这样的事情的理想方法是什么。我可以创建一个新的方法来更新主窗体类中的数据源,但是两者之间仍然会有很多后退和前进。分离出这种事情的最佳方式是什么?

1 个答案:

答案 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;
}