A design problem I met again and again.
Emile van Sebille
emile at fenx.com
Fri Apr 3 18:21:41 CEST 2009
andrew cooke wrote:
> Emile van Sebille wrote:
>>>> Whether you (generic you) choose to do so or not is a separate issue.
>> Also agreed - and that is really my point. Doing so feels to me like
>> continuing to look for a lost object once you've found it.
> i can see your point here, but there's two things more to consider:
> 1 - if you do need to refactor it later, because there is a bug say, it
> will be harder to do so because you will have forgotten much about the
Yes, I generally count on it. Refactoring at that time is precisely
when you get the most benefit, as it will concisely focus your
attentions on the sections of code that need to be clearer to support
the debugging changes. Face it, you'll have to get your head around the
code anyway, be it 1, 5, or 10k lines and all beautifully structured or
not. Remember, proper refactoring by definition does not change
functionality -- so that bug in the code will be there regardless.
> so if it is likely that you will need to refactor in the future, it
> may pay to do some of that work now.
Certainly -- and I envy those who know which sections to apply their
attentions to and when to stop. Personally, I stop when it works and
wait for feedback.
> 2 - if someone else needs to work with the code then the worse state it is
> in - even if it works - the harder time they will have understanding it.
> which could lead to them using or extending it incorrectly, for example.
Assuming you're talking about non-refactored code when you say worse,
consider Zope vs Django. I have no doubt that both meet an acceptable
level of organization and structure intended in part to facilitate
maintenance. I've got multiple deployed projects of each. But I'll hack
on Django if it doesn't do what I want and I find that easy, while
hacking on Zope ranks somewhere behind having my mother-in-law come for
a three-week stay on my favorite-things-to-do list. Refactored code
doesn't necessarily relate to easier understanding.
> both of the above fall under the idea that code isn't just a machine that
> produces a result, but also serves as documentation. and working code
> isn't necessarily good documentation.
Here I agree. Once I've got it working and I have the time I will add
minor clean up and some notes to help me the next time I'm in there.
Clean up typically consists of dumping unused cruft, relocating imports
to the top, and adding a couple lines of overview comments. On the
other hand, I do agree with Aahz's sometimes tag line quote accepting
all comments in code as lies. It's akin to believing a user -- do so
only at your own peril. They're really bad witnesses.
> i don't think there's a clear, fixed answer to this (i don't think "stop
> refactoring as soon as all tests work" can be a reliable general rule any
> more than "refactor until it is the most beautiful code in the world" can
> be). you need to use your judgement on a case-by-case basis.
> in fact, the thing i am most sure of in this thread is that 15000 lines of
> code in one module is a disaster.
Agreed. I took a quick scan and the largest modules I'm working with
look to be closer to 1500 lines. Except tiddlywiki of course, which
comes in at 9425 lines in the current download before adding anything to
it. I bet I'd prefer even hacking that to zope though.
One programmer's disaster is another programmer's refactoring dream :)
More information about the Python-list