Alan Gauld wrote:
> I never use commonality of data to define a class. OK I lie, sometimes 
> its just convenient to do it that way, but as a principle
> such classes are rarely extensible, they tend to be more like records in 
> structured programming speak.

Very few of my classes are ever extended with subclasses.

I don't like to make classes that are just data containers, but I find that 
when I do make a class like that, I often find some behaviour to go with it. 
Usually pretty quickly :-) and then I have a real class that is pulling it's 
weight.

> I do top down design for the class strucure but design and build the 
> classes from bottom up. In so doing I will of course discover new 
> vclasses that must be slotted ito the structure. But my first cut is 
> usually to build a framework of "abstract" classes that work together to 
> solve the problem, then I go back filling in the methods from the bottom 
> up, and testing each method as each slots into the abstract framework, 
> gradually becoming more concrete as it builds.

I guess I have an idea of where I am going, what the eventual pieces will be, 
but I don't generally build any kind of framework in advance and I don't use 
many abstract classes.

I think you work at a much larger scale (of program size) than I do, that may 
be one reason for the different approach. Most of my programs are small or 
medium size, I'm not sure I have ever worked on a project I would really call 
large.

> I occasionally refactor at the method level, I very occasionally 
> refactor at the class level, but thats rare once I have the abstract 
> framework in place.

I refactor constantly. I think of it as building the framework as I go, letting 
it emerge from the code. When I am done I often have a very highly tuned, 
application-specific framework, but I didn't imagine it from the start, I 
evolve it as I develop the overall solution.

> Inwill take the same approach but I will think about the objects, then I 
> think about the responsibilities and collaborators (CRC Cards are my 
> friends!). Then I write the abstract structure based on the CRCs and  
> test it, if it works I go back and fill in the methods. In doing so I 
> will discover what data I need.

I sometimes use something like CRC cards. How do you test the abstract 
structure? With stubs and mock objects?

>> Some of the blocks are classes, others are functions.
> 
> I've built hybrid programs occasionally but in general if a procedural 
> approach starts to break I will tend to rework it into pure OOP rather 
> than mix paradigms.

I don't have any problem mixing. The procedural parts are usually low-level 
utility functions or high-level drivers. I just do what seems to work best for 
each part of the problem.
> 
>> I write unit tests as I go, sometimes test-first, sometimes test-after, 
> 
> 
> I like the idea of test first but for me it doesn't work well, but I do 
> test on a method by method basis once past the initial framework. (The 
> famework is tested class by class since they are only stubs). And 
> individual classes get tested at the >>> prompt before veing tried in 
> the framework - one of the great joys of Python is interactive testing 
> at the >>>.

I do very little of this. For me the problem with testing at the >>> prompt is 
that the tests aren't captured. By writing the tests as unit tests, they are 
run repeatedly. When I change the implementation of a class I can re-run the 
tests and be pretty confident I haven't broken anything. If my original tests 
were interactive I have to remember how I tested and run them again by hand.

Kent
-- 
http://www.kentsjohnson.com

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to