Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Почему глобальные переменные это зло, а поля класса нет?

#ооп #область_видимости


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


Ответы

Ответ 1



Глобальные переменные в большинстве случаев нарушают инкапсуляцию. К ним открыт неконтролируемый доступ отовсюду. В большом проекте при обилии глобальных переменных возникает путаница в именах. Глобальную переменную же видно отовсюду, надо, чтобы отовсюду было понятно, зачем она. Глобальные переменные в большинстве случаев нарушают принцип инверсии зависимостей (или делают возможным его нарушение). Глобальные переменные ухудшают масштабируемость проекта. Глобальные переменные ухудшают читаемость кода (в каком-то конкретно взятом месте непонятно, нужна ли какая-то конкретная глобальная переменная, или нет). Глобальные переменные приводят к трудноуловимым ошибкам. Примеры: нежелательное изменение её значения в другом месте/другим потоком, ошибочное использование глобальной переменной для промежуточных вычислений из-за совпадения имен, возвращение функцией неправильного значения при тех же параметрах (оказывается, она зависима от глобальной переменной, а ее кто-то поменял). Глобальные переменные создают большие сложности при использовании модульного тестирования. Глобальные переменные увеличивают число прямых и косвенных связей в системе, делая её поведение труднопредсказуемым, а её саму - сложной для понимания и развития. Поля - это такие же глобальные переменные, только в пределах класса. А давайте одежду дома складывать прямо на пол в любом месте квартиры: ведь 30 кв. см ящика в комоде - это те же 30 кв. см поверхности, что и на полу, только в пределах ящика. И гаражи для машин не нужны, можно на улице ставить. Надеюсь, аналогия понятна. Ключевая ошибка в утверждении автора заключается в том, что поля класса никаким образом не являются глобальными - они принадлежат объекту (экземпляру) класса, если они не статические. У одного объекта - одни значения, у другого - другие. А статические поля класса общие для всех экземпляров, и это чаще всего тоже не очень хорошо.

Комментариев нет:

Отправить комментарий