一个“干”原理案例

问题描述 投票:0回答:3

需要检查用户输入的数据,并在输入错误时在屏幕上显示通知。我使用了以下方法,但在我看来,它不太符合“不要重复自己”的原则。有人有任何简化的想法吗?

int productid = 0;
string errorMessage = "Неправильный формат данных:\n",
       productName = "", productGroup = "", productType = "";
if (!int.TryParse(ProductIdTB.Text, out productId))
{
    errorMessage += "+ Номер продукта\n";
}
if (string.IsNullOrEmpty(ProductNameTB.Text))
{
    errorMessage += "+ Название продукта\n";
}
else
{
    productName = ProductNameTB.Text;
}
if (string.IsNullOrEmpty(ProductGroupTB.Text))
{
    errorMessage += "+ Группа продукта\n";
}
else
{
    productGroup = ProductGroupTB.Text;
}
if (string.IsNullOrEmpty(ProductType.Text))
{
    errorMessage += "+ Вид продукта";
}
else
{
    productType = ProductType.Text;
}
if (errorMessage.Split(' ').Length > 1)
{
    MessageBox.Show(errorMessage);
    return;
}
c# dry
3个回答
1
投票

我可以想象构建一个类来为您进行检查并收集所有错误,无论是在字符串还是字符串列表中。

class ErrorMessageBuilder
{
    string totalmessage = "";

    void AppendErrorIfEmpty(TextBox t, string textboxname)
    {
        if (t.Text.IsNullOrEmpty())
        {
            totalmessage += textboxname + " can't be empty" + Environment.NewLine;
        }    
    }

    void AppendErrorIfNotInt(TextBox t, string textboxname)
    {
         int value;
         if (!int.TryParse(t.Text, out value))
         {
             totalmessage += textboxname + " must be an integer number"  + Environment.NewLine;
         }
    }
}

这会将代码减少到

var emb = ErrorMessageBuilder();
emb.AppendErrorIfNotInt(ProductIdTB, "Product ID");
emb.AppendErrorIfEmpty(ProductNameTB, "Product Name");
...

因为这对我来说看起来像是 WinForms 开发,所以您还可以查看 ErrorProvider 类。与工具提示一样,它允许每个控件一条错误消息。也许这会更加用户友好。


0
投票

根据使用的数量,考虑到字符串的不变性,它可能无法很好地扩展。对于每个 +=,您都创建一个新的字符串实例,字符串越大,内存和垃圾就越多......

考虑 StringBuilder 及其 Append/AppendFormat 方法。

+=/concat,字符串表现


0
投票

假设您使用的是 Windows 窗体 UI,请考虑在用户完成键入并且文本框失去焦点时在

TextBox.Leave
事件期间验证每个文本框。这将改善您发布的 DRY 问题,同时也改善用户体验。

用户将立即知道存在问题以及他们输入的值(因为他们刚刚输入)。例如,它可以防止用户在发现他们填写的第一个字段需要数字值之前必须完成整个表单并尝试提交。

我会将其与构建您自己的 ErrorMessageHandler 类结合使用,如

@Thomas Weller
的答案中所示。

类似这样的事情...

static class CustomError
{
    static string ErrorIfEmpty(TextBox t, string textboxname)
    {
        if (t.Text.IsNullOrEmpty())
        {
            return textboxname + " can't be empty";
        }
        else
        {
            return "";
        }
    }

    static string ErrorIfNotInt(TextBox t, string textboxname)
    {
         if (!int.TryParse(t.Text, out value))
         {
             return textboxname + " must be an integer number";
         }
        else
        {
            return "";
        }
    }
}

每个

TextBox.Leave
方法可能看起来像这样。

private void ProductIdTB_Leave(object sender, System.EventArgs e)
{
    string errMsg = CustomError.ErrorIfNotInt(ProductIdTB,"Product ID");
    if (errMsg != "")
    {
        MessageBox.Show(errMsg);
        ProductIdTB.Text = "";
        ....
    }            
}

通过这种方式,一旦出现错误,用户就会收到通知,并准备好修复它并继续前进。

© www.soinside.com 2019 - 2024. All rights reserved.