Создание словаря с данными о продукте и делением на категории
Всем привет. Можно ли как-нибудь красивее написать этот код?
Задача: Создать словарь, в котором будут храниться данные о продукте. Так же, необходимо реализовать деление на категории.
Код:
Класс 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 шт):
Хотите обратной связи - считайте сами напросились :)
Создать словарь
Это деталь реализации или требование иметь какое то хранилище для данных?
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/