# [Tutor] domain logic and avoiding setters and setters.

David Driver count0.djd at gmail.com
Mon Jul 11 23:00:56 CEST 2005

```So I have been trying to figure out how to get around doing getters
and setters and still have an oo way to inherit and apply business
rules. This is what I have some up with so far. Is there any better
way?

class RuleViolationError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return 'Rule violated in rule object: %s' %self.msg

class someObject(object):
def __init__(self,a):
self._voilatedRules = {}
self._rules = [self.aRuleForA]
self.a = a

def applyRules(self):
self._voilatedRules.clear()
for rule in self._rules:
try:
rule()
except RuleViolationError, err:
self._voilatedRules[rule.__name__] = err.msg
if self._voilatedRules:
# do something dramatic to deal with all of the
print 'error(s): '
print self._voilatedRules

def aRuleForA(self):
try:
self.a = int(self.a)
except ValueError:
raise RuleViolationError('a is not an integer')

class someObjectChild(someObject):
def __init__(self, a,b):
someObject.__init__(self,a)
self.b = b
self._rules.extend((self.aRuleForB,
self.anotherRuleForB))

def aRuleForB(self):
# apply some business logic for d
# check that it starts with b, very silly
if not self.b.startswith('b'):

def anotherRuleForB(self):
#test string for length constraints
min,max,l=2,15,len(self.b)
print min,max,l
if not(l>=min and l<=max):
raise RuleViolationError('b is out of min or max')

class someObjectChild2(someObjectChild):
#j ust change one of the rules for b
def aRuleForB(self):
# apply some business logic for d
# check that it starts with d, very silly
if not self.b.startswith('d'):

x = someObjectChild(123,'bob jones')

# this should return nothing
x.applyRules()

# this should fail twice on b
x.applyRules()

y = someObjectChild2(123,'bob jones')
y.applyRules()

z = someObjectChild('happydance','bob jones')
z.applyRules()

This isn't near complete, but I think it gets the idea across.
--

***********************************
See there, that wasn't so bad.
***********************************
```