对于我的应用程序,我需要使用两种略有不同的算法来持久化实体:
def persistRandomAlias(self, alias):
self.em.persist(alias)
try:
self.em.flush()
except DBALException as e:
if e.previous.code != 23000:
raise e
self.reloadEM()
self.persistRandomAlias(alias)
def persistCustomAlias(self, alias):
self.em.persist(alias)
try:
self.em.flush()
except DBALException as e:
if e.previous.code != 23000:
raise e
self.reloadEM()
existing = self.findByNaturalKey(alias.name)
if existing != alias:
raise DuplicateNameException('The requested name is already taken', e)
它们之间的区别在于负责异常处理的代码的一部分。我考虑将公共代码放在一个方法中,其余的操作在一个接受异常对象的函数中传递,如下所示:
def persistAlias(self, alias, exHandler):
self.em.persist(alias)
try:
self.em.flush()
except DBALException as e:
if e.previous.code != 23000:
raise e
self.reloadEM()
exHandler(e)
def persistRandomAlias(self, alias):
self.persistAlias(alias, lambda e: self.persistRandomAlias(alias))
def persistCustomAlias(self, alias):
def exHandler(e):
existing = self.findByNaturalKey(alias.name)
if existing != alias:
raise DuplicateNameException('The requested name is already taken', e)
self.persistAlias(alias, exHandler)
但是,我不确定将未使用的参数传递给函数是否正确。
我还考虑过将公共代码重构为抽象方法对象类,如下所示:
def execute(self):
self.em.persist(alias)
try:
self.em.flush()
except DBALException as e:
if e.previous.code != 23000:
raise e
self.reloadEM()
self.e = e
self.handleE()
handleE()将在实现execute()方法的类的子类中实现,它可以访问异常对象,具体取决于实现。
我应该选择其中一个想法来处理代码重复吗?哪一个更好?你建议一个更好的解决方案吗?