【发布时间】:2015-08-22 13:07:16
【问题描述】:
对于我的应用程序,我需要使用两种略有不同的算法来持久化实体:
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() 方法的类的子类中实现,它可以访问或不访问异常对象,具体取决于实现。
我应该选择其中一种方法来处理代码重复吗?哪一个更好?您有更好的解决方案吗?
【问题讨论】:
-
考虑在 CodeReview 上提问。这是一个基于意见的问题,可能会被关闭。
-
@BartoszKP,我已经做到了:codereview.stackexchange.com/questions/101651/…
标签: python oop dry anonymous-function code-duplication