The Software Design Process

Slides:



Advertisements
Similar presentations
Software Engineering Key design concepts Design heuristics Design practices.
Advertisements

Structured Design. 2 Design Quality – Simplicity “There are two ways of constructing a software design: One is to make it so simple that there are obviously.
By Justin Hendrix. Design Challenges Design is the activity that links requirements to coding and debugging. Good design is useful on small project and.
High Quality Code Why it matters. By Ryan Ruzich.
Object-Oriented Analysis and Design
Object-Oriented Metrics. Characteristics of OO ● Localization ● Encapsulation ● Information hiding ● Inheritence ● Object abstraction.
1 Software Testing and Quality Assurance Lecture 12 - The Testing Perspective (Chapter 2, A Practical Guide to Testing Object-Oriented Software)
Design The goal is to design a modular solution, using the techniques of: Decomposition Abstraction Encapsulation In Object Oriented Programming this is.
Chapter 1 Software Development. Copyright © 2005 Pearson Addison-Wesley. All rights reserved. 1-2 Chapter Objectives Discuss the goals of software development.
The Software Design Process CPSC 315 – Programming Studio Fall 2009.
1 An introduction to design patterns Based on material produced by John Vlissides and Douglas C. Schmidt.
OBJECT ORIENTED PROGRAMMING IN C++ LECTURE
UFCEUS-20-2 : Web Programming Lecture 5 : Object Oriented PHP (1)
Chapter 5CSA 217 Design in Construction Chapter 5 1.
CSE 303 – Software Design and Architecture
SAMANVITHA RAMAYANAM 18 TH FEBRUARY 2010 CPE 691 LAYERED APPLICATION.
SOFTWARE DESIGN (SWD) Instructor: Dr. Hany H. Ammar
THE SOFTWARE DESIGN PROCESS CSCE 315 – Programming Studio Spring 2010.
CS3773 Software Engineering Lecture 04 UML Class Diagram.
CSE 403, Spring 2008, Alverson Software Design “There are two ways of constructing a software design: one way is to make it so simple that there are obviously.
Software Engineering Principles. SE Principles Principles are statements describing desirable properties of the product and process.
1 CSCD 326 Data Structures I Software Design. 2 The Software Life Cycle 1. Specification 2. Design 3. Risk Analysis 4. Verification 5. Coding 6. Testing.
Behavioral Patterns CSE301 University of Sunderland Harry R Erwin, PhD.
CS 350 – Software Design Expanding Our Horizons – Chapter 8 The traditional view of objects is that they are data with methods. Sometimes objects could.
Review of Parnas’ Criteria for Decomposing Systems into Modules Zheng Wang, Yuan Zhang Michigan State University 04/19/2002.
Design. Practices Principles Patterns What are the characteristics of good design? What are good solutions to common design problems? How do we go about.
High Quality Code – Style Matters  Design in Construction  Layout and Style Software Construction by Jeff Nogy.
Object-Oriented Design Concepts University of Sunderland.
ITEC0724 Modern Related Technology on Mobile Devices Lecture Notes #2 1.
PowerPoint Presentation for Dennis, Wixom, & Tegarden Systems Analysis and Design with UML, 5th Edition Copyright © 2015 John Wiley & Sons, Inc. All rights.
 The Object Oriented concepts was evolved for solving complex problems. Object- oriented software development started in the 1980s. Object-oriented design.
