58
Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Embed Size (px)

Citation preview

Page 1: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Design

ECE 417/617:Elements of Software Engineering

Stan BirchfieldClemson University

Page 2: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

From modeling to design

Steps:1. Analysis and modeling

2. Design

3. Construction (code generation and testing)

Design involves making the analysis model more specific, to facilitate construction.

Goal of design is quality.

Page 3: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

FURPS

Quality software is• Functional – capabilities of program• Usable – human factors, aesthetics• Reliable – frequency and severity of failure• Performance – response time, speed• Supportable – is the code maintainable,

extensible, testable, configurable, easy to install, etc.

(Developed by Hewlett-Packard in 1980s)

Page 4: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Basic design principles

• Design is iterative: – Architecture is refined over time by successively

filling in details– Refinement is a process of elaboration– Results in hierarchical model

• A good design exhibits– abstraction – details are provided in lower levels– modularity – divide-and-conquer via smaller

independent components– refactoring – internal structure of software is

improved without affecting external behavior

Page 5: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Design model

Design model has three aspects:

• Architectural design

• Component-level (data) design

• Interface design

We will consider these in turn, with UI covered in a separate lecture.

Page 6: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Architectural Design

Page 7: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Architectural design• Architecture is a high-level representation of the S/W

with the major components identified• Architectural styles are templates, e.g.,

– Data-centered– Data-flow– Call and return– Object-oriented– Layered

• Architectural patterns define specific approach for handling some behavioral characteristic of system, e.g.,

– concurrency: use O/S features or provide task scheduler– persistence: storage and retrieval of data– distribution: communication of components with one

another. Most common is broker – acts as middle man between client and server (CORBA).

Style is like “Cape cod, A-frame”. Pattern is like “kitchen”.

Page 8: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Architectural Styles

• Data-centered – subsystems interact through single repository

• Model / View / Controller

• Call and return (Client / Server)

• Layered (three-tier, four-tier)

• Data-flow (pipe and filter)

Page 9: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Layers and Partitions

• Layer – group of related subsystems– Layer knows about layers below it, but not

layers above it– Top layer: no one else knows about it– Closed architecture – can only access layer

immediately below– Open architecture – can access any layer below

• Partition – peer subsystems, each with different responsibilities

Page 10: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Hierarchical decompositionApplication

Presentation

Session

Transport

Network

DataLink

Physical

Socket

CORBA

TCP/IP

Object

Ethernet Wire

Lev

el o

f ab

stra

ctio

n

Frame

Packet

Bit

Connection

Format

Message

Example: Open Systems Interconnection (OSI)

Page 11: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Mapping DFD into architecture

• Transform mapping– transform flow always exists; represents information flow within system; incoming flow

passes through transform center, leads to outgoing flow– To map DFD with transform flow characteristics into specific architectural style,– review model– refine models– determine whether transform or transaction characteristics– isolate transform center– perform first and second level factoring– refine

• Transaction mapping– transaction flow occurs when one input gives rise to several outputs; transaction triggers

data flow along one of many paths– To map DFD with transaction flow characteristics,– review model– refine models– determine whether transform or transaction characteristics– isolate transaction center– map to transform branch– factor and refine

Page 12: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Model / View / Controller (MVC)

• MVC:– Model subsystems maintain domain

knowledge– View subsystems display it to the user– Controller subsystems manage sequence of

interactions with user

• M doesn’t depend upon V or C• Changes propagated via subscribe/notify

protocol, using Observer design pattern• Well-suited for interactive systems

Page 13: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC Details

Controller

Model

subscriber

notifier

initiator

*

repository1

1

*

View

Page 14: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC Example

Page 15: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC Example Details

:Controller

:InfoView

:Model

2:enterNewFileName(file,newName)3:setName(newName)

:FolderView1:subscribeToFileEvents(file)

5:getName()

4:notifySubscribedViews(file)

1:subscribeToFileEvents(file)5:getName()

4:notifySubscribedViews(file)

Page 16: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

GUI-Based Programming

Page 17: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Paradigms Compared

Application

Application

Widgets

The User

draw

output input

callbacksoutput

input

Traditional command-line GUI-based

Page 18: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event/Message loop

Page 19: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event loop – pseudocode

WinMain() { while (1) { // loop forever, waiting for an event if (event_exists) { //there is an event, figure out what to

do if (event == keydown_a) display(‘user pressed the A key’); else if (event == window_resize) display(‘window resized’); else if (event == repaint) display(‘need to repaint window’); else if (event == keydown_escape) exit_program();

} }}

int main() {return WinMain();

}

Page 20: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event loop – WinMain

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam, int cmdShow)

