* after determining the software architecture for a system,
often one wants to determine the modules for implementing
it next;
...that level of design, considering the modules,
is the focus of this chapter;
* what modules should the system have
* which have to be developed
* ...making sure that the different views of
the system "work together"
* this part is often multi-level, also:
* high-level module design:
* deciding WHAT modules are needed
* the specifications for those modules
* HOW the modules will be interconnected
* detailed or logic module design
* deciding the INTERNAL design of the modules
* HOW the module specifications can be satisfied
* ,..to the point that actual coding can begin...!
* some key design concepts
* the design of a system is CORRECT if
* it will satisfy all the requirements
* it is consistent with the (software) architecture
* of the correct designs (because there can be more than one!)
we want the "best" design;
...but what is "best"?
* within the limitations imposed by the requirements
and the physical and social environment in which the
system will operate
* here are SOME criteria we might use in assessing the
"best"-ness of different potential designs:
* modularity
* coupling
* cohesion
* open-closed principle
* modularity - a system is considered modular if it consists
of DISCRETE modules,
* such that each module can be implemented separately,
* and a change to one has minimal impact on other modules
* ...we discussed numerous potential advantages
* BUT you can't JUST "chop" a program willy-nilly into
modules to get these benefits;
* each module needs to support a well-defined abstraction,
with a clear interface through which it can interact
with other modules;
* let's talk about some criteria for decomposition;
* coupling
* cohesion
* open-closed principle
* coupling - attempting to capture the notion of "how strongly"
modules are interconnected;
* one concept to start with: two modules are INDEPENDENT
if one can function completely without the presence of another
* ALL of the modules in a system can't be completely independent,
though;
* some need to cooperate with each other so you CAN break
a large problem into smaller pieces;
* the more connections between modules,
the more dependent they are in general,
in the sense that you need to know more about one
module to implement another;
* we'd like fewer and simpler connections
to make understanding, implementing, testing,
maintaining, etc. modules easier;
* the more we have to know about module A to understand module
B, the more closely/highly connected A is to B;
* "highly coupled" modules have strong interconnections
* "loosely coupled" modules have weak interconnections
...and we'd prefer loosely coupled, note;
...and how coupled modules are is largely determined
at this stage of design, so coupling should be
considered at this stage;
* what kind of factors influence coupling?
* type of connection between modules
* complexity of the interface
* type of information flow between modules
* consider type of connection between modules...
* complexity of interfaces -> increases coupling
* obscurity of interfaces -> increases coupling
* minimizing interfaces is considered helpful;
* number and complexity of parameters can influence
coupling;
* type of information flow - in general, data information
is considered more loosely coupled than
control information
* object-oriented systems can have some
finer grains of coupling;
* interaction coupling - methods of one class
invoking methods of OTHER classes
* component coupling - when a class A has data fields
and/or variables of another class C
* inheritance coupling - when one subclass is a direct
or indirect subclass of another
* Cohesion -
is about WHY the pieces of a SINGLE module are
in that module
(why did you "break" this up this way?)
* coupling is about the INTER-module bond between
DIFFERENT modules;
* cohesion is about the INTRA-module aspect,
why you included elements within ONE module
* we WANT high cohesion --
we want there to be a "good" reason that
these elements are together in THIS module;
(low cohesion is not so good...)
* SO many levels of cohesion!
(roughly from lower to higher cohesion,
from coincidental (lower) to functional (higher)