Before I ask my question, I'm aware of Eric Lippert's Wizard and Warrior series.
I'm trying to understand GRASP, but I'm having a hard time determining if this class violates GRASP.
Suppose if I had the following
class Character(ABC): def __init__(self, name, strength, attributes): self._name = name self._strength = strength self._attributes = attributes self._inventory =  self._found_attributes =  self._cannot_equip = False self._equipped = True def add(self, game_object): self._inventory.append(game_object) # I may obviously want to do more checks, such as required strength, # if I currently have another weapon equipped, etc.. def try_equip(self, game_object): if self._check_for_conflicting_attributes(game_object): return self._cannot_equip return self._equipped def _check_for_conflicting_attributes(self, game_object): for attrib in self._attributes: if game_object.contains_attribute(attrib): self._found_attributes.append(attrib) return len(self._found_attributes) > 0
class GameWeapon(ABC): # imports and other methods left out. def __init__(self, name, required_strength, damage, attributes): self._name = name self._required_strength = required_strength self._damage = damage self._attributes : List[Attributes] = attributes def contains_attribute(self, attribute): return attribute in self._attributes
def main(): wizard_attributes : List[Attributes] =  wizard_attributes.append(Attributes.LongBlade) wizard_attributes.append(Attributes.Reloadable) wiz = Wizard("Gandalf", 100, wizard_attributes) sword_attributes : List[Attributes] =  sword_attributes.append(Attributes.LongBlade) sword = Sword("Standard Sword", 5, 10, sword_attributes) # Will print false print(wiz.try_equip(sword)) if __name__ == "__main__": main()
Sword have attributes, for example,
Wizard might have attribute called
Sword might have
LongBlade as an attribute. Before adding a
LongBlade weapon to my character inventory, I check for specific attributes, for example, a Wizard can't use a Sword, so I check for
LongBlade and if the weapon has that attribute it will prevent that weapon from being added to the character inventory.
One topic that's always mentioned is class responsibility, if the
Character class does violate GRASP is it because it has the responsibility of checking and verifying if it could add a weapon to the player inventory?
My larger question is, how do you know when a class may be violating GRASP? What if I want the class or subclass to be responsible for check before adding a weapon or doing another task? Is it still a violation?