Tôi có một Character
lớp 2500 dòng :
- Theo dõi trạng thái nội bộ của nhân vật trong trò chơi.
- Tải và tồn tại trạng thái đó.
- Xử lý ~ 30 lệnh đến (thường = chuyển tiếp chúng tới
Game
, nhưng một số lệnh chỉ đọc được phản hồi ngay lập tức). - Nhận được ~ 80 cuộc gọi từ
Game
các hành động liên quan đến nó và các hành động liên quan của người khác.
Dường như với tôi Character
có một trách nhiệm duy nhất: quản lý trạng thái của nhân vật, làm trung gian giữa các lệnh đến và Trò chơi.
Có một vài trách nhiệm khác đã bị phá vỡ:
Character
có mộtOutgoing
cái mà nó gọi vào để tạo ra các bản cập nhật gửi đi cho ứng dụng khách.Character
có một dấuTimer
vết khi nó tiếp theo được phép làm một cái gì đó. Các lệnh đến được xác nhận chống lại điều này.
Vì vậy, câu hỏi của tôi là, có thể chấp nhận có một lớp lớn như vậy theo SRP và các nguyên tắc tương tự không? Có cách thực hành tốt nhất nào để làm cho nó bớt cồng kềnh hơn (ví dụ: có thể chia các phương thức thành các tệp riêng biệt) không? Hay tôi đang thiếu một cái gì đó và thực sự có một cách tốt để chia nó ra? Tôi nhận ra điều này khá chủ quan và muốn phản hồi từ người khác.
Đây là một mẫu:
class Character(object):
def __init__(self):
self.game = None
self.health = 1000
self.successful_attacks = 0
self.points = 0
self.timer = Timer()
self.outgoing = Outgoing(self)
def load(self, db, id):
self.health, self.successful_attacks, self.points = db.load_character_data(id)
def save(self, db, id):
db.save_character_data(self, health, self.successful_attacks, self.points)
def handle_connect_to_game(self, game):
self.game.connect(self)
self.game = game
self.outgoing.send_connect_to_game(game)
def handle_attack(self, victim, attack_type):
if time.time() < self.timer.get_next_move_time():
raise Exception()
self.game.request_attack(self, victim, attack_type)
def on_attack(victim, attack_type, points):
self.points += points
self.successful_attacks += 1
self.outgoing.send_attack(self, victim, attack_type)
self.timer.add_attack(attacker=True)
def on_miss_attack(victim, attack_type):
self.missed_attacks += 1
self.outgoing.send_missed_attack()
self.timer.add_missed_attack()
def on_attacked(attacker, attack_type, damage):
self.start_defenses()
self.take_damage(damage)
self.outgoing.send_attack(attacker, self, attack_type)
self.timer.add_attack(victim=True)
def on_see_attack(attacker, victim, attack_type):
self.outgoing.send_attack(attacker, victim, attack_type)
self.timer.add_attack()
class Outgoing(object):
def __init__(self, character):
self.character = character
self.queue = []
def send_connect_to_game(game):
self._queue.append(...)
def send_attack(self, attacker, victim, attack_type):
self._queue.append(...)
class Timer(object):
def get_next_move_time(self):
return self._next_move_time
def add_attack(attacker=False, victim=False):
if attacker:
self.submit_move()
self.add_time(ATTACK_TIME)
if victim:
self.add_time(ATTACK_VICTIM_TIME)
class Game(object):
def connect(self, character):
if not self._accept_character(character):
raise Exception()
self.character_manager.add(character)
def request_attack(character, victim, attack_type):
if victim.has_immunity(attack_type):
character.on_miss_attack(victim, attack_type)
else:
points = self._calculate_points(character, victim, attack_type)
damage = self._calculate_damage(character, victim, attack_type)
character.on_attack(victim, attack_type, points)
victim.on_attacked(character, attack_type, damage)
for other in self.character_manager.get_observers(victim):
other.on_see_attack(character, victim, attack_type)
db.save_character_data(self, health, self.successful_attacks, self.points)
bạn làself.health
đúng?