要求用户保存数据代码审查

时间:2018-06-30 01:59:20

标签: c#

当用户单击以退出表单,并且数据未保存时,我想问用户他是否要保存数据。下面的代码可以更简化,以便于阅读此方法SaveOrRejectChanges()。

private bool SaveOrRejectChanges()
{
    if (MsgBox("do you want to save data") == true)
    {
        if (ValidateIsEmptyOrNullValue()) return false; //here I check is required field not entered

        SaveChanges(); // if validation passes (data are entered), save it
    }
    else
        RejectChanges(); // cancel changes by setting EntityState.Unchanged on DBContext for each entity

    return true;
}

private void iExit_ItemClick(object sender, ItemClickEventArgs e)
{
    _isFormClosing = true;

    // close form if data are not modified (no saving required). Or close form when data are saved or changes are canceled 
    if (_isDataModified == false || SaveOrRejectChanges()) 
       this.Close();
}

我仍然是初学者,所以请分享您的想法。我有点不喜欢嵌套if,但是我不得不将它放在其他if内,就像在询问用户之前一样,然后它将简单地取消关闭,这当然是我不想要的。如果您有想法,请分享您的解决方案。谢谢。

2 个答案:

答案 0 :(得分:1)

这更多是代码审查问题。

您的编码方式是将逻辑代码与GUI代码混合在一起。更好的方法是将窗体控件绑定到类。

通过这种方法,即使只是验证和保存控件的状态,您也可以轻松地对业务逻辑进行单元测试。

另一个好处是,如果所有“表单控件”状态都保存在一个类中,则只需将该类序列化为Json,XML,dB等即可。

更新

有关使用BindingSource控件的大量教程,请参见https://www.codeproject.com/Articles/24656/A-Detailed-Data-Binding-Tutorial

因此,您的逻辑已经在业务逻辑类中,但是您仍然对消息框有依赖性。要断开耦合以连接一个Action方法或EventHandler来调用GUI Form类,请注意我手机上写的伪代码:

public class GUI {

   public BusLogic BL = new BusLogic();

   public GUI () {
         BL.ShouldSaveData += Should_Save_Data;
    }

    public bool Should_Save_Data() {
       DialogResult res = MessageBox.Show("do you want to save data", "", MessageBoxButtons.OkCancel);
       return res.Ok == DialogResult.Ok;
    }

    private void iExit_ItemClick(object sender, ItemClickEventArgs e) { 
       _isFormClosing = true;

       if (_isDataModified) BL.SaveOrRejectChanges();
    }
}

在您的业务逻辑类中,您可以调用ShouldSaveData()事件。

public class BusLogic {

   public event Action<bool> ShouldSaveData;

   public void SaveOrRejectChanges() {
      bool confirmSave = false;

      if (ShouldSaveData != null) confirmSave = ShouldSaveData;

      if (confirmSave) //DO YOUR SAVING HERE
   }
}

这使表示层和逻辑层保持分离。

答案 1 :(得分:0)

我对代码进行了一些改进,这是重构版本:

    private void AskToSaveChanges()
    {
        // note: MyMessageBox is a class in UI layer, because it uses UI component 
        // of Windows forms
        if (MyMessageBox.Show(MyMessageBoxActions.Save, ""))
            SaveChanges(); // this is done in Persistence layer
        else
            RejectChanges(); // this is done in Persistence layer
    }

    private void iExit_ItemClick(object sender, ItemClickEventArgs e)
    {
        _isFormClosing = true;

        if (_isDataModified == false || AskToSaveChanges()) 
           this.Close();
    }