Pythonのクリヌンアヌキテクチャ段階的なデモ。 パヌト1


翻蚳者のメモ
この蚘事は翻蚳です。 リテラル翻蚳には、Wordで35 A4ペヌゞかかりたした。 5〜6぀の郚分に分割する予定です。 このトピックは、Webアプリケヌションをより良く、よりクリヌンに䜜成したい倚くのプログラマヌに圹立぀はずだず思いたす。 この蚘事は、私の目を匕いた蚘事で通垞行われたように、統合テストではなく、単䜓テストを䜿甚しおTDD方法論でWebアプリケヌションを䜜成する方法を孊びたい人にも圹立ちたす。 間違った甚語がどこかで䜿甚されおいるか、翻蚳が機械的すぎるず思われる堎合-個人のメヌルで私に曞いおください、それはほずんどGoogle翻蚳者ではありたせん。


1幎前、友人のRoberto Ciattiが 、Robert Martinがクリヌンアヌキテクチャず呌ぶ抂念を玹介したした。 ボブおじさんは䌚議でこの抂念に぀いお倚くのこずを話し、それに぀いお非垞に興味深い蚘事を曞いおいたす。 「クリヌンアヌキテクチャ」ずは、厳密なルヌルを超えお、゜フトりェアシステム、参加者のさたざたな局ず圹割に関する䞀連の合意を構成する方法です。


圌がすでに蚘事「Pure architecture」 Habréの翻蚳で述べたように、アプロヌチ自䜓のアむデアは新しいものではなく、過去3〜10幎にわたっお倚くの゜フトりェア開発者によっお掚進されおきた倚くの抂念に基づいおいたす。 最初の実装の1぀は、1992幎に公開されたIvar Jacobksonの傑䜜であるオブゞェクト指向゜フトりェア゚ンゞニアリング先行指向アプロヌチで提案されたBoundary-Control-Entityモデルにありたす。 しかし、Martinはこのアヌキテクチャの他の最新バヌゞョンもリストしおいたす。


ここで圌がすでに説明したこずを繰り返したせん圌よりも䞊手くできない、これらの抂念に慣れるためにあなたが芋るこずができるいく぀かのリ゜ヌスぞのリンクを単に投皿したす



この蚘事の目的は、クリヌンなアヌキテクチャヌを䜿甚しおれロからPythonでWebサヌビスを䜜成する方法を瀺すこずです。 この倚局蚭蚈の䞻な利点の1぀はテスト容易性であるため、TDDアプロヌチに埓っおプログラミングしたす。 このプロゞェクトはもずもず玄3時間でれロから開発されたした。 プロゞェクトのキャラクタヌの特性を考慮しお、最終コヌドを簡玠化するためにいく぀かの決定が行われたした。 これらの簡略化を指摘し、必芁に応じお説明したす。


PythonのTDDに぀いお詳しく知りたい堎合は、 このカテゎリの蚘事を読んでください。


プロゞェクトの抂芁


Rent-O-Maticプロゞェクト Tentacle Dayファンはリンクをキャッチできたすの目暙は、いく぀かの倀で蚘述されたオブゞェクトのデヌタセットの䞊に単玔な怜玢゚ンゞンを䜜成するこずです。 この怜玢゚ンゞンでは、フィルタヌを蚭定しお怜玢を絞り蟌むこずもできたす。


デヌタレコヌドは、賃貞料の保管斜蚭であり、次の倀で説明されたす。



玔粋なアヌキテクチャには、システムのさたざたな局の分離が含たれたす。 アヌキテクチャ自䜓は、4぀以䞊の実際のコヌドモゞュヌルで実装できる4぀の局で蚘述されたす。 これらのレむダヌに぀いお簡単に説明したす。


゚ンティティ


これは、ドメむンモデルが蚘述されるレベルです。 ここで、デヌタベヌスに保存されおいるデヌタに関するストレヌゞ機胜を衚すクラスを䜜成する必芁がありたす。 私の意芋では、このクラスはビゞネスプロセスの実装に必芁な情報も提䟛したす。


このレむダヌのモデルは、Djangoなどのフレヌムワヌクの通垞のモデルずは異なるこずを理解するこずが重芁です。 これらのモデルはデヌタストレヌゞシステムに関連しおいないため、これらのクラスのメ゜ッドを䜿甚しお盎接保存たたは取埗するこずはできたせん。 これらには、ビゞネスルヌルに関連するヘルパヌメ゜ッドが含たれおいたす。


シナリオ


この局には、システムに実装されたスクリプトが含たれおいたす。 この単玔な䟋では、指定されたフィルタヌに埓っおストレヌゞ斜蚭のリストが衚瀺されるシナリオは1぀だけです。 ここにスクリプトを配眮しお、倉庫に関する詳现情報、たたは倉庫の予玄、商品の充填など、その他の必芁なビゞネスプロセスを衚瀺するこずもできたす。


むンタヌフェヌスアダプタヌ


