Yeah, I never know what people mean by those, either. I use a definition of component that involves being an executable, closed, replaceable
unit of distribution.
Executable is a tough definition on its own. Some sources say "binary" or "compiled" which is nice except scripting languages aren't either of those and what is
Java byte-code anyhow? I think to me this means it's ready to use and I don't have to build it.
Closed goes with that to say that it's not something you are allowed to dig into and modify internally. Again, scripting languages deliver source code so there's nothing to prevent you from mucking about. Configurable from the outside is allowed without breaking the "closed" bit.
Replaceable means that it implements a well-defined API and somebody else could implement that same API and swap a different component into the same place. It also puts some limits on dependencies ... if a component depends on a lot of other stuff and the replacement depends on a lot of different stuff it's much harder to replace.
A unit of distribution or deployment means it can be packaged up and handed off to someone else by itself. In a system built of components it might mean that they can be on independent release schedules. If the mail component team releases an update I can deploy that one component to my server and not disturb the rest of my system.
I get sloppy and talk about subsystems in my application as components. They fit some of these definitions, but not all.
Anybody else have good working definitions for component and module? I don't think I have a different definition for module.
[ April 14, 2005: Message edited by: Stan James ]