如果一个类只能有一个实例,我还应该创建它吗?



我是OOP的新手,我正在用Python编写一个小工具,使用web Bitcoin() class的JSON加载检查比特币价格,它监视Monitor()的价格,当阈值满足Notify()时通知用户,并使用控制台接口Interface()现在这样做。

我已经创建了一个Bitcoin()类,可以从JSON加载读取价格和数量。__init__定义使用套接字连接到web。因为这个类的每个实例都会产生一个新的套接字,所以我只需要/希望运行这个类的一个实例。

  1. 类仍然是解决这个问题的最好方法吗?
  2. 什么是最好的方式来获得其他类和实例与我的Bitcoin()实例交互?
  3. 我应该全局化Bitcoin()实例吗?将实例作为参数传递给每个需要它的类?

我关心的第一件事是SRP违规,你的Bitcoin类可能不应该负责:

  • 打开套接字,
  • 解析结果,
  • 渲染输出。

我不知道细节,但从我的角度来看,你应该分割的功能较小的类/函数(在只使用模块的情况下),其中一个将负责从web检索数据。还请记住,全局状态是邪恶的(在某些上下文中,单例可以被描述为全局状态)。

从我的角度来看,另一件事是在构造函数中打开一个套接字。这是不可测试的,当然你可以模拟/存根套接字,但从我的观点来看,它是更好的,当类需要所有的依赖关系作为一个构造函数参数。通过这样做,您还可以注意到一些具有广泛责任的类(如果您的构造函数需要超过3,4个参数,则肯定可以简化)。

http://www.youtube.com/watch?v=o9pEzgHorH0

我不确定这个视频对你的项目有多重要(没有实际阅读的代码)。但也许你会找到你问题的答案。至少你会学到一些新的东西,这就是我们在这里的目的。

如果我是你,我的代码会是这样的:
(每一组作业都有一个类,这不是你正在做的)

class Interface:
    ''' Handle UI '''
    ...
class Connect:
    ''' Handle web interface '''
    ...
class Bitcoin:
    ''' Handle the calculations '''
    ...
class Notify:
    ''' Notifier '''
    ...

简而言之,把你的类分成更小更简单的类

现在回答你的问题:

  1. 是的,因为你手头有一个"有点复杂"的问题,而且你正在使用Python,所以创建一个面向对象的版本肯定比创建一个非面向对象的版本更容易。所以,除非你有很好的理由,否则还是坚持使用OOP吧。
  2. 在你的例子中,它也可以作为参数传递实例。
  3. 这是个好主意。如果你对作用域没有很好的理解,这可以消除由作用域引起的问题。
    但是请记住,您传递的是引用,而不是值,因此对实例的操作可能会影响该实例传递给的其他类。

注意:在类的构造函数中打开套接字不是一个好主意。如果你把它放在一个方法中可能会更好。

答案是可能。这取决于你的整个架构,你应该看看单例模式,因为你的描述到处都是单例模式。

http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29

如果您找不到任何反对在给定的体系结构中创建类的理由,那么就去做吧。

OOP是一个工具,而不是一个目标,您可以决定是否使用它。如果您使用Python模块,则无需编写"class"即可实现封装。

当然,您可以使用python类来实现此目的。您也可以使用模块级实例(不需要全局关键字或显式传递参数)。在我看来,这是个品位问题。

基本上你问的是关于单例模式特定于python的实现,它已经在这里得到了回答:Python与单例模式

模式本身的描述可以在这里找到:http://en.wikipedia.org/wiki/Singleton_pattern

最新更新