Answer the question
In order to leave comments, you need to log in
Is it bad if the class is self-sufficient, in terms of obtaining some kind of data necessary for its full-fledged work?
I can't decide what would be the best thing to do in this situation.
example:
public class Model
{
public Model(int id, string path)
{
ID = id;
Path = path;
}
public int ID {
get;
protected set;
}
public string Path {
get;
protected set;
}
}
public class UpgradeModelA : Model
{
public UpgradeModelA(int id, string path)
: base(id, path)
{
}
public void Method1() { }
}
/// <summary>
/// Вариант 1: child элементы я получаю из репозитория вне класса, после чего вызываю конструктор передавая туда параметры
/// </summary>
public class UpgradeModelB : Model
{
public UpgradeModelB(int id, string path, IEnumerable<UpgradeModelA> children)
: base(id, path)
{
Children = children;
}
public void Method2() { }
public IEnumerable<UpgradeModelA> Children {
get;
protected set;
}
}
/// <summary>
/// Вариант 2: child элементы я получаю из репозитория внутри класса, внутри конструктора
/// </summary>
public class UpgradeModelB : Model
{
public UpgradeModelB(int id, string path)
: base(id, path)
{
Children = Repository.getItemsByParentID(id);
}
public void Method2() { }
public IEnumerable<UpgradeModelA> Children
{
get;
protected set;
}
}
Answer the question
In order to leave comments, you need to log in
Зависит от того, какую ответственность вы "отдаете" в класс. Если это так называемый "value object", т.е. некий неизменяемый композит, то лучше ему в конструктор передать сразу готовые значения. Если же это самостоятельный объект с внятным жизненным циклом и определенной ответственностью - тогда конечно логично чтобы он сам брал данные из репозитория.
Вам нужно почитать про Dependency Injection - это как раз та "середина" между двумя альтернативами, что вы предложили в виде фрагментов кода. Обращаться к глобальном объекту репозитория - это также антипаттерн. Гораздо лучший вариант - это когда объекту при создании передается (!) репозиторий в конструкторе, а объект уже САМ делает выборки необходимых данных. Это как раз и есть удачный вариант спуска от общего к частному. Плюс, вся логика сосредоточена в классе - я всегда могу добавить новую Модель (если следовать вашим примерам), которая также берет репозиторий, но вытаскивает из него уже ДРУГИЕ сведения.
Вот стандартный туториал, в котором роль вашего "класса" выполняет ASP.NET-контроллер, и он получает репозиторий в конструкторе: www.asp.net/web-api/overview/advanced/dependency-i...
Вообще принцип всегда такой - если есть некоторая переменная или значение, то есть N точек, из которых можно получить к ней доступ. Чем меньше этих точек - и при этом вы можете без извращений реализовать нужную вам бизнес-логику - тем лучше. И чем ближе в коде эти точки расположены друг к другу - тем лучше. Всегда удобнее работать с кодом, когда данные конкретной сущности и логика их обработки умещаются хотя бы в одном файле.
По-моему если работа с данными идёт внутри класса, то и сами данные стоит получать внутри.
Иначе какой смысл, если вам снаружи дадут данные а вы не сможете с ними работать?
Руководство по разработке библиотек классов
Включите контроль кода на вкладке проекта, исправьте все замечания. Выкрутите предупреждения на ошибки, следуйте лучшим практикам.
Поставщиков данных может быть много (может быть изменено в будущем), если так, то лучше вынести их в отдельный класс.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question