私はいくつかのクラスを持つPythonアプリケーションを作成しました。それらの1つが次のようなものだったとしましょう(過度に単純化されていますが、機能のタイプを表現しようとしました):
class PythonXyz(object):
def __init__(self):
self.x = []
self.y = []
self.z = []
def append(self, x, y):
self.x.append(x)
self.y.append(y)
def get_x(self):
return self.x
def get_y(self):
return self.y
def get_z(self):
return self.x + self.y
def size(self):
return len(self.x)
def dump(self):
#generate some output
def do_some_complex_stuff(self, q):
#lots of calculations and manipulation of the self.x and self.y lists.
def save(self, filename):
#some code that saves data to disk
def load(self, filename):
#some code that loads data from disk
アプリは動作したが使い勝手が悪かったので、ブラウザを貧乏人のGUIとして使用し、データベースの良さも利用できるように、アプリをdjangofyすることにしました。だから私は次のようなmodel.pyを作成しました:
class DjangoXyzModel(models.model):
x = models.FloatField()
y = models.FloatField()
また、PythonXYZクラスのload()メソッドとsave()メソッドを変更して、ファイルではなくデータベースを使用し、ブラウザーを介して機能するようにいくつかのビューを作成しました。
これで、3つのDjangoアプリが作成され、[編集]異なるdbスキーマ[/ edit]があり、それぞれにいくつかのモデルクラスを含む独自のmodels.pyファイルがあり、それに加えて、元のコードが別のフォルダーにあります。これはすべて非常に厄介になっていると感じており、すべてのPythonXyzメソッドをDjangoXyzModelクラスに完全に統合する方がはるかにクリーンな設計になると思いました。たとえば、次のようになります。
class DjangoXyzModel(models.model):
x_db = models.FloatField()
y_db = models.FloatField()
def init_lists(self):
self.x = []
self.y = []
self.z = []
def append(self, x, y):
self.x.append(x)
self.y.append(y)
def get_x(self):
return self.x
def get_y(self):
return self.y
def get_z(self):
return self.x + self.y
def size(self):
return len(self.x)
def dump(self):
#generate some output
def do_some_complex_stuff(self, q):
#lots of calculations and manipulation of the self.x and self.y lists.
def save_to_db(self):
#some code that saves x,y lists to the database
def load_from_db(self, filename):
#some code that loads x,y lists from the database
私の質問は、このアプローチはDjangoモデルクラスの「汚染」と見なされるのでしょうか、それともこれは大丈夫で個人的な好みの問題なのか、それともモデルクラスがどのように使用されるのかということです。これが推奨されていない、または眉をひそめている場合、クラスの重複に対処するためのより良い方法は何でしょうか?
リストをまとめて削除し、データベースから直接作業するための明白な(?)ソリューションは受け入れられないことに注意してください。これは、より迅速にアクセスするためにメモリ内のリストが必要だからです。たとえば、リストはデータベースからメモリに1回ロードされ、数百回または数千回アクセスされます。各リストは1000を超えるアイテムである可能性があるため、値が必要な場合は、一括読み取り/書き込みは個別アクセスよりもはるかに高速です(多くの場合、順次ではありません)。さらに、多くの場合、データは最終的にデータベースにコミットされる前に数回変更されます。