この局は、ビゞネスロゞックず倖郚システムの境界に察応し、それらずデヌタを亀換するために䜿甚されるAPIを実装したす。 ナヌザヌむンタヌフェむスのようなストレヌゞシステムは、このレむダヌの倖郚システムであり、スクリプトずデヌタを亀換する必芁がありたす。 そしお、この局は、そのようなデヌタストリヌムのむンタヌフェむスを提䟛したす。 このプロゞェクトでは、倖郚Webサヌビスを構築できるJSONシリアラむザヌを介しおビュヌずの通信が提䟛されたす。 ストレヌゞアダプタは、さたざたなストレヌゞシステムで動䜜する共通のAPIを蚘述したす。


倖郚むンタヌフェヌス


アヌキテクチャのこの郚分は、前の局で定矩されたむンタヌフェヌスを実装する倖郚システムで構成されおいたす。 ここでは、たずえば、JSONシリアラむザヌを介しおスクリプトの䞀郚ずしおデヌタにアクセスするREST゚ントリポむントを実装するWebサヌバヌを芋぀けるこずができたす。 たずえば、MongoDB甚のストレヌゞ実装もありたす。


APIずシェヌド


クリヌンなアヌキテクチャでは、APIずいう蚀葉は重芁です。 各レむダヌには、 ゚ントリポむント メ゜ッドたたはオブゞェクトの固定セットであるAPIを䜿甚しおアクセスできたす。 「修正枈み」ずは、「各実装で同じ」こずを意味したす。明らかに、APIは時間ずずもに倉化する可胜性がありたす。 各プレれンテヌション方法は同じシナリオず同じ方法を参照しお、この特定のシナリオから生じるドメむンモデルを取埗したす。 これらはプレれンテヌション局に移動し、このデヌタは、HTML、PDF、画像などの情報の特定の衚珟に埓っおフォヌマットされたす。 拡匵ベヌスのアヌキテクチャを理解しおいる堎合は、分割されたAPI駆動型コンポヌネントたたはレむダヌの基本抂念を既に理解しおいる必芁がありたす。


同じ抂念がストレヌゞレむダヌにも圓おはたりたす。 各ストレヌゞ実装は同じメ゜ッドを提䟛する必芁がありたす。 スクリプトを扱う堎合、どのストレヌゞシステムが䜿甚されおいるかを考える必芁はありたせん。ロヌカルのMongoDB、クラりドストレヌゞシステム、たたは簡単なむンメモリテヌブルなどです。


レむダヌ間の分離、および各レむダヌのコンテンツは、垞に倉曎されたたたであるずは限りたせん。 適切に蚭蚈されたシステムは、パフォヌマンスやその他の特定の芁件などの問題に察凊する必芁がありたす。 アヌキテクチャを蚭蚈するずき、䜕を、どこで、なぜ知っおいるこずが重芁です。 ルヌルを自分で「埮調敎」する時期を知るこずは特に重芁です。 すべおの質問に明確に「黒」たたは「癜」で回答できるわけではありたせん。 倚くの決定は「灰色の圱」です。぀たり、䜕を、なぜ、どこに眮くべきかを自分で決めなければなりたせん。


しかし、䞻なこずは、玔粋なアヌキテクチャの構造を混乱させるこずではありたせん。 特に、 デヌタフロヌの問題で揺るぎないようにする必芁がありたすRobert Martinの蚘事の「境界線を越える」セクションを参照。 デヌタフロヌを䞭断するず、構造党䜓が砎壊されたす。 繰り返したすが、デヌタの流れを䞭断しないでください。 デヌタフロヌ違反の䟋は、このクラスを衚すのではなく、䜕らかのスクリプトによるPythonクラスの発行ですたずえば、JSON文字列ずしお。


プロゞェクト構造


プロゞェクトの構造を芋おみたしょう。


Cookiecutterを䜿甚しおプロゞェクト構造を構築したした。 この郚分を流walkに説明したす。 rentomaticカタログには、次のサブディレクトリが含たれおいたす。



これらのディレクトリは、前のセクションで瀺した階局構造ず、テストを簡単に芋぀けられるように䜜成されたテストディレクトリの構造を反映しおいたす。


゜ヌスコヌド


このGitHubリポゞトリで゜ヌスコヌドを芋぀けるこずができたす 。 圌から分岐し、実隓し、倉曎し、この蚘事で説明する問題を解決するためのより成功する方法を探しおください。 ゜ヌスコヌドにはタグ付きのコミットが含たれおいたす。これにより、蚘事で説明されおいる䜜成プロセスをたどるこずができたす。 ラベル<Gitタグタグ >は、蚘事自䜓の芋出しの䞋に配眮されたす。 ラベルは、GitHubのタグを持぀コミットぞのリンクです。これにより、githubに移動しお、コヌドを耇補せずにコヌドを確認できたす。


プロゞェクトの初期化


Gitタグ Step01


曎新 この cookiecutter パッケヌゞは、このセクションずたったく同じ環境を䜜成したす。 次の説明では、䟝存関係ず構成を管理する方法を説明し、このツヌルを詳しく調べたす。次のプロゞェクトで䜿甚する可胜性がありたす。


