我遇到了以多态方式将记录加载到数据库的问题。Python中的多态性和数据库加载
我:
- 一个“
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更好吗?如果是这样,为什么?
干杯, 威尔
这将提高一个问题,如果我们要对数据库类的不同实现(我们做的,其实)不同的存储过程。我不愿意将特定于数据库的信息放入记录类中。 – wrgrs 2012-07-26 21:13:07
不管你仍然必须编写新的功能,而是在一个类你将它移动到距离和OOP设计抽离的数据库类。 – sean 2012-07-27 13:18:56
@sean这是回应wilbo还是我?对我而言,您希望完整保留数据库类,而不是为每种不同的记录类型添加案例。因此,您将了解哪些存储过程可以与记录类一起使用,但需要实际实现它的数据库类。要么我们你有每个存储过程的DB子类的数量,并有记录用来获得它所需的工厂类。 – 2012-07-27 14:30:52