Некоторые из моих полей класса являются обязательными.Как я могу знать, что это было инициализировано? - PullRequest
0 голосов
/ 09 декабря 2018

Хорошо, ребята.Я пишу код и есть одна проблема.Язык C #, но это не имеет значения.Например: у меня есть класс Point

Class Point
{
 private _x;
 private _y;

 //getter and setters
}

Итак, если я хочу использовать объект этого класса, мне нужно полностью знать, что все поля, такие как _x и _y, были инициализированы.Значения по умолчанию не решают.Мои решения:

  • передать все необходимые параметры через конструктор и инициализировать
  • Всегда проверять, не является ли мое поле пустым (я думаю, что это плохой способ)

Но если у меня есть 7 обязательных полей.

Class Point
{
 private _x; //required it must not be null
 private _y; //required it must not be null
 private _z; //required it must not be null
 private _b; //required it must not be null
 private _a; //required it must not be null
 private _f; //required it must not be null
 private _h; //required it must not be null

 //getter and setters
}

Как я могу быть уверен, что все они были инициализированы?Передача этого количества параметров в конструкторе действительно сложна и безобразна.Если я буду использовать шаблон строителя, это на самом деле не убедит меня.Извините за плохой английский.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Для зная , если поле было инициализировано, вы вынуждены использовать флаг.
Сделайте его явным bool _xIsSet; или, если _x - int, тогда введите тип int?и проверьте, чтобы значение было нулевым.
Первое не выдает никаких исключений, но если вы не будете осторожны, вы будете работать с неинициализированными значениями.
Последний способ выдает ошибки;возможно лучше, но все еще во время выполнения.

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

Метод I предпочитаете с 20?годы должен иметь конструктор, который принимает все параметры и даже убедиться, что конструктор по умолчанию отсутствует.

var myPoint = new Point( valueX, valueY, valueK );

В более поздних версиях C # можно назвать аргументы, чтобы код стал довольно легко читаться.

var myPoint = new Point( X = valueX, Y = valueY, L = valueK // <-- see here! it is quite easy to spot a possible error );


Мое объяснение использования этого метода, за исключением того, который вы заявляете, заключается в том, что «очень редко вы хотите, чтобы Customer не был установлен полностью».Затем ... если есть несколько способов установить Customer полностью, я создаю больше конструкторов.

Я пошел дальше и избегаю нуля столько, сколько могу, поэтому в моем коде есть никогда a Customer, который только наполовину установлен, и очень редко Customer, который равен нулю.

В последнее время я начал экспериментировать с использованием статических конструкторов;тогда вызов var customer = Customer.Create(...).Это имеет вкус DDD , поскольку Create может выражать намерение , может выражать , почему создан класс.var customer = Customer.CreateFromEntranceScan(...) или var customer = Customer.CreateFromTaxDeduction(...).

0 голосов
/ 09 декабря 2018

Как прокомментировали люди, вы можете убедиться, что поля инициализируются, либо установив для них значение всегда по умолчанию

Class Point
{
    private int j = 42;
}

, либо ваш конструктор всегда будет определять значение по умолчанию для каждого поля

Class Point
{
    private int j;
    public Point (int jVal)
    {
       j = -1;
    }
}

Это гарантирует, что при создании нового экземпляра класса поля будут всегда инициализироваться.

Если у вас есть ссылки, которые должны указывать на объекты, вы можете сделать это так жеКстати, но просто измените значение (например, 42 в предыдущем примере) на эквивалент языка C # new Object().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...