首先,对不起我的英语不好。
最近,我读了叶戈尔·布加延科(Yegor Bugayenko)的书《优雅的物体》。本书的主题之一是致力于使用对象而不是公共常量。作者写道,公共常数纯属邪恶。造成这种情况的原因很多。例如,使用公共常量会破坏封装-如果要更改此内容,我们需要知道包的类如何使用此常量。如果项目中的两个类以其自己的方式使用此常量,则如果我们更改常量,则需要更改这两个类的代码。
作者建议不要使用全局常量,而需要创建对象,这使我们只能在一个地方更改代码。我将在下面举一个例子。
我已经阅读了关于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。
答案 0 :(得分:0)
我认为,通过为常量创建一个类以将其自身以不同的形式提供给不同的(其他)类,您正在过度设计常量。为什么常数必须知道其用法? math.pi
是否知道其用法?它实际上有一些方法,因为它是一个float
对象。 pi常数没有特定内容。此外,当您执行此操作时,会将常量耦合到其他类,并且当它们更改其用途时,可能必须更新常量类。现在,这是个坏主意。您希望它们解耦。每个类(并且只有该类)都应该知道该常量在做什么。
这并不是说包装类有时不能用,特别是在将相关常量分组时。但是您也可以使用Enum
。
并且模块中的全局变量只是该模块中的全局变量。导入后,您将使用副本或(限定的)链接名称。但是,即使在链接的情况下,如果您使用限定条件更改了导入的值(您不应说它是恒定的,所以不应该这样做),而另一个模块正在导入相同的值,则它不会看到您所做的更改。他们使用不同的名称空间。当我们说全局变量是邪恶的时,这不是通常的“全局变量”概念。