3

長年のリスナー、初めての発信者。

高レベルの設計に関する質問がありますが、これは一般的すぎるかもしれませんが、ここで説明します。現在、適切なサイズのモジュールのセットを作成しました。モジュールを呼び出す長いスクリプトを作成して使用します。これをよりインタラクティブにするためにリファクタリングする必要があります。長いスクリプトに依存するのではなく、関数を呼び出してシェルからオブジェクトインスタンスを変更する必要があります。

問題:すべてのモジュール間およびシェルとオブジェクトインスタンスを共有する必要があります。

現在、オブジェクトインスタンスの初期化を含むモジュールを作成したばかりで、他のすべてのモジュールはこの「ワークスペース」モジュールから共有インスタンスをインポートします。これを行うにはもっとエレガントな方法があるはずだと思います。助言がありますか?

PSもともとはオブジェクトメソッドを使用していましたが、実際のプログラマー(私は機械的な男です)と話し合った後、オブジェクトを属性のコンテナーとしてのみ使用し、メソッドを個別に分割するようにアドバイスしました。

編集:複数のインスタンスを含み、無関係なフォルダー/ファイルを削除するようにサンプルコードを変更しました。

注:オブジェクトメソッドと個別メソッドの質問は興味深いものですが、ここでの主な質問は、モジュールおよびシェルからのインスタンスへのアクセスです。


簡単な一般化された例を試してください。

(免責事項:これはナンセンスなコードであり、私が解決しようとしている問題のタイプを一般的に示しようとしています。つまり、メソッドの呼び出しとシェルからの属性の直接変更の両方によってオブジェクトインスタンスを変更します。)

===== folder structure =====

dev/init.py
dev/bike.py
dev/car.py
dev/workspace.py

===== init.py ======

from workspace import *
import bike
import car

===== workspace.py =====

class Bike:
    pass

class Car:
    pass

b = [Bike(), Bike()]
c = Car()

===== bike.py =====

from workspace import *

def start():
   b[0].x = 6
   b[1].x = 9

def move():
   b[0].x += 1
   b[1].x += 1.2

def distance():
    print(b[0].x-c.x)

===== car.py =====

from workspace import *

def start():
   c.x = 0

def move():
   c.x += 2

def brake(bike_instance):
    if bike_instance.x - c.x < 2:
        c.x = 0

使用例:

$ python init.py -i
>>> bike.start()
>>> car.start()
>>> bike.move()
>>> car.move()
>>> car.move()
>>> car.move()
>>> bike.distance()
>>> car.brake(b[0])
>>> car.brake(b[1])
>>> c.x = 5
4

1 に答える 1