আমার একটি 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
ঠিক?