web-dev-qa-db-ja.com

Python:オブジェクトを返すか更新する

まず、ソフトウェアエンジニアリングに不慣れで、最後の質問は終了しました。私は関連する質問をし、改善するために最善を尽くしています。私の質問に反対票を投じる場合は、なぜ私が反対票を投じているのかを説明していただければ、私が学ぶことができます。

背景:

私は新しいPython APIを開発しています。ユーザーはPOST車両のエンドポイントへの登録によってバックグラウンドチェックをリクエストできます。返されるものはエンジンのサイズ、色、以前の所有者の数、クラッシュしたかどうかなどを含む定義済みの車両オブジェクト。

私のプログラムは、メーカーに応じてさまざまなサードパーティAPIを呼び出し、その結果を組み合わせてVehicleオブジェクトを作成します。

現在のアプローチ

現時点ではコードがレイアウトされているため、リクエストは次の段階を通過します。

登録が車に属していた場合は、次のようになります。

-> view.py
-> vehicle.py 
   -> car.py
       -> ford.py
           -> ford_api.py

登録がバンに属していた場合は、次のようになります。

-> view.py
-> vehicle.py 
   -> van.py
       -> toyota.py
           -> toyota_api.py

各ファイルの目的:

view.py->入力の検証と認証を実行するレイヤー

vehicle.py-> APIを呼び出して基本的な車両の詳細を取得し、関連する車両タイプクラスにルーティングします。 car.pyvan.pybus.py

car.py->これは、車両タイプ固有のAPI呼び出しを処理します。たとえば、バスと商用車は、自動車と比較して呼び出すエンドポイントが異なります。

ford.py->関連する製造元固有の詳細を取得します。

ford-api.py->実際にfords apiに接続する呼び出しを行います。

明らかに、各ファイルでさらに多くのことが行われていますが、私は一般的なアプローチについてフィードバックを得たいと考えています。

私の質問

私には2つの懸念があり、それらが設立されたかどうかはわかりません。

(1)プログラムのレイヤーが多すぎるのではないかと心配しています。 view.pycar.pyを呼び出し、ford.pyford_api.pyを呼び出します

1つのファイルcar.pyを呼び出して応答を取得してからford.pyを呼び出し、次にford_api.pyを呼び出すほうがよいのではないかと思いますが、その結果、多くのif Elif elif Elifコードが生成されます。

このような階層化された構造化について心配する必要がありますか?

(2)APIから取得したデータを呼び出し元に戻す最も効率的な方法を見つけ出そうとしています。車両チェックを表すpythonクラスの作成を検討しています。

class VehicleCheck:
    def __init__():
        self.registration = None
        self.manufacturer = None
        etc

vehicle.pyレイヤーで受け渡します。で呼び出されるメソッドはVehicleCheckインスタンスを更新し、デフォルトのNone以外は何も返しません。したがって、チェックの最後にvehicle.pyに戻ると、VehicleCheckオブジェクトにすべての関連情報が入力されます。

メソッドはオブジェクトを更新するだけでよいことを知っていますOR何かを返すことはありません。両方ともありません。また、クラスインスタンス属性の更新はPythonでの公正なゲームですセッターはあまり関係ありません。

このアプローチは悪いと考えられていますか?異常ですか?このアプローチが以前に行われたのを見たことはありませんが、なぜだろうと思います。

2
user7692855

ここでの私の提案は、依存関係の逆転を検討する必要があることです( 依存関係逆転の原則 )。自動車は自動車メーカーを知っている車のタイプを知っているのではなく、依存関係が逆になるようにしてください。そうすることで、トヨタは自動車を知っている自動車を知っています。これを行うには、ビューが入力に基づいてToyotaクラスを直接検索できるように、サービスレジストリを構築します。

なぜこれを行うのですか?新しい製造元または新しいAPIを追加する必要があると想像してください。現在のシステムでは、ビュー、車両、車/バン/バスを変更し、最後に新しいメーカーを作成する必要があります。これは論理的には単なる変更ですが、無関係な複数のファイルに影響を与えるため、望ましくない結合です。

代わりに、依存関係を逆にする場合は、Hyundaiという新しい製造元を追加するだけで、それを登録してCarが検出できるようにすることができます。新しい車両タイプを追加する場合は、Vehicleを変更せずに航空機を追加できます。

5
Lie Ryan