Могут ли глобальные переменные для пакета в python считаться злом? - PullRequest
0 голосов
/ 09 января 2019

Для начала, извините за мой плохой английский.

Недавно я прочитал книгу Егора Бугаенко под названием "Изящные предметы". Одна из тем в этой книге посвящена использованию объектов вместо публичных констант. Автор пишет, что публичные константы - это чистое зло. Есть много причин для этого. Например, использование открытых констант нарушает инкапсуляцию - если мы хотим изменить эту константу, нам нужно знать, как классы нашего пакета используют эту константу. Если два класса в проекте используют эту константу по-своему, нам нужно изменить код этих двух классов, если мы изменим константу.

Автор предполагает, что вместо использования глобальных констант нам нужно создавать объекты, и это позволяет нам изменять код только в одном месте. Я приведу пример ниже.

Я уже читал похожие темы по stackoverflow, но не нашел ответа о передовой практике или вариантах использования. Является ли использование объектов лучше, чем создание глобальной переменной в каком-либо файле, например "settings.py"?

Это

class WWStartDate:

    date_as_string = '01.09.1939'

    def as_timestamp(self):
        # returns date as timestamp

    def as_date_time(self):
        # returns date as datetime object

лучше, чем это хранится в каком-то файле внутри пакета conf.py, например:

DATE_STRING = '01.09.1939'

если мы говорим об использовании этой даты в нескольких классах нашего пакета?

После прочтения этой книги я решил, что объекты намного лучше, но я вижу много случаев, когда разработчики фреймворка или библиотеки заставляют нас использовать глобальные переменные. Так что не все так просто, как я вижу. Почему, например, django использует этот подход? Я говорю о файле settings.py.

1 Ответ

0 голосов
/ 10 января 2019

Я думаю, что, создавая класс для константы, предлагающей себя в разных формах разным (другим) классам, вы переоцениваете свои константы. Почему константа должна знать, как она используется? math.pi знает, как это используется? На самом деле у него есть несколько методов, потому что это float объект. Ничего конкретного для константы пи. Кроме того, когда вы делаете это, вы соединяете константу с другими классами, и когда они меняют свое использование, вам, возможно, придется обновить класс константы. Это плохая идея. Вы хотите их отделить. Каждый класс (и только класс) должен знать, что он делает с константой.

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

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

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