对此有何普遍共识:
def stock_amend(self, key, quantity):
if key == "add":
self.stock_quantity += quantity
elif key == "remove":
self.stock_quantity -= quantity
...
VS
def stock_add(self, quantity):
self.stock_quantity += quantity
def stock_remove(self, quantity):
self.stock_quantity -= quantity
...
这两个中哪一个是定义简单,类似功能的更好方法?使用关键字或只定义多个函数?
答案 0 :(得分:4)
我最习惯看到它的方式是使用类:
class Stock:
def add(self, quantity):
self.stock_quantity += quantity
def remove(self, quantity):
self.stock_quantity -= quantity
或者如果逻辑非常相似,你可以只做一个改变方法:
def stock_change(self, delta):
self.stock_quantity += delta
并将负值传递给它以实现负面更改。
有人认为你要非常小心,但确保你有一个干净的api。作为程序不同部分之间的界限,通常是程序中最难改变的部分。通常,您希望函数只执行一项操作。这称为单一责任原则。在您继续之前,谷歌“如何设计API”并阅读人们对它的看法。其中许多意见都来自于来之不易的经历。
它最终取决于你想要什么。你比我更了解你的应用程序。
我不认为自己是专家,但我确实有意见。 Mods,如果这是基于意见/没有帮助,请编辑/删除它。
如果股票是代码中相对不重要的一小部分,我可能会使用stock_change
方法(可能将其重命名为描述股票线性变化的东西,所以稍后如果你想要比如说,将股票增加10%,这也是一个“股票交易所”,你的函数名称会更少。我建议这样做的原因是因为代码较少,如果需要,可以稍后将其重构为第二种方法(假设您尚未将其分发给客户)。谷歌“YAGNI”。
如果你用股票做很多事情,最好把它变成自己的类。然后你可以将它子类化,将其他类似的“矮胖”功能分组,等等。谷歌“为什么选择OOP”。
除非你有充分的理由,否则我会避免将字符串用作API的一部分。作为API参数的字符串难以重构 - 它们已经用于用户输入和输出(可能还有其他我现在没有考虑的事情),并且很多程序员都在努力理解哪些字符串是哪些。另外,请记住任何字符串都可以传递给您的api,并且您每次都必须对其进行过滤。他们打字很弱。相反,如果你想使用大多数(全部?)字符串优势的方法,但仍然能够限制传递给你的函数的东西数量,请考虑enums。
总之,上述每种方法都有优点和缺点。可能有更多的方法我没有考虑过(我不认为自己是这方面的专家),但你知道你的问题领域最多,这次,即使你弄错了,你也会能够在下次学习它。只需继续阅读,继续重构,你就会知道什么是一个好的API和一个坏的。答案 1 :(得分:1)
有各种可能的方法,例如将函数发送到实际进行修改的stock_amend
,依此类推。
除非我们需要更高的灵活性(由#1提供)在编译时定义事物(#2)是合理的,以便更容易进行静态分析,更简单的代码审查等等。
答案 2 :(得分:0)
我可以使用运算符模块推荐第3种方法吗?
import operator
mapping = {
'add': operator.add,
'remove': operator.neg,
}
def stock_amend(self, key, quantity):
return mapping.get(key)(self.stock_quantity, quantity)
答案 3 :(得分:0)
绕过字符串是一种糟糕的模式。调用者必须记住所有可能的密钥,否则他们必须在源代码中访问其定义。你现在可能还记得这些值,但过了一段时间我们总是会忘记这些事情,任何新的代码工作也会遇到困难。使用单独的定义,大多数编辑提供的自动完成功能将为您完成工作,而在dir()
和help()
中将有所帮助。
除此之外,你可能不得不在这些功能中添加一些条件,只有一个功能会使它更加复杂。
def stock_add(self, quantity):
assert quantity > 0
self.stock_quantity += quantity
def stock_remove(self, quantity):
assert quantity > 0 and self.stock_quantity - quantity >= 0
self.stock_quantity -= quantity
如果您有多个函数执行几乎相同的操作,则可以使用私有方法编写公共逻辑。
def _update_stock_quantity(self, quantity):
self.stock_quantity += quantity
def stock_add(self, quantity):
assert quantity > 0
self._update_stock_quantity(quantity)
def stock_remove(self, quantity):
assert quantity > 0 and self.stock_quantity - quantity >= 0
self._update_stock_quantity(-quantity)
请记住代码的读取次数超过了。
答案 4 :(得分:0)
我建议定义多个函数,因为它可以保持代码清晰+简洁,从而实现更强大的代码。每个函数都应该有一个特定的任务,不应该依赖于关键字之类的东西。这样您还可以更轻松地在其他程序中重用您的功能。下面我写了一种方法来访问没有elif
和class Stock():
def __init__(self,stock_quantity):
self.stock_quantity = stock_quantity
def stock_add(self, quantity):
self.stock_quantity += quantity
def stock_remove(self, quantity):
self.stock_quantity -= quantity
def update(self,interact,quantity=0):
try:
getattr(self,interact)(quantity)
except AttributeError:
pass
except TypeError:
print(getattr(self,interact))
def main():
stock_obj = Stock(5)
stock_obj.update("stock_quantity")
stock_obj.update("stock_add",1)
stock_obj.update("stock_quantity")
if __name__ == "__main__":
main()
语句的每个函数,这样你的代码就不会重复了。
Properties > Linker > Input