Основная причина заключается не в инкапсуляции ООП (хотя люди часто говорят, что это так), а во всем, что касается управления версиями.
Действительно, с позиции ООП можно утверждать, что поля лучше, чем «слепые» свойства, поскольку отсутствие инкапсуляции более очевидно, чем то, что претендует на инкапсуляцию, а затем отбрасывает ее. Если инкапсуляция важна, то должно быть хорошо, когда ее нет.
Свойство с именем Foo не будет обрабатываться извне так же, как публичное поле с именем Foo. В некоторых языках это явно (язык напрямую не поддерживает свойства, поэтому у вас есть getFoo и setFoo), а в некоторых - неявно (C # и VB.NET напрямую поддерживают свойства, но они не совместимы с двоичным кодом. с полями и кодом, скомпилированным для использования, поле сломается, если оно будет изменено на свойство, и наоборот).
Если ваш Foo просто выполняет «слепую» установку и запись нижележащего поля, то в этом случае в настоящее время нет преимущества инкапсуляции по сравнению с открытием поля.
Однако, если в дальнейшем потребуется воспользоваться преимуществами инкапсуляции для предотвращения недопустимых значений (вы всегда должны предотвращать недопустимые значения, но, возможно, вы не осознавали, что некоторые из них недопустимы, когда вы впервые написали класс, или, возможно, «действительный» был изменен с помощью изменение области действия), чтобы обернуть мемоизированную оценку, вызвать другие изменения в объекте, инициировать событие при изменении, предотвратить дорогостоящие ненужные эквивалентные наборы и т. д., тогда вы не сможете внести это изменение, не нарушив работающий код.
Если класс является внутренним по отношению к рассматриваемому компоненту, это не проблема, и я бы сказал, что используйте поля, если поля читаются разумно в соответствии с общим принципом YAGNI. Однако YAGNI не так хорошо работает через границы компонентов (если мне нужен мой компонент для работы сегодня, мне, безусловно, мне, вероятно, понадобится, чтобы он работал завтра после того, как вы изменили свой компонент, который мой зависит от), поэтому может иметь смысл превентивное использование свойств.
person
Jon Hanna
schedule
17.08.2010