[Tutor] Here's something to talk about
Weidner, Ronald
RWeidner at ea.com
Wed Apr 15 17:29:30 CEST 2009
# This code is posted for the purpose of conversation. If it is of some
# value to someone that would be great. But what I hope is that the code
# sparks conversations about what I did in this code and why I did it. Since
# the list seems thick with OOP questions at the moment, I thought this might
# be relevant. Digest and enjoy.
class Item ( object ):
def __init__( self ):
self._FullName = ''
self._Recovery = 0
self._Exporter = SimpleItemExporter ();
def SetFullName( self, name ):
self._FullName = name
def SetRecovery( self, value ):
self._Recovery = value
def SetExporter( self, exporter ):
self._Exporter = exporter
def Export( self ):
properties = { 'FullName':self._FullName, 'Recovery':self._Recovery }
self._Exporter.Export( properties )
class ItemCollection( object ):
def __init__( self ):
self._ItemList = []
self._CollectionIndex = -1
self._Loader = None
def Add ( self, item ):
self._ItemList.append(item)
def MoveFirst ( self ):
self._CollectionIndex = -1
def MoveNext ( self ):
self._CollectionIndex += 1
if self._CollectionIndex < ( len ( self._ItemList ) ):
return self._ItemList[ self._CollectionIndex ]
return None
def MoveTo ( self, index ):
pass
def GetLength ( self ):
pass
def SetCollectionLoader ( self, loader ):
self._Loader = loader
def Load ( self ):
if self._Loader <> None:
self._Loader.LoadCollection(self)
class SimpleItemExporter ( object ):
def __init__( self ):
pass
def Export ( self, dictionary ):
print "The recovery status of " +str(dictionary['FullName'])+ " is: " + str(dictionary['Recovery'])
class XMLExporter ( object ):
def __init__ ( self, tag='XML' ):
self.SetRootTag( tag )
def SetRootTag ( self, tag ):
self._RootTag = tag;
def Export ( self, dictionary ):
xml = ""
keys = dictionary.keys()
for key in keys:
xml = xml + "\n\t<" + key + ">" + str(dictionary[key]) + "</" + key + ">"
print "<" + self._RootTag + ">" + xml + "\n</" + self._RootTag + ">"
class SQLExporter ( object ):
def __init__ ( self, tableName):
self._TableName = tableName
def Export ( self, dictionary ):
value = ""
field = ""
first = 1
keys = dictionary.keys()
for key in keys:
if first <> 1:
field = field + ", "
value = value + ", "
field = field + " " + key
value = value + "'" + str(dictionary[key]) + "'"
first = 0
print "INSERT into " + self._TableName + " (" + field + ") values (" + value + ")"
class ItemCollectionLoader ( object ):
def LoadCollection(self, collection):
for i in range ( 1, 5 ):
item = Item()
item.SetFullName( 'Ron The Dude' )
item.SetRecovery( i )
collection.Add( item )
more = 1
collection = ItemCollection()
# here we create a loader obbject
loader = ItemCollectionLoader()
# this loader object could do other things instead of the contrived example
# shown here. Such as the loader object could read from a file, or a network
# resource, stdin, whatever. As long as it's LoadCollection interface doesn't
# change the object could be many things. I've decided to illustrate this concept
# later in the code with the exporter object.
collection.SetCollectionLoader(loader)
collection.Load()
collection.MoveFirst
while more <> None:
item = collection.MoveNext ()
if item <> None:
# What's important here to note is that the exporter may have different
# constructors but, the Export method takes the same arguments in each
# export class. In other words, it's interface is the same. So, we
# can easily switch one exporter object for another. With a little more
# code you could even export these items in more than one format (if needed).
#exporter = SimpleItemExporter()
#exporter = XMLExporter("item")
exporter = SQLExporter("itemTable")
item.SetExporter(exporter)
item.Export ()
else:
more = None
More information about the Tutor
mailing list