J
J
jammywork12015-09-07 20:31:30
Database
jammywork1, 2015-09-07 20:31:30

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

That is, is it good or bad when the classes are self-sufficient, and are filled with data, for example, using repositories themselves, or is it worth strictly delimiting the receipt / updating of data in the class.

Answer the question

In order to leave comments, you need to log in

3 answer(s)
Станислав Макаров, 2015-09-07
@jammywork1

Зависит от того, какую ответственность вы "отдаете" в класс. Если это так называемый "value object", т.е. некий неизменяемый композит, то лучше ему в конструктор передать сразу готовые значения. Если же это самостоятельный объект с внятным жизненным циклом и определенной ответственностью - тогда конечно логично чтобы он сам брал данные из репозитория.
Вам нужно почитать про Dependency Injection - это как раз та "середина" между двумя альтернативами, что вы предложили в виде фрагментов кода. Обращаться к глобальном объекту репозитория - это также антипаттерн. Гораздо лучший вариант - это когда объекту при создании передается (!) репозиторий в конструкторе, а объект уже САМ делает выборки необходимых данных. Это как раз и есть удачный вариант спуска от общего к частному. Плюс, вся логика сосредоточена в классе - я всегда могу добавить новую Модель (если следовать вашим примерам), которая также берет репозиторий, но вытаскивает из него уже ДРУГИЕ сведения.
Вот стандартный туториал, в котором роль вашего "класса" выполняет ASP.NET-контроллер, и он получает репозиторий в конструкторе: www.asp.net/web-api/overview/advanced/dependency-i...
Вообще принцип всегда такой - если есть некоторая переменная или значение, то есть N точек, из которых можно получить к ней доступ. Чем меньше этих точек - и при этом вы можете без извращений реализовать нужную вам бизнес-логику - тем лучше. И чем ближе в коде эти точки расположены друг к другу - тем лучше. Всегда удобнее работать с кодом, когда данные конкретной сущности и логика их обработки умещаются хотя бы в одном файле.

P
Pavel K, 2015-09-07
@PavelK

По-моему если работа с данными идёт внутри класса, то и сами данные стоит получать внутри.
Иначе какой смысл, если вам снаружи дадут данные а вы не сможете с ними работать?

M
MrDywar Pichugin, 2015-09-08
@Dywar

Руководство по разработке библиотек классов
Включите контроль кода на вкладке проекта, исправьте все замечания. Выкрутите предупреждения на ошибки, следуйте лучшим практикам.
Поставщиков данных может быть много (может быть изменено в будущем), если так, то лучше вынести их в отдельный класс.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question