Saya memiliki Character
kelas 2500 baris yang:
- Melacak status internal karakter dalam game.
- Banyak dan teruskan kondisi itu.
- Menangani ~ 30 perintah masuk (biasanya = meneruskannya ke
Game
, tetapi beberapa perintah read-only direspon dengan segera). - Menerima ~ 80 panggilan dari
Game
mengenai tindakan yang diambil dan tindakan yang relevan dari orang lain.
Tampaknya bagi saya yang Character
memiliki tanggung jawab tunggal: untuk mengelola keadaan karakter, memediasi antara perintah yang masuk dan Game.
Ada beberapa tanggung jawab lain yang telah dikerjakan:
Character
memilikiOutgoing
panggilan ke mana untuk menghasilkan pembaruan keluar untuk aplikasi klien.Character
memilikiTimer
trek mana yang selanjutnya diizinkan untuk melakukan sesuatu. Perintah yang masuk divalidasi terhadap ini.
Jadi pertanyaan saya adalah, apakah dapat diterima untuk memiliki kelas besar di bawah SRP dan prinsip serupa? Adakah praktik terbaik untuk membuatnya kurang rumit (mis. Mungkin metode pemisahan menjadi file terpisah)? Atau apakah saya kehilangan sesuatu dan apakah benar-benar ada cara yang baik untuk membaginya? Saya menyadari ini sangat subyektif dan ingin umpan balik dari orang lain.
Berikut ini contohnya:
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)
Maksud Andaself.health
benar?