200 likes | 344 Views
High Quality Code Why it matters. By Ryan Ruzich. Design. Definition: Software Design means the conception, invention, or contrivance of a scheme for turning a specification for computer software into operational software. Challenges in Design.
E N D
High Quality CodeWhy it matters. By Ryan Ruzich
Design • Definition: Software Design means the conception, invention, or contrivance of a scheme for turning a specification for computer software into operational software.
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
Design Practices • Iterate--Keep iterating at a design process until you arrive at the most optimal • Divide and Conquer • Top-Down and Bottom-Up Design • Experimental Prototyping • Collaborative Design
Capturing your Design • Insert design documentation into the code itself • Capture design discussion and decisions on a wiki • Write email summaries