{ char className [] = "Winnie"; WinClass winClass (WindowProcedure, className, hInst); winClass.Register (); WinMaker win ("Hello Windows!", className, hInst); win.Show (cmdShow); MSG msg; int status; while ((status = ::GetMessage (& msg, 0, 0, 0)) != 0) { if (status == -1) return -1; ::DispatchMessage (& msg); } return msg.wParam; }

Page 21: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event loop – WindowProc

LRESULT CALLBACK WindowProcedure (HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)

{ switch (message) { case WM_DESTROY: ::PostQuitMessage (0); return 0; } return ::DefWindowProc (hwnd, message, wParam, lParam ); }

Page 22: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event loop (cont.)int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow){ HWND hwnd; MSG msg; //initialization code goes here while(1) {

// Get message(s) if there is one if(PeekMessage(&msg,hwnd,0,0,PM_REMOVE)) {

if(msg.message == WM_QUIT)break;

TranslateMessage(&msg); DispatchMessage(&msg); //this calls the CALLBACK function WinProc()

} else {DrawScene(); //display the OpenGL/DirectX scene

}}

}

Page 23: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Event loop (cont.)LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM

lparam){ PAINTSTRUCT ps; // Depending on the message -- we'll do different stuff switch(message) {

case WM_PAINT:Draw();return 0;

// ESC will quit programcase WM_KEYDOWN: //user pressed a key

if(GetAsyncKeyState(VK_ESCAPE)) //it was the escape keyPostQuitMessage(0); //quit program

return 0; case WM_DESTROY: //windows wants the program to die

case WM_CLOSE: //or the user closed the window PostQuitMessage(0); //quit program

return 0; } return DefWindowProc(hwnd, message, wparam, lparam);}

Page 24: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

GUI Concepts

• Widget – graphic object with functionality; e.g., button, toolbar, ...

• Window – holds widgets• Child/parent – relationships

between windows• Event / message – how windows

communicate

Page 25: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Anatomy of a Window

title bar

menu

toolbar

client area

status bar

Page 26: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Microsoft Windows Programming

• History:– Win32 API: core library written in C– MFC: C++ wrappers around most

common Win32 API functions

• Lots of macros• Lots of legacy code• Not free, not portable• But it works (generally speaking)

Page 27: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Analyzing architectural designs

Two approaches developed by SEI:• Architecture trade-off analysis method

(ATAM)– Collect scenarios and requirements– Evaluate quality attributes and their sensitivity– Critique candidate architectures

• Scenario-based architectural analysis (SAAM)– Uses scenarios to analyze architectures with

respect to quality attributes

Quality attributes: reliability, performance, security, maintainability, flexibility, testability, portability, reusability, interoperability

Page 28: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Component-level Design

Page 29: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Component-level design

• Occurs after the first iteration of architectural design

• Goal: translate the design model into operational software

• Component is set of collaborating classes• Designing components

– OCL– flow chart– tabular design notation

Decision table has four quadrants specifying conditions and actions, as well as rules for both

– PDL (pseudocode)

Page 30: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

...

Decomposition

System

Subsystem1

Class1a

SubsystemN

Class1n... ClassNa ClassNn...

Page 31: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Coupling and cohesion

• Coupling -- # of dependencies between subsystems

• Cohesion -- # of dependencies within subsystem

• Goal: low coupling, high cohesion• 7 +/- 2 rule – keep number of concepts at

any given layer of abstraction bounded

Page 32: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Additional design principles• Single responsibility (SRP)

A class should have only one reason to change• Open-closed (OCP)

Software entities should be open for extension but closed for modification (achieved via inheritance)

• Liskov substitution (LSP)Subclasses should be substitutable for their base classes

• Dependency inversion (DIP)Abstractions should not depend upon details

• Interface segregation (ISP)Many client-specific interfaces are better than one general purpose interface

• Release reuse equivalency (REP)Granule of reuse is granule of release

• Common closure (CCP)Classes that change together belong together

• Common reuse (CRP)Classes in a package are reused together

Page 33: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Data structures and flow

• Software system is composed of– data structures, and– data flow

• Which is more important?

“Show me your code and conceal your data structures, and I shall continue to by mystified. Show me your data structures and I won’t usually need your code. It will be obvious.” – Fred Brooks

Page 34: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

What is a Design Pattern?

• A design pattern– abstracts a recurring design structure– comprises class and/or object

• dependencies, • structures, • interactions, or• conventions

– distills design experience

Page 35: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Re-use

• Code re-use– Don’t reinvent the wheel– Requires clean, elegant, understandable,

general, stable code– leverage previous work

• Design re-use– Don’t reinvent the wheel– Requires a precise understanding of common,

recurring designs– leverage previous work

Page 36: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Some design patterns

• Abstract factory• Adapter• Bridge• Command• Composite• Façade• Subject / Observer• Proxy• Strategy

Page 37: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Subject-observer

[from Vlissides]

Page 38: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Subject-observer (cont.)