通垞、プロゞェクト内にPython仮想環境をデプロむするのが奜きなので、䞀時的な仮想環境を䜜成しお、Cookiecutterを蚭定し、プロゞェクトを䜜成しお、virtualenvを削陀したす。 cookiecutterは、初期ファむル構造を提䟛するために、あなたずプロゞェクトに぀いおいく぀か質問をしたす。 独自のテスト環境を䜜成するので、 use_pytest 「no」ず蚀う方が良いでしょう。 これはデモプロゞェクトであり、公開する必芁がないため、 use_pypi_deployment_with_travisにuse_pypi_deployment_with_travis 「no」ず回答できたす。 プロゞェクトにはコマンドラむンむンタヌフェむスがありたせん。䜜成者ファむルを安党に䜜成し、ラむセンスを䜿甚できたす。


 virtualenv venv3 -p python3 source venv3/bin/activate pip install cookiecutter cookiecutter https://github.com/audreyr/cookiecutter-pypackage 

質問に答えおから、次のコヌドを䜿甚しおプロゞェクトを完了したす


 deactivate rm -fR venv3 cd rentomatic virtualenv venv3 -p python3 source venv3/bin/activate 

Cookiecutterが䜜成したrequirements_dev.txtファむルを取り陀きたす。 私は通垞、virtualenvの䟝存関係を異なる階局ファむルに保存しお、本番環境、開発環境、およびテスト環境を分離するため、 requirementsディレクトリず察応するファむルを䜜成したしょう。


 mkdir requirements touch requirements/prod.txt touch requirements/dev.txt touch requirements/test.txt 

test.txtファむルには、プロゞェクトのテストに䜿甚される特定のパッケヌゞが含たれたす。 プロゞェクトをテストするには、開発環境甚のパッケヌゞをむンストヌルする必芁があるため、ファむルに開発の䟝存関係を含める必芁がありたす。


 -r prod.txt pytest tox coverage pytest-cov 

dev.txtファむルには、開発プロセス䞭に䜿甚されるパッケヌゞず、テストおよび本番甚のむンストヌルパッケヌゞが含たれたす。


 -r test.txt pip wheel flake8 Sphinx 

 test.txtすでにprod.txt含たれおいるずいう事実を利甚しおいたす。


最埌の基本的なrequirements.txtファむルは、単にrequirements/prod.txtむンポヌトしrequirements/prod.txt


 -r prod.txt 

明らかに、ニヌズや奜みに最適なプロゞェクト構造を芋぀けるこずができたす。 この構造はこのプロゞェクトに適しおいたすが、次のすべおのプロゞェクトで䜿甚するこずを匷制しおいるわけではありたせん。


この分離により、コンピュヌタヌに本栌的な開発環境をむンストヌルし、Travisなどのテスト環境にテストツヌルのみをむンストヌルし、実皌働環境ぞのむンストヌルの䟝存関係の数を枛らすこずができたす。


ご芧のずおり、䟝存ファむルではタグバヌゞョンを䜿甚しおいたせん。 これは、このプロゞェクトが運甚環境で起動されないため、環境を凍結できないためです。


virtualenv内に開発䟝存関係をむンストヌルするこずを忘れないでください


 $ pip install -r requirements/dev.txt 

さたざたな構成


pytestテストpytest構成する必芁がありたす。 これは、 pytest.iniファむルを介しお行われたす。このファむルは、ルヌトディレクトリsetup.pyファむルがある堎所に䜜成できたす。


 [pytest] minversion = 2.0 norecursedirs = .git .tox venv* requirements* python_files = test*.py 

プロゞェクト開発䞭にテストを実行するには、単に実行したす


 $ py.test -sv 

カバレッゞを確認する堎合、぀たり テストによっお実行されるコヌドの量、実行


 $ py.test --cov-report term-missing --cov=rentomatic 

テストカバレッゞの詳现に぀いおは、 Coverage.pyおよびpytest-covパッケヌゞの公匏ドキュメントをご芧ください 。


flake8パッケヌゞを䜿甚しお、 PEP8ずの互換性に぀いおPythonコヌドをテストするこずを匷くお勧めしたす。 setup.cfgファむルに配眮する必芁があるflake8蚭定は次のsetup.cfgです。


 [flake8] ignore = D203 exclude = .git, venv*, docs max-complexity = 10 

コヌドがPEP8暙準に準拠しおいるこずを確認するには、次を実行したす。


 $ flake8 

Flake8のドキュメントはこちらから入手できたす 。


この投皿の各ステップは、100のコヌドテストずカバレッゞを䜜成するこずに泚意しおください。 クリヌンアヌキテクチャの利点の1぀は、レむダヌ間の分離であり、これにより、より高いテスト可胜性が保蚌されたす。 ただし、このチュヌトリアル、特にRESTセクションでは、アヌキテクチャの簡単な説明のために䞀郚のテストが省略されるこずに泚意しおください。


パヌト2に続きたす。



Source: https://habr.com/ru/post/J319126/


All Articles