Thursday, May 16, 2013
Package structure
Package structure is not something to be considered idly.
The first thing I do when I look at an application is
$ tree -d src/
And I get something like this:
com
--host
|-- core
| |-- dao
| |-- domain
| `-- engine
|-- service
| |-- business
| |-- adapter
| |-- exception
What do I know about this application from its package structure? Not much. It has a core, an engine, that's exciting. But not at all descriptive of what it does. Sounds like a spaceship! or an alien weapon!
However, if I were building a spaceship, I'd do something like this:
org
--ship
|-- lifesupport
| |-- atmosphere
| |-- gravity
| |-- replicator
|-- communications
|-- propulsion
| |-- thruster
| |-- impulse
| |-- warp
|-- defense
| |-- shield
|-- weapons
| |-- phaser
| |-- torpedo
OK, so a space ship is much much easier to design than a piece of software! I have all the major features described at the top level. I can tell what the ship does, what its major components are.
The ship's design is organized by Features of the ship. Not by layer or any other attribute. For example, a builder or a command isn't a feature of a piece of software. Neither is an exception, a dao, a domain, an adapter..
These are all layers or programmatic idioms. Grouping classes by layer or type is a common mistake in designing software. It is always taught that one should design by feature, not by implementation detail.
Subscribe to:
Posts (Atom)