मेरे पास एक 2500 लाइन Character
क्लास है:
- खेल में चरित्र की आंतरिक स्थिति को ट्रैक करता है।
- भार और उस अवस्था को बनाए रखता है।
- ~ 30 आने वाली कमांड्स (आमतौर पर = उन्हें आगे की ओर देती हैं
Game
, लेकिन कुछ रीड-ओनली कमांड्स को तुरंत जवाब दिया जाता है)। - प्राप्त
Game
क्रियाओं के बारे में ~ 80 कॉल प्राप्त करता है और दूसरों के प्रासंगिक कार्य करता है।
यह मुझे लगता है कि Character
एक ही जिम्मेदारी है: चरित्र की स्थिति का प्रबंधन करने के लिए, आने वाली कमांड और गेम के बीच मध्यस्थता करना।
कुछ अन्य जिम्मेदारियां हैं जो पहले ही टूट चुकी हैं:
Character
एक हैOutgoing
जो इसे में कॉल क्लाइंट अनुप्रयोग के लिए बाहर जाने वाले अपडेट उत्पन्न करने के लिए।Character
एक हैTimer
जब यह अगले कुछ करने के लिए अनुमति दी है जो पटरियों। इसके विरुद्ध आवक आदेशों को मान्य किया जाता है।
तो मेरा सवाल यह है कि क्या एसआरपी और इसी तरह के सिद्धांतों के तहत इतना बड़ा वर्ग होना स्वीकार्य है? क्या इसे कम बोझिल बनाने के लिए कोई सर्वोत्तम अभ्यास है (जैसे। शायद अलग-अलग फ़ाइलों में विभाजित करने के तरीके)? या मैं कुछ याद कर रहा हूं और क्या वास्तव में इसे विभाजित करने का एक अच्छा तरीका है? मुझे लगता है कि यह काफी व्यक्तिपरक है और दूसरों से प्रतिक्रिया चाहेंगे।
यहाँ एक नमूना है:
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)
आपself.health
सही मतलब है?