0

我是 OOP 的新手,正在用 Python 编写一个小工具,它使用来自网络的 JSON 加载检查比特币价格Bitcoin() class,它监控价格Monitor(),在达到阈值时通知用户,Notify()并暂时使用控制台界面Interface()来执行此操作。

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

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

6 回答 6

2

The first thing which concerns me is the SRP violation, your Bitcoin class probably shouldn't be responsible for:

  • opening socket,
  • parsing results,
  • rendering output.

I don't know the details but from my point of view you should split that functionality to smaller classes/functions (in case of using only modules), and one of them will be responsible for retrieving data from web. Please also keep in mind that global state is evil (singletons in some contexts could be described as global state).

Another thing which is a smell from my point of view is opening a socket inside the constructor. This isn't testable, of course you could mock/stub socket, but from my point of view it's better when class requires all it's dependencies as a constructor parameter. By doing it that way you could also notice some classes with to wide responsibility (if your constructor requires more that 3,4 parameters it definitely could be simplified).

于 2013-04-04T17:16:00.557 回答
1

如果我是你,我的代码将类似于:(
每组工作的一个类,这不是你正在做的)

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

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

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

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

简而言之,将您的类拆分为更小的更简单的类

现在回答你的问题:

  1. 是的,因为您手头有一个“复杂”的问题并且您正在使用 Python,所以创建 OOP 版本肯定比创建非 OOP 版本更容易。因此,除非您有充分的理由不这样做,否则请坚持使用 OOP。
  2. 在您的情况下,它也可能将实例作为参数传递。
  3. 这是一个好主意。如果您对范围没有很好的了解,这可以消除由范围引起的问题。
    但是请记住,您传递的是引用,而不是值,因此操作实例可以并且将会影响实例传递给的其他类。

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

于 2013-04-04T17:44:29.840 回答
1

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

我不确定该视频与您的项目有多相关(没有实际阅读的代码)。但也许你会回答你的问题。至少你会学到一些新的东西,这就是这里的目的。

于 2013-04-04T17:37:01.950 回答
0

The answer is maybe. Depends upon you whole architecture, You should look at the singleton pattern, because you description yells Singleton all over.

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

If you don't find any good reason against creating a class in your given architecture, then just go for it.

于 2013-04-04T17:15:01.597 回答
0

OOP is a tool, not a goal, you can make a decision whether to use it or not. If you use a Python module, you can achieve encapsulation without ever writing "class".

于 2013-04-04T17:15:25.373 回答
0

当然,您可以为此目的使用 python 类。您也可以使用模块级实例(不需要全局关键字或显式传递参数)。恕我直言,这是一个口味问题。

基本上你问的是单例模式 python 特定的实现,这里已经回答了: Python and the Singleton Pattern

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

于 2013-04-04T17:47:19.143 回答