3

我想使用 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 方式设计和设计这样的应用程序?当我们超出教科书中使用的简单示例(如汽车、书籍、水果等)时,我发现识别类有点困难。

4

3 回答 3

1

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

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

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

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

于 2012-07-16T15:34:12.230 回答
1

要进行 OOP,您需要确定需要解决的每个问题,然后独立于其他问题来解决它(这样您将获得所有不错的 SOLID 等......从 OOP 中受益)。

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

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

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
于 2012-07-17T01:20:02.810 回答
0

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

但是,不要仅仅为了 OOP 而做 OOP。另一种好方法是找到重复代码/逻辑的位置并尝试将其重构到一个位置。尽量让每个类解耦,不知道其他类是怎么实现的。从公共 API 和合约的角度来思考问题。这通常会导致 OOP 设计。

于 2012-07-16T10:32:07.847 回答