Challenges in Design Horst Rittel and Melvin Webber defined a “wicked” problem as one that could be clearly described only by solving it, or by solving part of it. Essentially, this implies you have to “solve” the problem in order to define it, and solve it again to create a solution that works.
Challenges in Design Design is a sloppy process Design is about tradeoffs and priorities Design involves restrictions Design is nondeterministic (multiple ways to solve each part) Design is a heuristic process (rules of thumb) Design is emergent(evolves over time).
Desireable Characteristics of a Design Minimal Complexity Ease of Maintenance Loose Coupling Extensibility Reusability High Fan-in Low-to-medium Fan-in Portability
Desireable Characteristics of a Design Cont Leanness Stratification Standard Techniques
5 Levels of Design Level 1: The complete software system Level 2: Divisions into subsystems Level 3: Division into classes Level 4: Division into data and routines Level 5: Internal routine design
Heuristics Because Design is nondeterministic, Software Engineers must follow “rules of thumb”, more commonly known as Heuristics, in their approach to software design.
Some Common Heuristics Find Real World Objects to base your ADT’s on. Form Consistent Abstractions Encapsulate Implementation Details Inheritance Information Hiding Identify Areas Likely to Change and Isolate them. Keep Coupling of Classes Loose
Common Design Patterns Reduce Complexity by providing ready- made abstractions Reduce Errors by institutionalizing details of common solutions Provide Heuristic Value by suggesting Design Alternatives Streamline Communication by moving the design dialog to a higher level
Other Heuristics Aim for Strong Cohesion Build Hierarchies Formalize Class Constructs Assign Responsibilites Design for Test Avoid Failure
Other Heuristics Choose Variable Binding (assigning values) time carefully Make Central Points of Control Consider using Brute Force Draw a Diagram Modularity