Jalote - Chapter 6 - "Design" - I'd say more
like Software Design...
* is the software architecture development/determination
activity from Chapter 5 a kind of high-level design?
Perhaps...
* here, now, in Chapter 6, we are talking about
system design at the "module" level,
where the definition of a "module" likely
depends on the paradigm(s) for the system being
developed;
(e.g., function-oriented? object-oriented? etc.)
* so, at this level of software design,
we determine:
* WHAT modules the system should have [next]
* and which have to be developed
* often this software design has 2 levels:
* high level design/module design
* decide WHAT modules are needed
* deciding on the SPECIFICATIONS for
those modules
* deciding HOW those modules should be
interconnected
* detailed design/logic design (logic specified)
* decide on the INTERNAL design of
the modules
* HOW the specifications can be satisfied
* essentially EXPANDS the system design
to now be more-detailed;
* a design methodology - systematic approach
for creating a design,
by applying a set of techniques and guidelines
* key software design concepts
* FIRST: the design of a system is correct if
* it will satisfy all the requirements and
* it is consistent with its architecture
* there can be more than one design that
meets these particular correctness
criteria --
how can we determine which of these is
"best", or at least, between several,
which is "better"?
* here are 4 possible criteria we could use
in trying to assess the "better"-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 can be implemented separately,
and a change to one module has minimal
impact on other modules
* a design with a higher degree of modularity
will likely be more clear,
likely be easier to implement,
likely/potentially less expensive to
test/debug/maintain;
* you can't JUST randomly/arbitrarily
chop a task into pieces and get
"good" modularity, however;
...we'd like each module to support a
well-defined abstraction;
...we'd like a clear interface through which
it can interact with other modules;
...need some criteria for decomposition!
* SUCH AS...for example!
coupling;
cohesion;
the open-closed principle;
Coupling!
* is BETWEEN modules
* consider first the concept of independence
* two modules are independent if one
can function COMPLETELY without the
presence of the other
* there are benefits to independence!
* modules can be modified separately,
implemented and test separately,
could help decrease programming/development
costs;
* do you see that MORE connections there are
between modules -- the more dependent they
will be on one another?
* coupling tries to capture this notion
of "how strongly" different modules are
interconnected;
* "highly-coupled" modules have "strong"
interconnections;
* "loosely-coupled" modules have "weak"
interconnections;
* (and INDEPENDENT modules have NO interconnections);
...SO: we WOULD like LOOSELY COUPLED modules;
* major factors influencing coupling:
* type of connection between modules
* complexity of the interface
* type of information flow between modules
(we'd like the interface of a module to be
small, simple, obvious/apparent;)
Cohesion!
* is WITHIN a module
* what are the connections between the parts
WITHIN a single module?
* how tightly bound the element within a module
are;
you'd like HIGH cohesion -- you'd like
those things that are there to be there
for a good reason!