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

Где должна быть линия между свойством и методом?

Возможный дубликат:
Свойства vs Методы

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

Очевидные свойства:

  • "name"
  • "длина"

Очевидные методы:

  • "SendMessage"
  • "Печать"

Неоднозначно:

  • "Valid" / "IsValid" / "Validate"
  • "InBounds" / "IsInBounds" / "CheckBounds"
  • "AverageChildValue" / "CalcAverageChildValue"
  • "ColorSaturation" / "SetColorSaturation"

Я полагаю, я бы склонялся к методам для двусмысленных, но кто-нибудь знает правило или соглашение, которые помогают решить это? Например. должны ли все свойства быть O (1)? Если свойство не сможет изменить другие данные (ColorSaturation может изменить значения R, G, B)? Если это не свойство, если есть расчет или агрегация?

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

4b9b3361

Ответ 1

Я обычно конвертирую свойство в функцию, если оно имеет одно из следующих действий

  • Вызывает побочный эффект (кроме установки поля поддержки)
  • Реализация стоит дорого по сравнению с полевым доступом.
  • Реализация имеет более высокую сложность, чем Log (N)
  • Может генерировать исключение

Ответ 2

Я нашел интересный текст об этом

MSDN | Свойства vs Методы

ИЗМЕНИТЬ

Он говорит такие вещи, как:

Использовать свойство, когда

  • Элемент является членом логических данных

Использовать метод, когда

  • Операция - это преобразование, например Object.ToString.
  • Операция достаточно дорогая, что вы хотите сообщить пользователю, что они должны учитывать кеширование результата.
  • Получение значения свойства с помощью get accessor будет иметь наблюдаемый побочный эффект.
  • Вызов члена дважды подряд дает разные результаты.
  • Порядок выполнения важен. Обратите внимание, что свойства типа должны быть установлены и извлечены в любом порядке.
  • Элемент статический, но возвращает значение, которое можно изменить.
  • Элемент возвращает массив. Свойства, возвращающие массивы, могут вводить в заблуждение.
  • Обычно необходимо возвращать копию внутреннего массива, чтобы пользователь не мог изменить внутреннее состояние. Это, в сочетании с тем, что пользователь может легко предположить, что это индексированное свойство, приводит к неэффективному коду.

Ответ 3

Еще одно соображение - связывание. Большинство фреймворков могут связываться только со свойствами. Например, если вы хотите, чтобы IsValid можно было использовать в привязке (скажем, как источник привязки для свойства IsEnabled кнопки OK), тогда это должно быть свойство, а не метод.

Ответ 4

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

Ответ 5

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

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

Ответ 6

Я лично делаю выбор по сложности и тому, что будет делать метод/свойство. Если я все делаю, устанавливаю значение, то есть _name = something;, тогда я иду с свойством. Даже если я собираюсь сделать некоторые очень простые вычисления или условные утверждения, я буду придерживаться свойства. Но если что-то потребует какой-то серьезной работы или даже умеренной работы, я бы использовал метод. Ничто не улучшает меня, а затем устанавливает свойство, и вдруг целая куча больше кода, чем я ожидал, будет выполнен.