Information on designing (Object-oriented Design & Patterns, by Cay Horstmann)
========================

From Problem to Code
1. Analysis
2. Design
3. Implementation

1. Analysis
-----------
A vague understanding of the problem is transformed into precise description
of tasks:

-- Completely defines tasks
-- No internal contradictions
-- Readable by experts in problem domain and by software developers
-- Reviewable by diverse interested parties

Most of this is essentially in the assignment given to you.

2. Design
---------
Structure programming tasks into interrelated classes:
-- Identify classes
-- Identify responsibilities (the operations) of these classes
-- Identify the relationships among these classes

These are goals, not steps. The whole process is iterative. You start with
broad ideas and gradually refine them into clear classes with well-defined 
responsibilities and an understanding of their connection with other classes.

The end result includes
-- Textual description of the classes and their most important responsibilites
-- Diagrams of relationships among classes
-- Diagrams (or description) of important usage scenarios (called Use Cases)
-- State diagrams/sequence diagrams whose behavior is highly state-dependent
   (how state changes behavior)

The last two items are included as a part of the end result (but you
won't include in CSS 342).

Relationships among classes include
-- Dependency ("uses"), meaning a class manipulates objects of the other class
-- Aggregation/composition ("has-a"), meaning an object of another class
   is a part of the class
-- Inheritance ("is-a"), meaning a class is a refinement or extension of 
   another class (CSS 342 will not include this)

