2008-08-05 10 views
8

мне интересно, если это хорошая идея, чтобы сделать проверки в добытчиками и Сеттеры, или в других местах в коде.Проверка данных в Getter/Setter или в другом месте?

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

ответ

12

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

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

Что касается производительности, я с Кнутом здесь:

«Мы должны забыть о небольших эффективности, скажем, около 97% времени:. Преждевременная оптимизация есть корень всех зол»

1

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

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

Вам не нужна какая-либо проверка для геттера, поскольку информация об объекте уже считается достоверной.

Не сохраняйте свою проверку до обновления базы данных! Лучше сбой быстро.

+0

Не могли бы вы уточнить? Вы хотите, например, проверить на <5 && > 0 в отдельном методе проверки? Тогда, что именно ваши геттеры и сеттеры делают это в обычном поле? – 2008-09-30 09:18:13

3

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

В конце концов, это то, для чего предназначены свойства. Если все у вас есть куча свойств, как ...

public string Name 
{ 
    get 
    { 
     return _name; 
    } 
    set 
    { 
     _name = value; 
    } 
} 

... они могли бы также быть поля

3

Это зависит от многого.

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

1

Возможно, вы захотите проверить Domain Driven Design, автор Eric Evans.DDD имеет это понятие Спецификация:

... явный предикат типа VALUE ОБЪЕКТОВ для специальных целей. A СПЕЦИФИКАЦИЯ - это предикат, который определяет, действительно ли объект делает или делает , не удовлетворяющий некоторым критериям.

Я думаю, что неудача быстро - это одно, а другое - сохранить логику для проверки. Домен является правильным местом для сохранения логики, и я думаю, что объект спецификации или метод проверки на ваших объектах домена будут хорошим местом.

1

Мне нравится реализовать IDataErrorInfo и поместить мою логику проверки в свою ошибку и это свойства [columnName]. Таким образом, если вы хотите программно проверить, есть ли ошибка, вы можете просто протестировать любой из этих свойств в коде или вы можете отменить проверку на привязку данных в Web Forms, Windows Forms или WPF.

Свойство привязки WPF «ValidatesOnDataError» делает это особенно простым.

4

@Terrapin, повторно:

Если все у вас есть куча [простой общественного установить/получить] свойств ... они могли бы также быть поля

Properties есть другие преимущества над полями. Они более четкие контракты, они сериализованы, их можно отлаживать позже, они являются хорошим местом для расширения через наследование. Неуклюжий синтаксис - случайная сложность - например, .net 3.5 преодолевает это.

Обычная (и ошибочная) практика заключается в том, чтобы начать с публичных полей и впоследствии превратить их в свойства на основе «по мере необходимости». Это нарушает ваш контракт с тем, кто потребляет ваш класс, поэтому лучше начать с свойств.

1

Я пытаюсь никогда не допускать, чтобы мои объекты попадали в недопустимое состояние, поэтому установители определенно имели бы валидацию, а также любые методы, которые изменяют состояние. Таким образом, мне никогда не придется беспокоиться о том, что объект, с которым я имею дело, недействителен. Если вы держите свои методы в качестве границ проверки, то вам никогда не придется беспокоиться о фреймворках проверки и методах метода IsValid(), которые посыпаются повсеместно.

 Смежные вопросы

  • Нет связанных вопросов^_^