В этой статье описывается, что вы должны использовать методы вместо средств получения / установки свойств. По сути, это предполагает, что метод должен выполнять действие для изменения состояния вместо того, чтобы разрешать установщику изменять состояние. например У меня может быть класс со свойством Месяц и День. Тогда у меня мог бы быть код, который делает это:
obj.Day = 28;
obj.Month = Months.February;
obj.Day = 30;
obj.Month = Months.March;
Как только я установил день на 30, а месяц - февраль, у меня недействительное состояние.
В статье предлагается, чтобы класс не допускал подобных действий, но предоставлял определенные методы для выполнения определенных действий, например:
obj.ChangeDate(Months.March, 30);
Если аналогия даты и времени сбивает с толку из-за DateTime, у вас может быть аналогичный пример с координатами широты и долготы:
obj.Latitude = 45.4112;
obj.Longitude = -75.6981;
//...
obj.Latitude = 39.73;
obj.Longitude = -86.27;
Когда для широты установлено значение 39,73, местоположение становится местом рядом с Ньюарком, а не с Оттавой (первая широта / долгота) или Индианаполисом (вторая широта / долгота). Если оставить настройки для lat / long, интерфейс останется открытым, и он не сможет проверить его инварианты, а некоторые могут сказать, что он не совсем объектно-ориентированный. Итак, вместо этого у вас может быть метод:
obj.MoveTo(39.73, -86.27);
ОО подразумевает как инкапсулированное состояние, так и поведение. Хотя некоторым может казаться, что свойства «инкапсулируют» состояние, обычно это не так. Они отделяют реализацию от интерфейса, так что то, что используется в качестве резервного хранилища свойств, может измениться, но это редко когда-либо; поэтому свойства просто предоставляют доступ к деталям реализации иначе, чем предоставляют общедоступные поля.
Существуют такие концепции, как разделение командных запросов, основанные на этой идее, которые предполагают, что интерфейс должен либо обновлять состояние, либо состояние запроса, но не то и другое вместе. Свойства с геттерами и сеттерами предоставляют интерфейс, который обновляет состояние и состояние запроса. Приведенные выше примеры MoveTo
и ChangeDate
будут «командами». По идее, вы должны предоставить другие способы запроса состояния; если это необходимо.
Еще одна проблема со свойствами заключается в том, что люди обычно добавляют как геттеры, так и сеттеры просто потому, что это свойство. Возможность получать или устанавливать свойство может не быть необходимой, и простое добавление как получателя, так и сеттера путем механического создания создает интерфейс, требующий тестирования и обслуживания, которые могут никогда не понадобиться.
Тонкий? Конечно; но он говорит об объектно-ориентированном дизайне, а не о коде, который «просто работает».
person
Peter Ritchie
schedule
29.08.2012