Subject

Register(Observer)Unregister(Observer)NotifyAll()

Observer

OnUpdate()

1 *

for all o in observers { o.OnUpdate()}

Page 39: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Subject-observer (cont.)

Subject

Register(Observer)Unregister(Observer)NotifyAll()

Observer

virtual OnUpdate()

1 *

for all o in observers { o.OnUpdate()}

ConcreteSubject ConcreteObserver

virtual OnUpdate()

Page 40: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Model / view / controller (MVC)

Controller

Model

View (displays data)

(mediates)

(holds data)

{ Model m; Controller c(&m); View v(&c);} calls Register()

Main

View

Controller

Model

Create()

Create()

Create()

Register()

Set()

Set()

OnUpdate()

Page 41: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC (cont.)

Subject

Register(Observer)Unregister(Observer)NotifyAll()

Observer

virtual OnUpdate()

1 *

for all o in observers { o.OnUpdate()}

Controller View

virtual OnUpdate()

Page 42: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC (cont.)class Observer{protected: virtual void OnUpdate(MsgId message_id) = 0;};

class Subject{public: enum MsgId {}; void RegisterObserver(Observer* obs); virtual void NotifyAllObservers(MsgId message_id) { for (int i=0 ; i<m_observers.size() ; i++) { m_observers[i]->OnUpdate(message_id); } }private: std::vector<Observer*> m_observers;};

Page 43: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC (cont.)

class Controller : public Subject{ Controller(Data* d) : m_data(d) {} const Data* GetData() const; void AddSphere(const Sphere& s) { m_data->AddSphere(s); NotifyAllObservers(ADD_SPHERE); }private: Data* m_data;};

Page 44: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

MVC (cont.)class MainWnd : public Observer, CWnd{public: MainWnd(Controller* c) : m_controller(c) { c.Register(this); } virtual void OnUpdate(int message_id) { switch (message_id) { case Subject::ADD_SPHERE: ... } }private: Controller* m_controller;};

Page 45: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Adapter

• You have– legacy code– current client

• Adapter changes interface of legacy code so client can use it

• Adapter fills the gap b/w two interfaces• No changes needed for either

– legacy code, or– client

Page 46: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Adapter (cont.)

class NewTime {public:int GetTime() { return m_oldtime.get_time() * 1000 + 8; }private: OldTime m_oldtime;};

Page 47: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Command

• You have commands that need to be– executed,– undone, or– queued

• Command design pattern separates– Receiver from Invoker from Commands

• All commands derive from Command and implement do(), undo(), and redo()

Page 48: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Implementing ‘Undo/Redo’

• Multi-level undo/redo requires two classes:– Command– CommandManager

class Command { public: virtual bool Execute() = 0; virtual bool Unexecute() = 0; virtual ~Command() { } };

class CommandManager { private: typedef list<Command*> CommandList; CommandList m_undoList; CommandList m_redoList;public: void DoCommand(Command* com); void Undo(); void Redo(); };

http://www.codeproject.com/KB/cpp/undoredo_cpp.aspx

Page 49: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Facade

• You– have a set of related classes– want to shield the rest of the system

from these details

• Facade provides a simplified interface

• Encapsulates a subsystem

Page 50: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Composite

• You want uniformly to treat – items (atomic elements), and– groups (containing items or other groups)

• Composite interface specifies operations that are shared between items and groups

• Examples: hierarchy of files and directories, groups of drawable elements

Page 51: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Composite (cont.)

GroupItem

Composite

Page 52: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Proxy

• You want to– delay expensive computations,– use memory only when needed, or– check access before loading an object into

memory

• Proxy – has same interface as Real object– stores subset of attributes– does lazy evaluation

Page 53: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Strategy

• You want to– use different algorithms depending upon the

context– avoid having to change the context or client

• Strategy – decouples interface from implementation– shields client from implementations– Context is not aware which strategy is being used;

Client configures the Context– strategies can be substituted at runtime– example: interface to wired and wireless networks

Page 54: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Strategy (cont.)

Client

Strategy

ConcreteStrategyA

ConcreteStrategyB

Context

Policy

Page 55: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Strategy (cont.)Lots of switch statements is evidence of “code smell”:

Polymorphism, using strategy pattern, cleans this up:

http://codebetter.com/blogs/jeremy.miller/archive/2006/04/11/142665.aspx

Page 56: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Bridge

• You– have several different implementations– need to choose one, possibly at run time

• Bridge – decouples interface from implementation– shields client from implementations– Abstraction creates and initializes the

ConcreteImplementations– Example: stub code, slow code, optimized code

Page 57: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Bridge (cont.)Client

Implementor

RefinedAbstraction

ConcreteImplementorA

ConcreteImplementorB

Abstraction

Page 58: Design ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University

Design pattern space

[from Vlissides]