【发布时间】:2011-11-27 03:49:29
【问题描述】:
我有以下测试
def test_employees_not_arround_for_more_than_3_rounds(self):
self.game_object.generate_workers()
people_in_list_turn_1 = self.game_object.employees[:]
self.game_object.next_turn()
self.game_object.generate_workers()
self.game_object.next_turn()
self.game_object.generate_workers()
self.game_object.next_turn()
for employee in people_in_list_turn_1:
self.assertFalse(employee in self.game_object.employees)
基本上,它会生成随机数量的工人并将其添加到我的game_object.employees 列表中。
当我调用game_object.next_turn 函数时,每个员工都有一个turns_unemployed 变量来保存他们失业的轮数,一旦达到3,该工人将完全从game_object.employees 列表中删除。
下面是game_object.py的实现代码:
def generate_workers(self):
workersToAdd = range(random.randrange(1,8))
for i in workersToAdd:
self.__employees.append(Employee())
def next_turn(self):
self.__current_turn += 1
self.__call_employees_turn_function()
self.__remove_workers_unemployed_for_3_rounds()
def __call_employees_turn_function(self):
for employee in self.employees:
employee.turn()
def __remove_workers_unemployed_for_3_rounds(self):
for employee in self.employees:
if employee.turns_unemployed >= 3:
self.employees.remove(employee)
我已经有一个测试可以检查 turns_unemployed 变量在调用 employee.turn() 时实际上增加了 1,所以我知道它有效...
真正让我烦恼的是,我的测试只在我运行它的 50% 的时间里有效,我不知道为什么......有人看到任何可能导致任何差异的东西吗?
顺便说一句,运行 Python 3.2.2
【问题讨论】:
-
拼写:
arround->around -
从代码清晰的角度来看,我建议您将
__call_employees_turn_function和__remove_workers_unemployed_for_3_rounds内联到next_turn。他们都很矮。只需输入描述性评论,例如# remove workers unemployed for 3 rounds。 -
另外,
__remove_workers_unemployed_for_3_rounds是非常特定的。如果您稍后更改规则,让失业工人停留四轮怎么办?我认为在这种情况下最好使用一个不太具体(和更短)的名称,如果你打算将它作为一个单独的方法。也许像remove_long_term_unemployed这样的东西。或者甚至可能是purge_tramps。 -
@DannyMilosavljevic:一点也不。代码流越简单,代码就越容易阅读。将两行和三行拆分为单独的函数会使代码更难阅读。
__call_employees_turn_function?这两行本身就是清晰的。__remove_workers_unemployed_for_3_rounds?如果你觉得特别需要 cmets,就把 cmets 放进去。但是不要在不需要的时候把它拆分成单独的方法。 (我还假设不会从其他任何地方调用这些函数。如果是的话,可能值得添加一个类似的方法。) -
@RobinHeggelundHansen:正如我所说,“如果你觉得特别需要 cmets。”我会认为发生的事情非常明显,因此可能不会将 cmets 放在那里。
标签: python python-3.x