Создание словаря с данными о продукте и делением на категории

Всем привет. Можно ли как-нибудь красивее написать этот код?

Задача: Создать словарь, в котором будут храниться данные о продукте. Так же, необходимо реализовать деление на категории.

Код:

Класс Builder:

class Builder
{
    public Builder(string Type, string Title, int Price, int Index)
    {
        this.Type = Type;
        this.Title = Title;
        this.Price = Price;
        this.Index = Index;

        int i = 0; //ищу свободное место в словаре
        while (BusinessMenu.dic.ContainsKey(i))
            i++;
        BusinessMenu.dic.Add(i, this);
    }

    public string Type { get; private set; }
    public string Title { get; set; }
    public int Price { get; set; }
    public int Index { get; private set; }
}

Класс со словарём:

static class BusinessMenu
{
    public static Dictionary<int, Builder> dic = new Dictionary<int, Builder>();
}

Добавляю с помощью следующего кода:

new Builder(result, TitleTextBox.Text, Convert.ToInt32(PriceTextBox.Text), BusinessCount);

где:

  • result - соответствующая кнопка, нажатая пользователем, из которой берётся свойство Name и присваивается result. Грубо говоря, это параметр-"Категория"

  • TitleTextBox.Text - название продукта

  • PriceTextBox.Text - цена продукта

  • BusinessCount - Количество продуктов данной категории в списке


Ответы (1 шт):

Автор решения: tym32167

Хотите обратной связи - считайте сами напросились :)

Создать словарь

Это деталь реализации или требование иметь какое то хранилище для данных?

BusinessMenu

Почему класс, который называется "Бизнес меню" ничего не делает, кроме как хранит и открывает всему миру свою реализацию?

public static Dictionary<int, Builder> dic = new Dictionary<int, Builder>();

Публично откывая такую деталь, вы просто пишете в коде "вот словарь, мне не важно кто как и когда имеет к нему доступ, сколько в него было записей и чтений мне тоже не важно, а ещё я согласен, что все клиенты будут знать реализацию моего класса, что я не смогу её сменить никогда. И нпоследок любой клиент класса может делать со словарем все, что угодно, даже просто удалить и новый создать и я не смогу это ни отдебажить ни даже узнать об этом".

Хотите правильно написанный класс - закрывайте реализацию методами.

А, да, у вас ещё и поле статическое, то есть вы заранее связываете все клиенты класса с одним статически инстансом. Это вот зачем? У вас нету DI фреймворка, чтобы ему рассказать, кто сингтон, а кто нет?

в котором будут храниться данные о продукте

То есть у вас должен быть класс типа Product или ProductData, который представляет собой данные. Он у вас есть? Нет.

Вместо него у вас какой то Builder, который хранит какие то поля. Причем часть публично доступна для изменения, а часть нет - это вот зачем?

А ещё конструктор класса не только конструирует класс, но ещё какой то дополнительной логикой занимается - это для чего? Отделяйте мух от котлет, то есть классы - данные от классов - логики.

Ещё поле Price - целое число? Поле Index - для чего? Почему параметры конструктора у вас с большой буквы?

while (BusinessMenu.dic.ContainsKey(i))

Вот это вот для чего? Если вы на ходу создаете ключи для словаря, может вам не нужен словарь, а нужен список - у списка же индексы всегда заполнены

Как можно улучшить:

  • сделать класс для хранения данных, типа ProductData - только поля и констурктор
  • сделать словарь в классе BusinessMenu приватным, добавить туда методы для добавления продукта или получения или какие вам там методы нужны для управленимя бизнес меню. Сделать его НЕ-статическим, использовать DI если нужен его синглтон
  • потенциально поменять словарь на список или что то, что вам больше подходит. Из кода не ясно зачем вообще словарь нужен.
  • Поработать над стилем своего кода, см https://docs.microsoft.com/ru-ru/dotnet/standard/design-guidelines/
→ Ссылка