Должны ли конструкторы классов использоваться только для внедрения зависимостей? - PullRequest
0 голосов
/ 09 февраля 2020

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

  1. Заполнение зависимостей класса путем внедрения зависимостей в конструктор.
  2. Заполнение зависимостей класса с помощью конструктора Параметры для запуска некоторых вычислений в конструкторе. Зависимости создаются на основе результатов расчета. Это может включать использование new.

Мне интересно, придерживается ли второй метод хороших методов кодирования, таких как принцип единой ответственности, и действительно ли такого рода функциональность действительно принадлежит конструктору классов. Это кажется удобным, но я не уверен, что это хорошая идея.

Вот пример того, что я имею в виду:

public class VectorSpace
{
    // This class depends on an array of Vectors.
    Vector[] spanningSet;

    // 1. Populate the class dependencies by constructor dependency injection.
    public VectorSpace(Vector[] spanningSet)
    {
        this.spanningSet = spanningSet;
    }

    // 2. Populate the class dependencies by running some calculations in the constructor.
    public VectorSpace(Rect rectangle, int numberOfCellsX, int numberOfCellsY)
    {
        // Construct this class to make sure the resulting vector space fits the given rectangle, forming a grid.
        // Some calculations that ultimately populate the class dependencies go here...
    }

    // Public methods for performing calculations using the Vectors go here...
}

Это кажется странным, потому что векторное пространство заполняет сетку Похоже на работу, которая выходит за рамки этого класса, но я не знаю, где еще я бы определил этот второй конструктор.

Подходит ли функциональность второго конструктора в этом классе? Если нет, куда бы я переместил это тело конструктора? Стоит ли использовать вместо этого фабричный метод stati c? Должен ли я сделать этот конструктор конструктором другого класса? Может быть, у меня мог бы быть где-то похожий метод, который возвращает массив Векторов, которые я мог бы передать в конструктор внедрения зависимостей, но где бы я определил этот метод?

1 Ответ

0 голосов
/ 09 февраля 2020

VectorSpace класс зависит от данных (набора векторов), но данные могут быть предоставлены / рассчитаны разными способами.
Изменится лог c из VectorSpace, если вы измените способ вычисления векторов / извлекаться? Я предполагаю, что нет - поэтому он не должен быть частью класса VectorSpace.

Мы можем создать специальный класс, который будет отвечать за вычисление необходимых данных.

public class SpanningSetFactory
{
    public Vector[] Create(Rect rectangle, int numberOfCellsX, int numberOfCellsY)
    {
        // Calculate and return set of vectors
    }
}

Теперь VectorSpace может явно «сообщить» другим разработчикам / читателям, что это зависит только от набора векторов

public class VectorSpace
{
    public VectorSpace(Vector[] spanningSet) => _spanningSet = spanningSet
}

Теперь обе логики «Рассчитать набор охвата» и «Использовать охват» set "будет находиться в своих собственных местоположениях без зависимости друг от друга - единственной связью между ними будет массив Vector

. Я бы посоветовал не помещать некоторые вычисления (особенно тяжелые) в Конструктор.
Хорошая помощь для других разработчиков будет полезна, когда критическая логика c (вычисления, получение данных) явно видна в формах методов или других типах.

...