Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

@Terrapin, re:

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

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

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

Это зависит.

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

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

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

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

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

Возможно, вы захотите проверить Проектирование, ориентированное на предметную область, Эрик Эванс.В DDD есть такое понятие спецификации:

...Явные объекты, похожие на предикат, для специализированных целей.Спецификация - это предикат, который определяет, выполняет ли объект или не удовлетворяет некоторые критерии.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top