ポリモーフィックな方法でデータベースにレコードをロードする際に問題が発生しました。
私は持っています:
- さまざまなタイプのレコードによって拡張された'
Record
'オブジェクト(RecordA
、RecordB
) load_record()
ロードしているレコードのタイプがわからないメソッド- データベースに関するすべての情報を含む必要があるデータベースインターフェイス
私が理解しているように、多形的に私は次のことができます。
class RecordA(Record):
def load_into_db(self, db_impl):
db_impl.load_record_a(self)
class DbImpl(DbInt):
def load_record_a(self, record):
...
def load_record_b(self, record):
...
def load_record(record):
record.load_into_db(db_impl)
また
class RecordA(Record):
def get_record_data(self):
....
def get_db_proc(self, db_impl):
return db_impl.get_record_a_proc()
class DbImpl(DbInt):
def get_record_a_proc(self):
...
def load_record(record):
record_data = record.get_data()
db_proc = record.get_db_proc(db_impl)
db_impl.load_record(record_data, db_proc)
これらは両方とも少し不格好なようです。または、switchステートメントを効果的に使用することもできます。
class DbImpl(DbInt):
procs = { RecordA: ..., RecordB: ...}
...
def load_record(record):
data = record.get_data()
db_proc = procs[type(record)]
db_impl.load_record(record_data, db_proc)
おそらく今では明らかなように、問題は、データベースが特定のストアドプロシージャ(独自のコードに含まれている)を使用する必要があるが、レコード自体に問い合わせずにどちらを使用するかがわからないことです。
例1は私には最も多形に見えますがDbImpl
、新しいタイプのレコードを追加するたびにコードを編集する必要があるので、例3よりも優れていますか?もしそうなら、なぜですか?
乾杯、ウィル