Подтвердить что ты не робот

Это хорошая практика для реализации логики в свойствах

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

это действительно плохо? и почему бы не использовать логику в свойствах?

спасибо,

4b9b3361

Ответ 1

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

Ответ 2

Прекрасно иметь некоторую логику в свойствах. Например, проверка аргументов в сеттерах и ленивое вычисление в геттерах довольно распространены.

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

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

Ответ 3

Свойства - это методы. Они просто сокращаются для геттеров/сеттеров. Любая логика, которая была бы действительна в геттере/сеттере, разумна, чтобы добавить свойство. Любая логика, которую вы обычно не помещали бы в getter/setter, нецелесообразно вводить свойство. Вообще говоря, если бы вы (как потребитель класса) не могли разумно ожидать, что установка значения свойства или, что еще хуже, получение значения свойства может привести к поведению, то эта логика, вероятно, принадлежит где-то еще. Другими словами, логика должна быть связана и согласуется с получением или установкой свойства.

Цитата из связанного выше статьи:

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

Ответ 4

Здесь применяется общий ответ: он зависит.

Как правило, нецелесообразно внедрять бизнес-логику в getters и seters. Если ваш объект является простым DTO (объектом передачи данных), это нарушит единую ответственность.

Однако в свойствах часто обнаруживаются логика отслеживания состояния и другая домашняя работа. Например, объекты самообслеживания Entity Framework 4 имеют логику управления состоянием в каждом примитивном устройстве свойств, позволяющем отслеживать.

Альтернативой логике в свойствах является аспектно-ориентированное программирование (АОП). Используя АОП, вы можете "вводить" логику между объектами и процессом хостинга. Доступ к объектам может быть "перехвачен" и обработан условно.

Ответ 5

Размещение бизнес-логики в сеттере может вызвать у вас проблемы, если вам когда-либо понадобится сериализовать/десериализовать ваши объекты с помощью JSon, XML или ORM. Примером этого может быть использование хранилища данных NoSql, такого как база данных документов или ORM. Некоторые из них (например, NHibernate) могут быть сконфигурированы для доступа к полям поддержки вместо установщика.

Я считаю, что использование общедоступного Getter и Private setter вместе с методом для установки значения с дополнительной логикой по мере необходимости является хорошим подходом. Большинство сериализаторов могут получить доступ к частному сетевому устройству, поэтому в итоге вы получаете точное представление о сохраненном объекте без логики случайного запуска, которая могла бы неправильно изменить значения при десериализации.

Однако, если вы не думаете, что когда-либо возникнет необходимость в сериализации/десериализации, это не должно быть проблемой.

Ответ 6

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

Ответ 7

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

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

Ответ 8

По моему мнению, бизнес-логика разрешена в Setter/Getter только в определенных ситуациях. Для exaple: он добавил логику, отвечающую за проверку ввода, потому что сеттеры несут ответственность за состояние объекта maintinging, так что состояние не должно быть нарушено. Таким образом, вы должны сократить эту бизнес-логику до наименьшей части кода, которая отвечает только за одного субъекта.

Другое дело, что ваш класс должен быть (в лучшем случае) POCO. Зачем? Поскольку он должен быть повторно использован, и когда класс содержит логику в свойствах, можно повторно блокировать повторное использование. Подумайте, что у вас есть SqlServerPerson с некоторыми проверками SQLServer в свойствах, тогда его может быть сложно заменить, например, NHibernatePerson при изменении доступа ORM/DB.