在Python MakeCode Maqueen机器人中实现OOP的方式是否存在问题?
Maqueen BattleBot的OOP实现问题分析
我和朋友正在开展一项学校项目,需用Maqueen制作一台“BattleBot”。借此机会向编程经验较少的朋友传授OOP知识,因此尝试将机器人以类的形式实现。已测试确认Maqueen支持类的使用且功能正常,以下是代码的最小可复现示例:
class Battlebot: def __init__(self): pass # Bob and Weave def bob_weave(self): rand_itterations = randint(2,7) for i in range(rand_itterations): # Generate Random Values turn_speed = randint(20,100) turn_time = randint(50,500) move_speed = randint(50,100) move_time = randint(50,500) # Turn maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, turn_speed) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CCW, turn_speed) basic.pause(turn_time) maqueen.motor_stop(maqueen.Motors.ALL) # Move maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, move_speed) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, move_speed) basic.pause(move_time) maqueen.motor_stop(maqueen.Motors.ALL) fwire_immigrant = Battlebot() def on_forever(): fwire_immigrant.bob_weave() basic.forever(on_forever)
我们使用的是MakeCode网站,当前的OOP实现能正常运行,但没有发挥OOP的核心价值,存在这些可以优化的问题:
- 未封装机器人专属状态:当前
Battlebot类没有任何实例属性,所有操作直接调用全局的maqueen对象,相当于把普通函数塞进了类里,完全没体现OOP的封装特性。比如可以把速度范围、循环次数这些机器人的专属配置封装成实例属性,后续调整参数不用修改方法内部代码,也能让不同Battlebot实例拥有不同行为。 - 依赖全局对象,耦合度过高:方法里直接依赖全局的
maqueen,如果后续要做模拟测试、更换硬件,根本没法替换依赖。正确的做法是在__init__里把maqueen作为参数注入进来,让类只依赖传入的实例,独立性更强。 - 方法职责不单一:
bob_weave方法既负责生成随机参数,又控制电机转向、移动,还包含循环逻辑。应该拆分成更小的方法,比如单独的转向、移动方法,每个方法只做一件事,代码更清晰,也方便单独调试和复用。 - 缺乏可配置性:所有随机范围(比如2-7次循环、20-100的转向速度)都是硬编码在方法里的,要调整或者给不同机器人设置不同行为只能改代码。可以把这些参数作为类的初始化参数,创建实例时灵活配置。
下面是优化后的示例代码,更符合OOP设计原则:
class Battlebot: def __init__(self, maqueen_instance, min_iterations=2, max_iterations=7, min_turn_speed=20, max_turn_speed=100, min_turn_time=50, max_turn_time=500, min_move_speed=50, max_move_speed=100, min_move_time=50, max_move_time=500): self.maqueen = maqueen_instance self.min_iterations = min_iterations self.max_iterations = max_iterations self.min_turn_speed = min_turn_speed self.max_turn_speed = max_turn_speed self.min_turn_time = min_turn_time self.max_turn_time = max_turn_time self.min_move_speed = min_move_speed self.max_move_speed = max_move_speed self.min_move_time = min_move_time self.max_move_time = max_move_time def _random_turn(self): turn_speed = randint(self.min_turn_speed, self.max_turn_speed) turn_time = randint(self.min_turn_time, self.max_turn_time) self.maqueen.motor_run(self.maqueen.Motors.M1, self.maqueen.Dir.CW, turn_speed) self.maqueen.motor_run(self.maqueen.Motors.M2, self.maqueen.Dir.CCW, turn_speed) basic.pause(turn_time) self.maqueen.motor_stop(self.maqueen.Motors.ALL) def _random_move(self): move_speed = randint(self.min_move_speed, self.max_move_speed) move_time = randint(self.min_move_time, self.max_move_time) self.maqueen.motor_run(self.maqueen.Motors.M1, self.maqueen.Dir.CW, move_speed) self.maqueen.motor_run(self.maqueen.Motors.M2, self.maqueen.Dir.CW, move_speed) basic.pause(move_time) self.maqueen.motor_stop(self.maqueen.Motors.ALL) def bob_weave(self): rand_iterations = randint(self.min_iterations, self.max_iterations) for _ in range(rand_iterations): self._random_turn() self._random_move() # 通过依赖注入创建实例 fwire_immigrant = Battlebot(maqueen) def on_forever(): fwire_immigrant.bob_weave() basic.forever(on_forever)
内容的提问来源于stack exchange,提问作者iokTM
相关产品推荐
相关产品推荐

