是否应将具有一定数量可能结果的单个函数分解为Python中的单独函数?

时间:2015-04-16 20:05:21

标签: python function python-3.x

例如,以下功能移动 根据方向给予玩家一定数量的玩家 通过:

def move(player, direction, amount):
    if direction == 'up':
        player.y -= amount
    elif direction == 'down':
        player.y += amount
    elif direction == 'left':
        player.x -= amount
    elif direction == 'right':
        player.x += amount

不应该将方向作为字符串传递,而应该 该功能可分为四个较小的功能?

def move_up(player, amount):
    player.y -= amount

def move_down(player, amount):
    player.y += amount

def move_left(player, amount):
    player.x -= amount

def move_right(player, amount):
    player.x += amount

4 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

def move(player, x, y):
    player.x += x
    player.y += y

如果玩家向左或向上移动,则相应的参数为负数。如果玩家不在给定轴上移动,则相应的参数为零。此外,这样可以更轻松地添加对角线移动,而无需添加更多move()调用和方向检查。

答案 1 :(得分:1)

我说它主要是偏好。在代码较大的情况下,分离方法是有意义的。让我们说你有相同的移动功能,除了它内部你有一些寻路,摩擦和其他程序。此时,您可能会因为在一个函数中包含所有可能的结果而导致性能损失。更糟糕的是你会得到令人困惑的代码。它变得杂乱无章,难以阅读。

就你个人而言,我个人有一个功能来控制所有可能的结果。我觉得最好让你的代码更简洁。我个人也觉得方法可以处理更多场景而不是有更多方法来处理更多场景更好(只要你不会失去很多性能)。希望它有所帮助。

答案 2 :(得分:0)

这是一个偏好的问题,实际上你可以用列表的索引来完成相同的结果:

player.x += [-1, 1, 0, 0][['left', 'right', 'up', 'down'].index(direction)] * amount
player.y += [0, 0, -1, 1][['left', 'right', 'up', 'down'].index(direction)] * amount

答案 3 :(得分:0)

正如业界巨头所说,如Martin Fowler,Kent Beck,Eric Gamma,Robert C. Martin以及其他每位经验丰富的程序员:

每个功能或方法应该只做一件事。 功能越小越好。

在你的情况下,它真的不重要,因为代码量很小,但在现实世界的应用程序中它会产生很大的不同。

我几乎不建议你至少考虑重构'由M.Fowler撰写,'清洁代码'作者:R.C.Martin;像这样的书你可以谷歌没有问题,你会发现为什么保持功能较小真的更好。

或者您可以按照上述人员的建议,花费数年时间编写草率的代码,并最终弄清楚为什么最好保持方法的紧密。