【发布时间】:2021-11-28 00:29:08
【问题描述】:
我有一个带有更新方法的对象类:这个方法只是做一些检查并更新对象的属性,不返回任何内容返回一个 Bool 以确定是否应该删除它。
其中一些检查结果会阻止其他检查结果的执行: 编辑,旧代码块:
def updateObject(self):
self.checkOne()
if not self.checkTwo():
self.checkThree():
def checkTwo(self):
if self.x == condition:
self.y = different value
return True
return False
新代码块:
class MyObject():
def __init__(self, firstValueHash: int):
self.identifier # str (unused in this example)
self.isMarked # bool
# maxObserved is always greater than maxTrackedTicks
self.maxObservedTicks # int
self.maxTrackedTicks # int
self.ticksSinceUpdate # int
self.ticksSinceMarked # int
self.trackData = [None]*self.maxObservedTicks-1 # list of ints
self.trackData.append(firstValueHash)
# called externally once every 5 mins, returns True if object needs deleting, otherwise returns false
def performUpdate(self):
self.ticksSinceUpdate += 1
self.trackData = self.trackData[1:(self.maxObservedTicks-1)]
self.trackData.append(None) # some other function updates these None values
if self.ticksSinceUpdate > self.maxObservedTicks:
return True
if not self.__updateIfMarked():
self.__updateIfExpired():
return False
def __updateIfMarked(self):
if self.isMarked == True:
self.ticksSinceMarked += 1
if self.ticksSinceMarked < maxObservedTicks
return True
self.isMarked = False
self.ticksSinceMarked = 0
return False
def __updateIfExpired(self):
if self.ticksSinceUpdate >= maxTrackedTicks:
self.isMarked = None
# Other functions will update of isMarked outside of the 5 min update, by labelling it as True or False
如您所见,checkTwo updateIfMarked() 的结果通过返回一个 Bool 来确定 checkThree __updateIfExpired() 是否发生。
这写起来真的很不舒服,但这是我能想到的最清晰简洁的方式来获得我想要的行为。
这是不好的做法吗?我觉得它打破了“一个工具;一份工作”的规则。我还认为,由于过度的逻辑反转,这可能会使行为变得不清楚......
【问题讨论】:
-
“我觉得它打破了“一个工具;一份工作“规则” 为什么会这样?
checkTwo有一项工作(如果我们忽略它还会更改y的值作为副作用的事实),以决定某个条件是真还是假。恰好checkThree的执行取决于该条件。对我来说看起来非常好。 -
您的示例中没有
checkOne或checkThree函数。您的代码不是有效的 python。你能包括minimal reproducible example吗?这是否是好的做法取决于您的用例。这看起来函数调用可能是ifelse语句 -
这不是一个坏习惯!代码清晰,分区并按其意图执行。能有什么顾忌?
-
这是否不好是不可能的,因为您选择删除实际逻辑并且只是显示无意义的检查。可能是您在自己的代码中过于复杂了,或者有一种更简洁易读的方式来编写它,但是如果不看上下文就不可能说出来。
-
@Grismar 感谢您的评论,我已经更新了帖子。
标签: python if-statement methods boolean control-flow