Руководство по стилю для предотвращения нежелательного доступа к полю - PullRequest
4 голосов
/ 23 апреля 2011

Однажды я увидел здесь вопрос о том, можно ли встраивать поля в свойства, чтобы к ним нельзя было получить доступ в остальной части класса, например,

public string Name
{
    private string _name;

    get { return _name; }
    set
    {
        _name = value;
        // <Important stuff that would not be executed
        //  upon direct field access>
    }
}

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

private int _progress = 0;
private int progress
{
    get { return _progress; }
    set { _progress = value; }
}

Если это связано с указанием, что поля должны иметь подчеркивание какпо префиксу можно сразу сказать, что что-то не так, если в других местах класса замечено подчеркивание.

Итак, мой вопрос - или, скорее, вопросы:

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

1 Ответ

3 голосов
/ 23 апреля 2011

Если метод получения и установки не имеет побочных эффектов, нет смысла создавать частное свойство для переноса частного поля.Либо используйте поле и покончите с этим, либо используйте авто-свойство.Не пишите шесть строк кода, чтобы выразить ценность одной строки;вы просто усложняете чтение кода.

Теперь, если у вашего сеттера были побочные эффекты, то это другой вопрос.В этом случае хорошо иметь рекомендацию, согласно которой вы не должны устанавливать поле вне свойства - но учтите, что конструктору, возможно, потребуется также установить поле.(Первоначальная настройка состояния объекта может потребовать обхода побочных эффектов.) Также могут быть и другие случаи, когда вы хотите использовать поле (глубокое копирование, загрузка / сохранение и т. Д.), Но поэтому «использовать свойство» следуетбудьте руководством, а не жестким правилом: вы должны подумать об этом, прежде чем обойти свойство.

Что касается соглашений об именах, то, конечно, вам решать, но это выглядит очень страннодля меня, чтобы иметь собственность на верблюде.Во всем коде, который я видел, свойства являются PascalCased, даже когда они закрыты.

...