Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Проверка данных в Getter/Setter или где-то еще?
Мне интересно, насколько это хорошая идея - делать проверки в геттерах и сеттерах или где-то еще в коде.
Это может удивить вас, когда речь заходит об оптимизации и ускорении кода, я думаю, что вы должны делать проверки не в геттерах и сеттерах, а в коде, где вы обновляете свои файлы или базу данных. Неужели я ошибаюсь?
Ну, одна из причин, почему классы обычно содержат закрытые члены с открытыми геттерами/сеттерами, заключается именно в том, что они могут проверять данные.
Если у вас есть число, которое может быть между 1 и 100, я бы определенно поместил что-то в setter, что подтверждает это, а затем, возможно, выбросил исключение, которое перехватывается кодом. Причина проста: если вы не делаете этого в setter, вы должны помнить, что ограничение от 1 до 100 каждый раз, когда вы устанавливаете его, что приводит к дублированию кода или когда вы забываете его, это приводит к недопустимому состоянию.
Что касается исполнения, то я здесь с кнутом:
"Мы должны забыть о малой эффективности, скажем о 97% времени: преждевременная оптимизация-это корень всех зол."
@Terrapin, заново:
Если все, что у вас есть, это куча [простых публичные set/get] свойства ... они с тем же успехом это могут быть поля
Свойства имеют и другие преимущества перед полями. Они являются более явным контрактом, они сериализованы, их можно отладить позже, они являются хорошим местом для расширения через наследование. Более неуклюжий синтаксис является случайной сложностью - .net 3.5, например, преодолевает это.
Распространенная (и ошибочная) практика заключается в том, чтобы начать с общедоступных полей, а затем превратить их в свойства на основе 'as needed'. Это нарушает ваш контракт с любым, кто потребляет ваш класс,поэтому лучше всего начать с свойств.
С точки зрения наличия наиболее поддерживаемого кода, я думаю, что вы должны сделать как можно больше проверок в setter свойства. Таким образом, вы не будете кэшировать или иным образом иметь дело с недопустимыми данными.
В конце концов, именно для этого и предназначены свойства. Если все, что у вас есть, это куча таких свойств, как...
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
... с таким же успехом они могли бы быть полями
Это зависит.
Как правило, код должен быстро завершаться ошибкой. Если значение может быть задано несколькими точками в коде и вы проверяете только после получения значения, ошибка, по-видимому, находится в коде, который выполняет обновление. Если сеттеры проверяют входные данные, вы знаете, какой код пытается установить недопустимые значения.
Валидация должна быть записана отдельно от геттеров или сеттеров в методе валидации. Таким образом, если проверка должна быть повторно использована в нескольких компонентах, она доступна.
Когда вызывается setter, такая служба проверки должна использоваться для очистки входных данных в объект. Таким образом, вы знаете, что вся информация, хранящаяся в объекте, действительна в любое время.
Вам не нужна никакая проверка для getter, потому что информация об объекте уже считается достоверной.
Не сохраняйте валидацию до обновления базы данных!! Лучше потерпеть неудачу быстро .
Возможно , вы захотите проверить доменный дизайн, разработанный Эриком Эвансом. DDD имеет это понятие спецификации: ...
явный предикат-как VALUE OBJECTS для специальных целей. Один SPECIFICATION-это предикат, который определяет, делает ли объект это или нет не удовлетворяет некоторым критериям.
Я думаю, что быстрая неудача-это одно,а другое-где хранить логику для проверки. Домен-это правильное место для хранения логики, и я думаю, что объект спецификации или метод проверки для ваших объектов домена будет хорошим местом.
Мне нравится реализовывать IDataErrorInfo и помещать свою логику проверки в ее свойства Error и this[columnName]. Таким образом, если вы хотите проверить программно, есть ли ошибка, вы можете просто проверить любое из этих свойств в коде, или вы можете передать проверку привязке данных в веб-формах, формах Windows или WPF.
Свойство привязки WPF's "ValidatesOnDataError" делает это особенно легким.
Я стараюсь никогда не позволять моим объектам входить в недопустимое состояние, поэтому у сеттеров определенно будет проверка, а также любые методы, которые изменяют состояние. Таким образом, мне никогда не придется беспокоиться о том, что объект, с которым я имею дело, недействителен. Если вы сохраняете свои методы в качестве границ проверки, то вам никогда не придется беспокоиться о фреймворках проверки и вызовах метода IsValid(), разбросанных повсюду.