refactoring so that multiple changes can be made with one variable?

James Stroud jstroud at mbi.ucla.edu
Tue Nov 14 19:03:34 EST 2006


John Salerno wrote:
> My code is below. For now I'm focusing on the lines where health (and 
> armor) are increased in each character class. Let's say I decided to 
> change the amount of increase in the future. As it is now, I'd have to 
> go to each character class and change the number so that each is still 
> in a good relation to the other (right now: 3, 2, 1; later: perhaps 4, 
> 3, 2, 1, if I added a new class -- i.e., change Fighter from 3 to 4, 
> Thief from 2 to 3, in other words increase them all by 1). So instead of 
> changing each one, is there a simple, clean way of just changing a 
> single number so that this change is reflected in all classes? Hope that 
> makes sense.
> 
> 
> 
> class Character(object):
>     def __init__(self, name, strength, dexterity, intelligence):
>         self.name = name
>         self.health = 10
>         self.armor = self.attack = self.defense = self.magic_attack = \
>             self.magic_defense = 0
>         self.strength = strength
>         self.dexterity = dexterity
>         self.intelligence = intelligence
>         self.adjust_attributes()
> 
>     def adjust_attributes(self):
>         pass
> 
> 
> class Fighter(Character):
>     def adjust_attributes(self):
>         self.health += 3
>         self.armor += 3
>         self.attack += 2
>         self.defense += 2
>         self.strength += 1
> 
> 
> class Thief(Character):
>     def adjust_attributes(self):
>         self.health += 2
>         self.armor += 2
>         self.attack += 1
>         self.defense += 1
>         self.magic_defense += 1
>         self.dexterity += 1
> 
> 
> class Mage(Character):
>     def adjust_attributes(self):
>         self.health += 1
>         self.armor += 1
>         self.magic_attack += 2
>         self.magic_defense += 2
>         self.intelligence += 1

The place to do this seems to be in the Character class.

class Character(object):
     _health_base_inc = 1
     _armor_base_inc = 1
     # etc
     def __init__(self, name, strength, dexterity, intelligence):
         self.name = name
         self.health = 10
         self.armor = self.attack = self.defense = self.magic_attack = \
             self.magic_defense = 0
         self.strength = strength
         self.dexterity = dexterity
         self.intelligence = intelligence
         self.adjust_attributes()

     def adjust_attributes(self):
         pass

class Mage(Character):
     # for symmetry with Character
     _health_char_inc = 1
     _armor_char_inc = 1
     # etc
     def adjust_attributes(self):
       self.health += self._health_char_inc + self_health_base_inc
       self.armor += self._armor_char_inc + self._armor_base_inc
       # etc

James

-- 
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095

http://www.jamesstroud.com/



More information about the Python-list mailing list