Как я могу написать классы, которые не зависят от «глобальных» переменных? - PullRequest
13 голосов
/ 24 мая 2010

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

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

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

Ответы [ 4 ]

16 голосов
/ 24 мая 2010

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

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

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

См. Инкапсуляция .

11 голосов
/ 24 мая 2010

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

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

3 голосов
/ 24 мая 2010

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

2 голосов
/ 24 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...