[Tutor] OO re-factoring (was Pythonese/Efficiency/Generalese critique)
Javier Ruere
javier at ruere.com.ar
Wed Jun 8 07:10:21 CEST 2005
Lee Cullens wrote:
> I was thinking of extending the learning exercise by re-factoring it
> as an OO approach, since it would contain a minimum altered method.
> Being new to OOP also though, I'm confusing myself with how that
> would be best accomplished. My thinking is that class/subclass
> method instances would replace the recursive functions approach, but
> have as yet not formed the coding in my mind.
I can't imagine this either and, though I'm no OO guru, have never
considered that that an inheritance relationship could replace a
recursive function call.
> I've read a lot on OOP, but seem to have a problem with the practical
> use of such in this utility. I'm undoubtedly creating a mountain of
> an ant hill in my mind, so any thoughts would be appreciated.
I don't see any benefit from using OO in this case. Module level
functions (like you have now) are ideal in this case IMHO.
Maybe in a situation where you can benefit from OO it would be
crearer how to use it. Having state is usually a good sign. Working with
several "things" which have a behaviour would be another.
Just for fun lets do it anyway. :) Directories and files could be
considered things, files could tell if they are files, links or whatever
and directories could tell which subdirectories and files they have.
Also this objects could render themselfs to a proper string
representation we can directly output as a row.
So, in pseudocode, this would be something like:
class File:
"""File(name:str, parent:Dir)
parent: The directory which contains this File.
name: The name of this File.
"""
def __init__(self, name, parent):
self._parent = parent
self._name = name
assert exists(join(repr(parent), name))
def isLink(self):
return islink(self.path)
[Rest of the is* functions.]
def __str__(self):
return [...]
class Dir:
"""Dir(name:str, [parent:Dir])
parent: The directory which contains this File.
If omited, an absolute path is assumed.
name: The name of this File.
"""
def __init__(self, name, parent=None)
self._parent = parent
self._name = name
assert isdir(join(repr(parent), name))
def getDirs(self):
return [...]
def getFiles(self):
return [...]
Now, both classes could inherit from a FSElement (or something) but I
see no benefit in doing that.
The output functionality could also be in a different class:
class CSVOutput:
def __init__(self, filename):
[validate for overwritting]
self._out = file(filename, 'w')
def process(self, root):
for file in root.getFiles():
self._out.write(str(file))
for dir in root.getDirs():
self.process(dir)
And the main:
CVSOuput(argv[2]).process(Dir(mkAbsolutePath(argv[1])))
I'm very sleepy so this could all just be gibberish but I hope it
will help you get the idea. Ideally, functions should be very small, a
couple of lines, and object should be reusable. So moving the rendering
to CVSOutput would be better. :)
Javier
More information about the Tutor
mailing list