«Сухой» принципиальный случай

возникает необходимость проверки введенных пользователем данных и вывода уведомления на экран в случае некорректного ввода. Я использовал следующий метод, но мне кажется, что он не совсем вписывается в принцип "не повторяйся". Есть ли у кого идеи по упрощению?

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

Базовый вопрос мнения не для stackoverflow.com, тем не менее вы перезаписываете свою переменную с каждым условием if else, поэтому, если у вас есть две ошибки, вы сможете читать только одну за раз, возможно, вы можете сгруппировать свои ошибки в несколько разных путь, или, может быть, бросить исключение

DonMiguelSanchez 12.06.2023 10:18

Возможно, вы захотите удалить все биты else и просто заполнить значения только после последнего условия, когда вы знаете, что ошибок нет.

Zohar Peled 12.06.2023 10:21

@DonMiguelSanchez Нет, OP использует +=, таким образом добавляя переменную сообщения об ошибке, не перезаписывая ее ...

derpirscher 12.06.2023 10:29

В мире ASP.NET у нас есть связыватели модели и атрибуты проверки, которые выполняют все основные проверки ввода, поэтому нам не нужно этого делать.

phuzi 12.06.2023 10:29

Вместо разделения на ' ' вы, вероятно, захотите разделить на '\n'. А еще проверка с > 1 не сработает, так как вы уже добавляете \n к заголовку, поэтому разбиение всегда будет давать вам как минимум два элемента. Кроме того, я бы предложил не отображать такой большой объем данных в текстовом поле. Есть лучшие средства проверки и отображения ошибок в Windows Forms...

derpirscher 12.06.2023 10:34

@derpirscher, но это работает...

programMUSTer 12.06.2023 10:36

Что произойдет, если ошибок не будет? Тогда errormessage все еще "Неправильный формат данных:\n", то есть содержит 2 пробела, а errormessage.Split(' ') приведет к массиву длины 3. Таким образом, ваше окно сообщений всегда будет отображаться

derpirscher 12.06.2023 10:38

WPF уже покрывает это с помощью проверки данных, предлагая способы указать правила проверки в форме или объекте, автоматически запускать их при изменении значения и отображать индикаторы ошибок.

Panagiotis Kanavos 12.06.2023 10:39

@derpirscher я вижу, я должен использовать 3, да, просто не заметил

programMUSTer 12.06.2023 10:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я могу представить создание класса, который выполняет проверки за вас и собирает все ошибки либо в виде строки, либо в виде списка строк.

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. Как и в случае с всплывающими подсказками, он допускает одно сообщение об ошибке для каждого элемента управления. Возможно, это было бы даже удобнее.

Хорошая идея, воспользуюсь

programMUSTer 12.06.2023 10:39

В зависимости от того, насколько это используется, оно может не очень хорошо масштабироваться, учитывая неизменность строк. Для каждого += вы создаете новый экземпляр строки, чем больше строка, тем больше памяти и мусора...

Рассмотрим StringBuilder и его методы Append/AppendFormat.

+=/concat, производительность строки

да, но я использую +=, разве это не добавляет строку вместо создания новой?

programMUSTer 12.06.2023 16:15

@programMUSTer: нет, он по-прежнему создает новую строку и избавляется от старой. Пока у вас нет килобайтов строк, нормальный подход с += вполне подойдет.

Thomas Weller 12.06.2023 21:06

Другие вопросы по теме