3

小さなプロジェクトの演習としてOOP/OODを使用したいのですが、コーディング時に手続き型アプローチを使用することがよくあります。PythonをFlask(Webフレームワーク)と組み合わせて使用​​します

本質的に、私のアプリは、新しい映画のリリースのRSSフィードを読み取る一種のスパイダーです。新しい映画のリリースごとに、imdbリンクを使用して、2つの異なるWebサービス(imdbapiとTMDb)から、プロット、年、ジャンル、ポスター、およびそのような情報に関する情報を収集します。優先サービスが情報を提供できない場合は、他のサービスを使用してください。最後に、すべての情報をデータベースに保存します。次に、Flaskを使用してWebサイトに情報を表示します

今のところ、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()メソッドを使用して、すべてのステップを手続き的に実行することです。また、デザインに柔軟性がないと思います。たとえば、あるサービスの映画情報を取得できない場合、他のサービスを試してみたいのですが、これを現在の形式で実装するのは簡単ではありません。

私が考えたのは、rssfeedで見つかった各映画を表すMovieクラスを作成することです。たぶん、各映画、imdbapi、TMDbに関する情報を収集するために使用するサービスごとにクラスを作成することもできますか?

では、このようなアプリをOOP / OOD方式でどのように設計しますか?車、本、果物などの教科書で使用されている単純な例を超えていると、クラスを特定するのが少し難しいと思います。

4

3 に答える 3

1

Pythonの優れている点は、非常にシームレスな方法で多くの異なるプログラミングパラダイムをサポートしていることです。OOPですべてを行うことについてそれほど心配する必要はありません。その作業に適したツールを使用してください。すべてが釘であるとは限らないので、ハンマーだけに限定しないでください。

そうは言っても、OOPでの演習が必要な場合は、パターンを探してください。たとえば、戦略パターンは、複数の情報源に適したソリューションである可能性があります。OOPをよりよく理解したい人には、 GoFパターンの本を強くお勧めします。基本的なプログラミングを超えたい人は、IMHOを読む必要があります。

オブジェクトを発見するための古典的なアプローチは、問題のある空間で名詞を探し始め、それらをオブジェクトにすることです:movie、feed、imdb、tmdb。次に、各オブジェクトにどの属性と機能を関連付ける必要があるかを考え始めます(類推を続けたい場合は形容詞と動詞)。imdbやtmdbの場合のように、共通の機能が表示され始めたら、共通の基本クラスであるmdbを検討することをお勧めします。次のステップは、オブジェクト間の関係を確認することです。私は視覚的な人間なので、関係を理解するのに役立つクラス図を常に作成しています。この手法の詳細については、CRCカードと責任駆動設計を参照しください

一般的なパターン、それらがどのように機能し、どこに適用されるかについての基本的な実用的な知識がある場合は、オブジェクトのパターンに気付くようになります。そうでない場合でも、この手法は有用なOOシステムの構築に役立ちます。リスクは、車輪の再発明をしたり、後で多くの時間を節約できる何かを見逃したりする可能性があることです。

于 2012-07-16T15:34:12.230 に答える
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
于 2012-07-17T01:20:02.810 に答える
0

モデル/永続データとそれらの間の関係を追跡および設定するために、SQLAlchemy のような ORM を使用してみてください。これは、典型的な Web アプリで実行できる主な OOP 処理です。

ただし、OOP のためだけに OOP を実行しないでください。別の良い方法は、コード/ロジックが重複している場所を見つけて、1 つの場所にリファクタリングすることです。各クラスを分離し、他のクラスがどのように実装されているかを把握しないようにしてください。パブリック API とコントラクトの観点から物事を考えてください。これは通常、OOP 設計につながります。

于 2012-07-16T10:32:07.847 に答える