Principles of Programming & Software Engineering
Object Oriented Systems Design
UNIT-IV Designing Classes – Access Layer ‐ Object Storage ‐ Object Interoperability.
Design in Construction
Chapter 1: Software design
Unit - 3 OBJECT ORIENTED DESIGN PROCESS AND AXIOMS
Design Patterns: MORE Examples
Algorithms and Problem Solving
Object-Oriented Programming Concepts
INTRODUCTION TO OBJECT-ORIENTED PROGRAMMING
Chapter 1: Introduction to Systems Analysis and Design
MPCS – Advanced java Programming
Best Practices for Software System Design
Data Abstraction: The Walls
CMPE 135: Object-Oriented Analysis and Design October 24 Class Meeting
Lecture 9- Design Concepts and Principles
Principles of Programming and Software Engineering
INTRODUCTION TO OBJECT-ORIENTED PROGRAMMING (OOP) & CONCEPTS
Chapter 5 Design in Construction
TIM 58 Chapter 8: Class and Method Design
The Object-Oriented Thought Process Chapter 05
Introduction to Design Patterns Part 1
Software Engineering Lecture #8.
Lecture 9- Design Concepts and Principles
Programming Logic and Design Fourth Edition, Comprehensive
An Introduction to Software Architecture
SAMANVITHA RAMAYANAM 18TH FEBRUARY 2010 CPE 691
Chapter 1: Introduction to Systems Analysis and Design
CS 8532: Advanced Software Engineering
Algorithms and Problem Solving
CMPE 135 Object-Oriented Analysis and Design March 21 Class Meeting
Applying Use Cases (Chapters 25,26)
Design Yaodong Bi.
Object-Oriented PHP (1)
Chapter 11: Integration- and System Testing
Chapter 8 - Design Strategies
Chapter 1: Introduction to Systems Analysis and Design
Jim Fawcett CSE687 – Object Oriented Design Spring 2015
Presentation transcript:

The Software Design Process CSCE 315 – Programming Studio, Fall 2017 Tanzir Ahmed

Outline Challenges in Design Design Concepts Heuristics Practices

Challenges in Design A problem that can only be defined by solving it Only after “solving” it do you understand what the needs actually are, or what things are missing from the naïve design e.g. Tacoma Narrows bridge design Before the bridge collapsed for wind ripple, engineers did not know that aerodynamics have to be factored “Plan to throw one away”

Challenges in Design Process is Sloppy Tradeoffs and Priorities Mistakes Wrong, dead-end paths Stop when “good enough” Mistakes in design and recognizing them is better than finding them out in/after coding phase Tradeoffs and Priorities All realistic software face some sort of limit Design balances between often conflicting requirements Priorities can change Although unusual in class projects, overwhelmingly common in industry

Challenges in Design Restrictions are necessary Constraints improve the result Nondeterministic process Not one “right” solution A Heuristic process Rules of thumb vs. fixed process Difficult to know when to stop (Is the design good enough?) Emergent Evolve and improve during design, coding

Levels of Design Software system as a whole Division into subsystems/packages Classes within packages Data and routines within classes Internal routine design Work at one level can affect those below and above Design can be iterated at each level

Key Design Concepts Most Important: Manage Complexity “No one’s skull is big enough for a modern computer program” - Dijkstra Software already involves conceptual hierarchies, abstraction Goal: minimize how much of a program you have to think about at once Again, pointing to hierarchy in design Should completely understand the impact of code changes in one area on other areas

Good Design Characteristics Minimal complexity Favor “simple” over “clever”

Good Design Characteristics Minimal complexity Ease of maintenance Imagine what maintainer of code will want to know Be self-explanatory

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Keep connections between parts of programs minimized Avoid n2 interactions! Abstraction, encapsulation, information hiding

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Should be able to add to one part of system without affecting others

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability Design so code could be “lifted” into a different system Good design, even if never reused

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in For a given class, have it used by many others Indicates good capture of underlying functions

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in Low-to-medium fan- out Don’t use too many other classes Complexity management

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in Low-to-medium fan- out Portability Consider what will happen if moved to another environment

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in Low-to-medium fan-out Portability Leanness Don’t add extra parts for future That does not avoid future changes Extra code will need to be tested, reviewed in future changes “A book is finished not when nothing more can be added but when nothing more can be taken away” - Voltaire

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in Low-to-medium fan- out Portability Leanness Stratification Design so that you don’t have to consider beyond the current layer Get a full view from every level

Good Design Characteristics Minimal complexity Ease of maintenance Loose coupling Extensibility Reusability High fan-in Low-to-medium fan-out Portability Leanness Stratification Standard Techniques Use of common approaches make it easier to follow code later Avoid unneeded exotic approaches

Levels of Design

