Basic Design Principles
When designing a system's architecture we try to follow the
principles outlined below.
Abstraction
Abstraction is achieved in the following areas:
-  procedural abstraction 
-  data abstraction 
-  control abstraction 
Refinement
Stepwise refinement is a way to tame the details and
complexity of the final design.
Modularity
A modular design minimises the system's complexity and thereby
the development cost and the number of possible errors.
A good design method should provide:
-  modular decomposability 
-  modular composability 
-  individual modular understandability 
-  modular continuity
(in changes: minimize the modules affected by any change) 
-  modular protection:
a problem in one part should not create problems in others 
Cohesion
A design should bring closely together parts that exhibit a
high measure of cohesion.
We can distinguish the following ordered types of cohesion:
-  coincidental cohesion 
-  logical cohesion 
-  temporal cohesion 
-  procedural cohesion 
-  communicational cohesion 
-  sequential cohesion 
-  functional cohesion 
Coupling
On the other hand, a design should avoid coupling between
parts.
We can distinguish the following ordered types of coupling:
-  data coupling 
-  stamp coupling (copy of a part) 
-  control coupling 
-  common coupling 
-  external coupling 
-  content coupling