Доступ к переменной класса напрямую (с использованием точечной нотации) или через функцию? - PullRequest
1 голос
/ 18 января 2020
class ThermometerClass {
    var temperature: Double = 0.0

    func registerTemperature(_ temperature: Double) {
        self.temperature = temperature
    }
}

let thermometerClass = ThermometerClass()

thermometerClass.temperature = 56.0

thermometerClass.registerTemperature(56.0)

Я могу получить доступ к температуре напрямую, используя точечную запись, а также с помощью функции, которая отличается от этих двух.

1 Ответ

0 голосов
/ 18 января 2020

Ученик temperature не очень хорошо оформлен. Не хватает инкапсуляции.

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

  • Доступ через функцию предназначен для выполнения некоторых обещаний, независимо от внутренних деталей. Доступ через функцию более контролируем: если изменение температуры потребует дополнительной информации (например, гигрометрия, потому что вы ожидаете коррелировать во времени оба измерения или временную метку от внешних атомов c часов), функция может потребовать это, тогда как переменные всегда можно изменить индивидуально.

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

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

При этом дизайн класса может быть улучшен:

  • Инкапсуляция должна выполняться, делая переменную закрытой. Тогда пользователи класса будут вынуждены использовать registerTemperature().
  • Для удобства вы можете сделать установщик для свойства оболочки: это, по-видимому, дает прямой доступ к переменной c, но при изменении ее значения запускается установщик, чтобы гарантировать обещания таких изменений. проводятся.

Редактировать, чтобы избежать двусмысленной формулировки: наблюдатели свойств (willSet и didSet) позволяют создавать дополнительные эффекты при непосредственном изменении переменной publi c , Так что прямые изменения не мешают дополнительным эффектам. Но это требует от дизайнера классов таких прямых изменений. И изменение менее контролируется, чем в функции. Например, вы не можете полностью предотвратить последствия незаконного изменения: вы можете отменить неправильное изменение в didSet, но willSet будет вызываться дважды; один раз с недопустимым значением, один после реверса.

...