Design Heuristics Understand the Problem Devise a Plan Carry Out the Plan Look Back and Iterate

Find Real-World Objects Standard Object-Oriented approach Identify objects and their attributes Determine what can be done to each object Determine what each object is allowed to do to other objects Determine the parts of each object that will be visible to other objects (public/private) Define each object’s public interface

Form Consistent Abstractions View concepts in the aggregate “Car” rather than “engine, body, wheels, etc.” Identify common attributes Form base class Focus on interface rather than implementation Form abstractions at all levels Car, Engine, Piston

Inheritance Inherit when helpful Inheritance can easily be misused When there are common features Inheritance can easily be misused

Information Hiding Interface should reveal little about inner workings Example: Assign ID numbers Assignment algorithm could be hidden ID number could be typed Encapsulate Implementation Details Don’t set interface based on what’s easiest to use Tends to expose too much of interior Think about “What needs to be hidden”

More on Information Hiding Two main advantages Easier to comprehend complexity Localized effects allow local changes Issues: Circular dependencies A->B->A Global data (or too-large classes) Performance penalties Valid, but less important, at least at first

Identify Areas Likely to Change Anticipate Change Identify items that seem likely to change Separate these items into their own class Limit connections to that class, or create interface that’s unlikely to change Examples of potential change areas: Business Rules, Hardware Dependencies, Input/Output, Nonstandard language features, status variables, difficult design/coding areas

Keep Coupling Loose Relations to other classes/routines Small Size Fewer parameters, methods Visible Avoid interactions via global variables Flexible Don’t add unnecessary dependencies e.g. using method that’s not unique to the class it belongs to

Kinds of Coupling Data-parameter (good) Simple-object (good) Data passed through parameter lists Primitive data types Simple-object (good) Module instantiates that object Object-parameter (so-so) Object 1 requires Object 2 to pass an Object 3 Semantic (bad) One object makes use of semantic information about the inner workings of another

Examples of Semantic Coupling Module 1 passes control flag to Module 2 Can be OK if control flag is typed Module 2 uses global data that Module 1 modifies Module 2 relies on knowledge that Module 1 calls initialize internally, so it doesn’t call it Module 1 passes Object to Module 2, but only initializes the parts of Object it knows Module 2 needs Module 1 passes a Base Object, but Module 2 knows it is actually a Derived Object, so it typecasts and calls methods unique to the derived object

Design Patterns Design Patterns, by “Gang of Four” (Gamma, Helm, Johnson, Vlissides) Common software problems and solutions that fall into patterns Provide ready-made abstractions Provide design alternatives Streamline communication among designers

More on Design Patterns Given common names. For instance, “Bridge” – builds an interface and an implementation in such a way that either can vary without the other varying “Singleton” – makes sure that only 1 instance of the class is ever created We will dedicate an entire lecture to Design Patterns. We will see more of it.

Other Heuristics Strong Cohesion Build Hierarchies All routines support the main purpose e.g., A class named “NFLPlayer” does not have a member function “string_reverse()”, because the cohesion become week Build Hierarchies Manage complexity by pushing details away Formalize Class Contracts Clearly specify what is needed/provided Assign Responsibilities Ask what each object should be responsible for Summary: Each class has a specific job, none of them are “jack-of-all-trade” type

More Heuristics Design for Test Avoid Failure Consider how you will test it from the start If a class/module that is not immediately testable, reevaluate it Avoid Failure Think of ways it could fail Think about the unthinkable Make Central Points of Control In simple case: a bunch of define statements at the beginning (e.g., requires changing a few parameters) In a more complicated case: Load a template of configuration (e.g., requires changing 10s or 100s or parameters) Fewer places to look -> easier changes

More Heuristics Consider Using Brute Force Draw Diagrams Especially for early iteration Working is better than non-working Draw Diagrams Keep Design Modular Black Boxes

Design Practices (we may return to these) Iterate – Select the best of several attempts Decompose in several different ways Top Down vs. Bottom Up Prototype Collaborate: Have others review your design either formally or informally Design until implementation seems obvious Balance between “Too Much” and “Not Enough” Capture Design Work Design documents