Modules suitable as components have a boundary, such that all their
dependencies are explicited there.
A proper module boundary can only be statically defined: a component
must be defined prior to its use.
This has nothing to do with the checking of the conditions expressed
at the boundary... as long as this checking never fails.
Dependencies must be minimal and explicit.
Explicit is synonymous to statically defined.
Components: guarantee a deterministic behaviour.
Offer no weaker guarantee than what would be achievable with lower
level code.
Module at Merriam-Webster:
Modular at Merriam-Webster:
What we express are our assumptions concerning the world -maybe in order to enrich or modify them. Anyway, they are a priori to (even if the result of) the experience (e.g. the execution of the program).
We make our assumptions explicit and model them as context trees, so as to deal with breakdowns by switching the context, backwards towards the root of the tree, where our assumptions are less specific.
This is close to the philosophy of exceptions.
Posting on 1997/05/16 to comp.lang.c++ about Genericity vs polymorphism.