2013-04-04 107 views
0

我是新来的OOP和我用Python写一个小工具,它使用JSON负载从网络Bitcoin() class检查比特币的价格,它监视价格Monitor(),通知临界值时,满足Notify()用户,并使用一个控制台界面Interface()为现在要这样做。我还应该创建一个类吗?如果它只能有一个实例?

我创建了一个Bitcoin()类,可以从JSON负载中读取价格和卷。 __init__定义使用套接字连接到Web。由于这个类的每个实例都会导致一个新的套接字,所以我只需要/希望运行这个类的一个实例。

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

回答

0

面向对象是一个工具,而不是一个目标,你可以决定是否使用它。如果你使用Python模块,你可以实现封装,而不用写“class”。

+0

我的目标是学习OOP,所以它可以是我可以访问的工具。我希望能够使用这个项目,因为它看起来小到可以实现这个目标。 – pedram 2013-04-04 17:38:59

+0

好吧,一个Python模块是一个对象。它具有属性和方法。它为其内部提供了封装。你唯一不能做的就是创建多个实例。另外,从模块派生并不是真的支持,尽管你可以创建一个扩展或覆盖另一个模块的模块。建议:尝试应用面向对象的原则,看看它是如何工作的,记住可能有其他方法。 – 2013-04-06 11:25:48

2

这对我而言是SRP违反,您Bitcoin类可能不应该负责的第一件事:

  • 开放插座,
  • 解析结果,
  • 渲染输出。

我不知道详细信息,但从我的角度来看,您应该将该功能拆分为更小的类/函数(仅使用模块),其中一个将负责从Web检索数据。还请记住,全球状态是邪恶的(在某些情况下,单身可以被描述为全球状态)。

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

+0

谢谢,分班可能是要走的路。我也很讨厌全局变量。存储价格和数量的首选方式是什么,以便在需要时可供其他类使用? – pedram 2013-04-04 17:41:33

+1

一如既往..它取决于(:我知道TDD在任何时候都不是那么好,但是在大多数情况下,它可以用体面的设计创建可测试的代码(: – 2013-04-04 17:50:31

1

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

我不知道该如何视频相关的是为您的项目(无码实际上读)。但是,也许你会回答你的问题。至少你会学到一些新的东西,那就是这里的东西。

+0

谢谢,那是值得的时间看着它,虽然对初学者来说可能有点复杂,因为它需要一些编程经验。 – 2013-04-06 11:48:50

1

如果我是你,我的代码会是这样的:
(为每个组作业类,这是不是你在做什么)

class Interface: 
    ''' Handle UI ''' 
    ... 

class Connect: 
    ''' Handle web interface ''' 
    ... 

class Bitcoin: 
    ''' Handle the calculations ''' 
    ... 

class Notify: 
    ''' Notifier ''' 
    ... 

总之,分割你的类成更小更简单的类

现在对于你的问题:

  1. 是的,因为你手头上有一个“复杂十岁上下”的问题,你在使用Python,所以它肯定更容易地创建一个面向对象的版本比非OOP一。所以,除非你有充分的理由不坚持,否则坚持OOP。
  2. 就你而言,它可能是传递实例作为参数。
  3. 这是一个好主意。这消除了范围造成的问题,如果你对它们没有很好的理解。
    但是请记住,您传递的是引用而不是值,因此操纵实例可以影响实例传递给其他类。

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

相关问题