Как я могу писать классы, которые не полагаются на "глобальные" переменные?

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

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

Итак, я думаю, мой вопрос: как мне перестать писать классы с "глобальными" переменными? Было бы разумнее притворяться, что я пишу на функциональном языке? Под этим я подразумеваю, что все функции принимают параметры и возвращают значения вместо прямой модификации переменных класса. Если мне нужно установить любые поля, я могу просто взять вывод функции и назначить ее вместо того, чтобы функция выполняла ее напрямую. Похоже, что он может сделать более удобный код, по крайней мере для более крупных классов. Какая распространенная практика?

Ответы

Ответ 1

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

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

Ответ 2

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

Это вполне приемлемо.

Переменные ограничены внутри вашего класса, поэтому они не являются "глобальными".

См. Encapsulation.

Ответ 3

Переменные класса не являются глобальными, они локальны для каждого экземпляра класса. Это одна из мощных концепций ООП и вполне приемлема (и правильный способ сделать это [предполагая, что ваши классы каждый позаботится об одной логической вещи, см. Инкапсуляцию]).

Ответ 4

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