I was reading a column by Rebecca about how to look for abstractions while designing object oriented systems. She passes on some good nuggets:
- She points to one Edwards who claims that artistic talent only seems rare and out of the ordinary because we expect it to be.
- On a similar note, she says that although design is a highly creative activity, we can still learn fundamental design skills and accomplish a lot with them.
- She suggests that it’s especially fruitful to talk with expert users about how they use (y)our software.
- She presses the role of CRC (an old yet still valid) technique in designing good systems. She makes a small deviation from it saying that instead of directly boiling down to classes, it is recommended to first list the candidates decide what role they end up in (interface, abstract class, concrete class etc.) later.
- The most important nugget is: finding the right level of abstraction requires practice and experimentation.
- Abstractions need to model the real world accurately – it is enough to model/abstract so much as is necessary for the software world. For example, even though there are books, CDs etc. to sell, it may not be necessary to distinguish them and hence can be abstracted with a single class (say resource) instead of two separate classes.
- When deciding the abstractions, looking for the behavioral differences might help.