Следует избегать инициализации в конструкторе без параметров? - PullRequest
0 голосов
/ 18 февраля 2020

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

Но стандартная инициализация объектов заранее предотвращает возникновение исключения NullReferenceException. И разве юнит-тесты не предотвращают эти «трудно найти» ошибки?

Так что же лучше всего делать в 1011 *?

Что если бы у меня был класс с 10 свойствами ? Должны ли свойства также инициализироваться через параметры конструктора, если я хочу избежать конструктора без параметров? Разве это не многословно?

Например, у меня есть этот класс, поэтому люди сказали мне, что я не должен делать инициализацию по умолчанию таким образом:

public class UserForCreationDto
{
    public UserForCreationDto()
    {
        Username = "";
        Email = "";
    }

    [Required]
    [MaxLength(100)]
    public string Username { get; set; }

    [Required]
    [MaxLength(100)]
    public string Email { get; set; }
}

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Если вы хотите инициализировать свойства чем-то другим, чем их значения по умолчанию, вы можете сделать это прямо в определении:

public class UserForCreationDto
{
    [Required]
    [MaxLength(100)]
    public string Username { get; set; } = "";

    [Required]
    [MaxLength(100)]
    public string Email { get; set; } = "";
}

Но если вы хотите запретить NullReferenceExceptions, вы должны также сделать сеттеры частные. Учитывая вашу текущую реализацию, оба свойства все еще могут быть явно установлены на null.

Именно поэтому вы должны всегда - в качестве меры предосторожности - проверять, что переменная ссылочного типа инициализируется, прежде чем пытаться получить доступ к любому из ее свойств. :

if (!string.IsNullOrEmpty(dto.Username) { ... }
0 голосов
/ 18 февраля 2020

Следует избегать инициализации в конструкторе без параметров?

Другой способ задать это

Следует избегать побочных эффектов?

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

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

Я полностью не согласен с вашими коллегами.

Я часто пишу метод Init () для моих конструкторов, чтобы выполнить инициализацию для объектов, которые я всегда хочу сделать доступными, таких как List, для которого необходимо создать экземпляр.

/// <summary>
/// Create a new instance of a SignUp component
/// </summary>
public SignUp()
{
    // Perform initializations for this object
    Init();
}

Мой метод Init:

/// <summary>
/// This method performs initializations for this object.
/// </summary>
public void Init()
{
    // Set defaults
    this.NoAction = true;
    Action = "";
    ProfileImageUrl = NoProfileImagePath;
    ShowUploadButton = true;
    Name = "Login";

    // Create a new collection of 'IBlazorComponent' objects.
    this.Children = new List<IBlazorComponent>();

    // Erase the displayName property
    displayName = "";

    // if RememberLogin is false
    if (!RememberLogin)
    {
        // Erase all these values
        EmailAddress = "";
        Password = "";
        StoredPasswordHash = "";
    }
}

Поместив код в метод, вы можете вызвать его снова, если вам нужен способ «Сбросить» объект обратно к исходному состояние.

...