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

标签 python oop object-oriented-analysis

我想使用 OOP/OOD 作为一个小项目的练习,但我发现自己在编码时经常使用过程方法。我结合使用 Python 和 Flask(网络框架)

本质上,我的应用程序是一种蜘蛛程序,可以读取新电影发布的 rss 提要。对于每个新电影发布,它使用 imdb 链接从两个不同的网络服务(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 方式着手设计这样的应用程序?当我们超出教科书中使用的简单示例(例如汽车、书籍、水果等)时,我发现识别类有点困难。

最佳答案

Python 的美妙之处在于它以非常无缝的方式支持许多不同的编程范式。不要太担心在 OOP 中做所有事情,使用正确的工具来完成工作。并非所有东西都是钉子,所以不要将自己局限于一把锤子。

话虽如此,如果您只是想练习 OOP,请寻找模式。例如,对于您的多个信息源,策略模式可能是一个很好的解决方案。我强烈推荐 GoF Patterns book对于任何想要更好地处理 OOP 的人。任何想要超越基本编程的人都应该阅读恕我直言。

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

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

关于python - 建议OOP分析/设计——打破我的程序习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501906/

相关文章:

php - 什么时候你才能称自己为 PHP 专业人士?

python - 多个字典/字符串使其通过不应通过的 if 语句

python - 难以捕获执行就地状态更新的子流程的输出

python - 通过 Panflute 的 Pandoc 过滤器未按预期工作

python - 使用 pythonwhois 测试域名可用性

具有继承性的 Python 循环导入

php - 用于代码重用的特征与抽象类

javascript - 在javascript中重载与覆盖

java - java中可以创建多少个嵌套的 "new"对象?

php - 在PHP中根据对象属性值动态实现接口(interface)?