Então vamos... #vamos_fritar_código!
RPG no console é o básico. O código cumpre sua função, mas está escrito de forma que qualquer tentativa de escalá-lo causará MUITA DOR. Vamos analisar os problemas mais importantes 👇
1️⃣ Herança Ctrl+C, Ctrl+V
Observe a hierarquia de armaduras:
class Armor(Item):
def __init__(self, name, category, strength=None, value_strength=None...): # e mais 100500 argumentos
super().__init__(name, category)
# ...
class Helmet(Armor):
def __init__(self, ...):
super().__init__(...)
class Chestplate(Armor):
# Cópia de Helmet
class Greaves(Armor):
# Cópia de ChestplateTodas essas classes (
Helmet, Chestplate, Greaves, Boots) são absolutamente idênticas. Elas não adicionam novos atributos nem novos comportamentos. Elas não fazem nada além de chamar super().__init__. POO não foi criada para descrever cada objeto físico do mundo com uma classe separada. Se as entidades diferem apenas pelo nome da categoria, deve ser uma única classe
Armor com um atributo slot_type (idealmente via Enum). 2️⃣ Construtor Frankenstein
Veja como um item é criado:
crown = Helmet('Шлем Господства', 'Шлем', 'Сила', 5, 'Ловкость', 7, 'Интеллект', 3)Nunca codifique nomes de atributos na assinatura do método. Use dicionários.
Em vez dessa lista enorme de parâmetros, o item deveria receber
stats={'strength': 5, 'agility': 7, 'intellect': 3}.3️⃣ Incesto de classes
A classe
Characteristic recebe hero e depois faz isso:for item in self._hero.slots_equipment.values():
if item:
if hasattr(item, 'value_strength') and item.value_strength:
self.attributes['strength'] += item.value_strengthIsso se chama "Tight Coupling" (acoplamento forte). A classe de características invade o inventário do herói, verifica se há itens e depois tenta extrair atributos via
hasattr (que por si só é uma gambiarra em 99% dos casos). O herói deveria consultar seu próprio equipamento e passar os modificadores finais para o sistema de características. Agora é a cauda que abana o cachorro.
4️⃣ Uso de Exceções para lógica
No método
equip_armor vemos isso:try:
if key not in self.slots_equipment:
print('Нет такого слота.')
# ... lógica ...
except KeyError:
print(f'Предмет не найден')Primeiro, capturar um
KeyError genérico pode mascarar bugs reais (como um erro de digitação em um dicionário dentro do try). Segundo, exceções são para situações excepcionais, não para verificar se um item existe no inventário. Para isso existe o método .get() do dicionário.Em resumo, para começar, em vez de 10 classes de armadura inúteis e construtores monstruosos, pode-se fazer pelo menos assim:
from dataclasses import dataclass
from enum import Enum
class EquipmentSlot(Enum):
HEAD = "Шлем"
CHEST = "Нагрудник"
WEAPON = "Оружие"
@dataclass
class Equipment:
name: str
slot: EquipmentSlot
stats_bonus: dict[str, int]
# Criando um item:
crown = Equipment(
name='Шлем Господства',
slot=EquipmentSlot.HEAD,
stats_bonus={'strength': 5, 'agility': 7, 'intellect': 3}
)E pronto. Sem duplicação de código, proteção contra erros de digitação nos slots via Enum e um sistema de atributos extensível, onde amanhã você pode adicionar "Sorte" sem reescrever o
__init__ de dezenas de classes.POO não é quando você tem uma classe separada para cada entidade do universo. POO é sobre gerenciar complexidade e estado.
Mas para um mês de aprendizado, este é um estágio de evolução absolutamente normal.
📖 Leitura:
- Quando uma classe em Python é um mal: 6 casos em que você complica sua vida
- Princípios SOLID em POO com exemplos em Python
Comentários
0Ainda não há comentários.