建议OOP分析/设计 - 打破我的程序习惯

时间:2012-07-16 09:50:28

标签: python oop object-oriented-analysis

我想使用OOP / OOD作为小项目的练习,但我经常发现自己在编码时使用了程序方法。我将Python与Flask(Web框架)结合使用

从本质上讲,我的应用程序是一种为新电影版本读取RSS源的蜘蛛。对于每个新的电影版本,它使用imdb链接从两个不同的Web服务(imdbapi和TMDb)收集有关情节,年份,流派,海报和类似信息的信息。如果首选服务无法提供信息,则使用其他服务。 最后保存数据库中的所有信息。 然后我使用Flask在网站上显示信息

我现在已经创建了一个Spider类。它包含以下方法(为清晰起见,删除了代码):

class Spider():
""" Spider Class """

def __init__(self, rssfeed):

def run_update(self):
    movie_list = self.get_entries_from_feed()
    self.get_imdb_json(movie_list)

def get_entries_from_feed(self):
    """ reads an rss feed and return a list of lists with imdb id, title, and added date         time """

def get_imdb_json(self, movie_list):
    """ get json data from imdbapi based on list with imdb id"""
    if not in db:
        save_to_db

def save_to_db(self, key, nzb_title, added, data):
    """ save entry to db from json data"""

“问题”是我使用 run_update()方法以程序方式执行所有步骤。我也发现设计不灵活。例如,如果我无法获得一项服务的电影信息,我想尝试其他服务,但这并不是很容易以当前格式实现。

我想到的是创建一个Movie类,代表rssfeed中找到的每部电影。也许还为我用来收集有关每部电影imdbapi和TMDb的信息的每项服务创建课程?

那么,您将如何以OOP / OOD方式设计这样的应用程序?当我们超出教科书中使用的简单例子时,我发现识别课程有点困难 - 比如汽车,书籍,水果等。

3 个答案:

答案 0 :(得分:1)

Python的优点在于它以非常无缝的方式支持许多不同的编程范例。不要太担心在OOP中做所有事情,使用正确的工具来完成工作。并非一切都是钉子,所以不要仅限于锤子。

话虽如此,如果您只是想在OOP中进行练习,请寻找模式。例如,战略模式可能是您的多种信息来源的良好解决方案。对于想要更好地处理OOP的人,我强烈推荐GoF Patterns book。对于想要超越基本编程的人来说,应该要求阅读恕我直言。

对于发现对象,经典的方法是开始在你的问题空间中寻找名词并将它们作为你的对象:movie,feed,imdb,tmdb。然后,您开始考虑应该与每个对象相关联的属性和功能(如果您想继续进行类比,请使用形容词和动词)。当您开始看到常见功能时,就像使用imdb和tmdb一样,那么您可能会考虑使用公共基类:mdb。下一步是查看对象之间的关系。我是一个视觉人,所以我总是Class Diagram来帮助我理解人际关系。阅读CRC CardsResponsibility-Driven Design,了解有关此技术的详细信息。

如果您对常见模式有一些基本的工作知识,它们的工作方式和应用位置,您将开始注意对象中的模式。如果没有,这种技术仍然可以帮助您构建有用的OO系统。风险在于您可能正在重新发明轮子,或者您可能会错过一些可以在以后为您节省大量时间的东西。

答案 1 :(得分:1)

要做OOP,你需要确定你需要解决的每个问题,然后独立于其他问题解决它(这样你就可以从OOP中获得所有好的SOLID等等......)

大多数人可能会称我为极端主义者(他们可能是对的),但这种方法对我来说非常好:

我已经发现了这些问题,所以我会为每一个创建一个类。然后你需要“绑定”它们,不要考虑你将如何完成你想做的事情,而是关注你想要做的事情,并试图留下“实施细节”,总是为了“以后” (或更深),只要你能:

run_update
    get entries from feed
        obtain the feed
        read the feed
        parse an movie entry
            manage movie entry information
    get imdb json
        talking with imdbapi
        parsing json 
        converting json to movie
        talking with db
            querying the db
            saving with db
                convert movie to db format

答案 2 :(得分:0)

尝试使用像SQLAlchemy这样的ORM来跟踪和填充模型/持久数据以及它们之间的关系。这是使用典型的Web应用程序可以执行的主要OOP操作。

不要仅仅为了OOP而做OOP。另一个好方法是找到重复代码/逻辑的位置,并尝试将其重构到一个地方。尝试使每个类解耦,不知道其他类是如何实现的。从公共API和合同的角度考虑事情。这通常会导致OOP设计。