68
Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

Embed Size (px)

Citation preview

Page 1: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

Leveraging Design Patterns in ABL Applications

Phillip MagnayTechnical Architect

Page 2: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation2 Leveraging Design Patterns in ABL Applications

Goals of this Session

Many common design problems already have tried and proven solutions

Some wheels have already been invented Design patterns exist in the public domain Design patterns can be readily implemented in

OpenEdge® ABL

What are the take-aways?

Page 3: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation3 Leveraging Design Patterns in ABL Applications

Agenda

What are Design Patterns? Origins & Background Benefits Design Pattern Classifications Documenting Design Patterns Implementing Design Patterns in ABL Limitations of Design Patterns

What we’re going to cover…

Page 4: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation4 Leveraging Design Patterns in ABL Applications

What are Design Patterns?

Repeatable solution to a software design problem Design “template” Relationships & interactions between classes

and/or objects Situation dependent, must be adapted Not all patterns are “design” patterns

• Architectural pattern

• Code pattern

Page 5: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation5 Leveraging Design Patterns in ABL Applications

Origins & Background

Patterns in architecture during the ’70s Programming patterns in the ’80s

Object-Orientation in the ’90s Gang of Four (Gof) in 1994

• Design Patterns: Elements of Reusable Object-Oriented Software

Pattern Languages Pattern Repositories

Page 6: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation6 Leveraging Design Patterns in ABL Applications

Benefits

Accelerates the development process Tested & proven approaches Familiar to developers Provides a lexicon, facilitates communication Basis for standards and documentation

Page 7: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation7 Leveraging Design Patterns in ABL Applications

Design Pattern Classifications

Creational Patterns Structural Patterns Behavioral Patterns

Fundamental Patterns Meta- Patterns Architectural Patterns

Page 8: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation8 Leveraging Design Patterns in ABL Applications

Gang of Four Patterns

Creational Patterns

• Abstract Factory

• Builder

• Factory Method

• Prototype

• Singleton

Structural Patterns

• Adapter• Bridge

• Composite

• Decorator

• Façade

• Flyweight

• Proxy

Behavioral Patterns

• Chain of responsibility

• Command

• Interpreter

• Iterator

• Mediator

• Memento

• Observer

• State

• Strategy

• Template method

• Visitor

Page 9: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation9 Leveraging Design Patterns in ABL Applications

Design Pattern Documentation

Pattern Name Classification Also Known As (AKA) Motivation Applicability Structure Participants Collaboration

Consequences Implementation Sample Code Known Uses Related Patterns

Page 10: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation10 Leveraging Design Patterns in ABL Applications

Implementing Design Patterns in ABL

Factory Method State Decorator Observer Command

Page 11: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation11 Leveraging Design Patterns in ABL Applications

Factory Method Pattern

Name: Factory Method

Classification: Creational

Motivation: Need to define a standard interface to create objects, but allow sub-classes decide which class to instantiate.

Applicability: A class cannot anticipate the class of objects it must create.

Participants: Product, ConcreteProduct, Creator, ConcreteCreator

Page 12: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation12 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Structure

Page 13: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation13 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

Page 14: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation14 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS Account:

METHOD PUBLIC VOID Deposit (INPUT amt AS DECIMAL):

/* code */ END METHOD.

METHOD PUBLIC VOID Withdraw (INPUT amt AS DECIMAL):

/* code */ END METHOD.

METHOD PUBLIC VOID PayInterest (INPUT rate AS DECIMAL):

/* code */ END METHOD.

END CLASS.

Page 15: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation15 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS PersonalAccount INHERITS Account:

METHOD PUBLIC OVERRIDE VOID Withdraw (INPUT amt AS DECIMAL): /* code */

END METHOD.

METHOD PUBLIC OVERRIDE VOID PayInterest (INPUT rate AS DECIMAL):

/* code */

END METHOD.

END CLASS.

Page 16: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation16 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS BusinessAccount INHERITS Account:

METHOD PUBLIC OVERRIDE VOID Deposit (INPUT amt AS DECIMAL):

/* code */

END METHOD.

METHOD PUBLIC OVERRIDE VOID PayInterest (INPUT rate AS DECIMAL):

/* code */

END METHOD.

END CLASS.

Page 17: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation17 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS BankBranch:

METHOD PUBLIC Account CreateAccount():

/* code */

END METHOD.

END CLASS.

Page 18: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation18 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS RetailBranch INHERITS BankBranch:

METHOD PUBLIC OVERRIDE Account CreateAccount(): DEF VAR rAccount AS CLASS PersonalAccount NO-UNDO. rAccount = NEW PersonalAccount(). RETURN rAccount.

END METHOD.

END CLASS.

Page 19: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation19 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

CLASS CommercialBranch INHERITS BankBranch:

METHOD PUBLIC OVERRIDE Account CreateAccount(): DEF VAR rAccount AS CLASS BusinessAccount NO-UNDO. rAccount = NEW BusinessAccount(). RETURN rAccount.

END METHOD.

END CLASS.

Page 20: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation20 Leveraging Design Patterns in ABL Applications

Factory Method Pattern Example

Main:DO:

DEF VAR rBranch AS CLASS BankBranch NO-UNDO. DEF VAR rAccount AS CLASS Account NO-UNDO.

rBranch = NEW RetailBranch(). rAccount = rBranch:CreateAccount(). rAccount:deposit(1000.00). rAccount:withdraw(500.00). rAccount:payInterest(5.25).

rBranch = NEW CommercialBranch(). rAccount = rBranch:CreateAccount(). rAccount:deposit(1000.00). rAccount:withdraw(500.00). rAccount:payInterest(5.25).

END.

Page 21: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation21 Leveraging Design Patterns in ABL Applications

State Pattern

Name: State

Classification: Behavioral

Motivation: Allow an object to alter its behavior at run-time when its internal state changes.

Applicability: An object must change it behavior at run-time depending on its internal state.

Participants: Context, State, ConcreteState subclasses

Page 22: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation22 Leveraging Design Patterns in ABL Applications

State Pattern Structure

Page 23: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation23 Leveraging Design Patterns in ABL Applications

State Pattern Example

Page 24: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation24 Leveraging Design Patterns in ABL Applications

State Pattern Example

CLASS Account:

DEF PRIVATE VAR rState AS CLASS AccountState NO-UNDO. DEF PUBLIC VAR balance AS DECIMAL NO-UNDO.

CONSTRUCTOR PUBLIC Account (): checkState(). END CONSTRUCTOR.

METHOD PUBLIC VOID Deposit(INPUT amt as DECIMAL): rState:Deposit(amt). checkState(). END METHOD.

METHOD PUBLIC VOID Withdraw(INPUT amt AS DECIMAL): rState:Withdraw(amt). checkState(). END METHOD.

METHOD PUBLIC VOID CalcInterest(): rState:CalcInterest(). checkState(). END METHOD.

Page 25: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation25 Leveraging Design Patterns in ABL Applications

State Pattern Example

METHOD PRIVATE VOID checkState(): IF balance < 0 THEN DO: IF rState <> ? THEN DELETE OBJECT rState. rState = NEW OverdrawnState(THIS-OBJECT). END. ELSE IF balance >= 0 AND balance < 1000 THEN DO: IF rState <> ? THEN DELETE OBJECT rState. rState = NEW NonInterestState(THIS-OBJECT). END. ELSE DO: IF rState <> ? THEN DELETE OBJECT rState. rState = NEW InterestState(THIS-OBJECT). END. END METHOD. END CLASS.

Page 26: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation26 Leveraging Design Patterns in ABL Applications

State Pattern Example

CLASS AccountState:

DEF PROTECTED VAR rAccount AS CLASS Account NO-UNDO.

CONSTRUCTOR PUBLIC AccountState (INPUT acc AS CLASS Account): rAccount = acc. END CONSTRUCTOR.

METHOD PUBLIC VOID Deposit (INPUT amt AS DECIMAL):

rAccount:balance = rAccount:balance + amt. END METHOD.

METHOD PUBLIC VOID Withdraw (INPUT amt AS DECIMAL):

rAccount:balance = rAccount:balance - amt. END METHOD.

METHOD PUBLIC VOID CalcInterest(): /* To be overridden */ END METHOD.

END CLASS.

Page 27: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation27 Leveraging Design Patterns in ABL Applications

State Pattern Example

CLASS NonInterestState INHERITS AccountState:

CONSTRUCTOR PUBLIC NonInterestState (INPUT acc AS CLASS Account):

SUPER(acc).

END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID CalcInterest():

/* do nothing, no interest */ END METHOD.

END CLASS.

Page 28: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation28 Leveraging Design Patterns in ABL Applications

State Pattern Example

CLASS InterestState INHERITS AccountState:

CONSTRUCTOR PUBLIC InterestState (INPUT acc AS CLASS Account):

SUPER(acc). END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID CalcInterest():

rAccount:balance = rAccount:balance + (rAccount:balance * 0.0325).

END METHOD.

END CLASS.

Page 29: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation29 Leveraging Design Patterns in ABL Applications

State Pattern Example

CLASS OverdrawnState INHERITS AccountState:

CONSTRUCTOR PUBLIC OverdrawnState (INPUT acc AS CLASS Account):

SUPER(acc). END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID Withdraw (INPUT amt AS DECIMAL): /* overdrawn, do not change balance */ END METHOD. METHOD PUBLIC OVERRIDE VOID CalcInterest():

rAccount:balance = rAccount:balance – (rAccount:balance * 0.1325).

END METHOD.

END CLASS.

Page 30: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation30 Leveraging Design Patterns in ABL Applications

State Pattern Example

Main:DO:

DEF VAR rAccount AS CLASS Account NO-UNDO.

rAccount = NEW Account(). rAccount:CalcInterest().

rAccount:Deposit(500.00). rAccount:CalcInterest().

rAccount:Deposit(600.00). rAccount:CalcInterest(). rAccount:Withdraw(200.00). rAccount:CalcInterest(). rAccount:Withdraw(1000.00). rAccount:CalcInterest().

END.

Page 31: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation31 Leveraging Design Patterns in ABL Applications

Decorator Pattern

Name: Decorator

Classification: Structural

Motivation: Attach additional functionality to an object dynamically

Applicability: When extension is required without impacting other classes and subclassing is difficult.

Participants: Component, ConcreteComponent, Decorator,ConcreteDecorator

Page 32: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation32 Leveraging Design Patterns in ABL Applications

Decorator Pattern Structure

Page 33: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation33 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

Page 34: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation34 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

CLASS Account:

DEF PROTECTED PROPERTY balance AS DECIMAL NO-UNDO GET. SET.

CONSTRUCTOR PUBLIC Account():

balance = 0.

END CONSTRUCTOR.

METHOD PUBLIC VOID Withdraw (INPUT amt AS DECIMAL):

/* to be overridden */ END METHOD.

END CLASS.

Page 35: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation35 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

CLASS CheckingAccount INHERITS Account:

METHOD PUBLIC OVERRIDE VOID Withdraw (INPUT amt AS DECIMAL ): balance = balance - amt.

END METHOD.

END CLASS.

Page 36: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation36 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

CLASS AccountDecorator INHERITS Account:

DEF PROTECTED VAR rAccount AS CLASS Account NO-UNDO.

CONSTRUCTOR PUBLIC AccountDecorator (INPUT acc AS CLASS Account):

rAccount = acc.

END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID Withdraw (INPUT amt AS DECIMAL):

rAccount:Withdraw(amt).

END METHOD.

END CLASS.

Page 37: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation37 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

CLASS AuditedAccount INHERITS AccountDecorator:

CONSTRUCTOR PUBLIC AuditedAccount (INPUT acc AS Account):

SUPER(acc).

END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID Withdraw (INPUT amt AS DECIMAL):

SUPER:Withdraw(amt). AuditWithdrawal(amt).

END METHOD.

METHOD PRIVATE VOID AuditWithdrawal (INPUT amt AS DECIMAL):

/* some auditing code */

END METHOD.

END CLASS.

Page 38: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation38 Leveraging Design Patterns in ABL Applications

Decorator Pattern Example

Main:DO:

DEF VAR rAccount AS CLASS Account NO-UNDO.

DEF VAR rAuditedAccount AS CLASS AuditedAccount NO-UNDO.

rAccount = NEW Account().

rAccount:Withdraw(1000.00).

rAuditedAccount = NEW AuditedAccount(rAccount).

rAuditedAccount:Withdraw(1000.00).

END.

Page 39: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation39 Leveraging Design Patterns in ABL Applications

Observer Pattern

Name: Observer

Classification: Behavioral

Motivation: Establish a one-to-many relationship between objects so that a state change in one object notifies all related objects.

Applicability: When a state change in one object requires subsequent state changes in several others without knowing the details of the other objects and while avoiding tight-coupling.

Participants: Subject, Observer, ConcreteSubject, ConcreteObserver

Page 40: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation40 Leveraging Design Patterns in ABL Applications

Observer Pattern Structure

Page 41: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation41 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

Page 42: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation42 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

CLASS Subject: DEF PROTECTED TEMP-TABLE ttObserver NO-UNDO FIELD observer AS CLASS PROGRESS.Lang.Object.

METHOD PUBLIC VOID Attach (INPUT observer AS CLASS Observer): IF NOT CAN-FIND(ttObserver WHERE ttObserver.observer = observer) THEN DO: CREATE ttObserver. ttObserver.observer = observer. END. END METHOD.

METHOD PUBLIC VOID Detach (INPUT observer AS CLASS Observer): FIND FIRST ttObserver WHERE ttObserver.observer = observer NO-ERROR. IF AVAILABLE ttObserver THEN DELETE ttObserver. END METHOD.

Page 43: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation43 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

METHOD PUBLIC VOID Notify(): DEFINE VAR rObserver AS CLASS Observer NO-UNDO. FOR EACH ttObserver: rObserver = CAST(ttObserver.observer, Observer). rObserver:Action(THIS-OBJECT). END. END METHOD.

END CLASS.

Page 44: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation44 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

CLASS Stock INHERITS Subject:

DEF PUBLIC PROPERTY symbol AS CHAR NO-UNDO GET. SET. DEF PUBLIC PROPERTY price AS DECIMAL NO-UNDO GET . SET (INPUT piPrice AS DECIMAL): price = piPrice. Notify(). END SET.

CONSTRUCTOR PUBLIC Stock (INPUT newSymbol AS CHAR, INPUT newPrice AS DEC):

SUPER (). symbol = newSymbol. price = newprice. END CONSTRUCTOR. END CLASS.

Page 45: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation45 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

CLASS Observer:

METHOD PUBLIC VOID Action (INPUT subject AS CLASS Subject):

/* to be overridden */

END METHOD.

END CLASS.

Page 46: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation46 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

CLASS Investor INHERITS Observer:

DEF PRIVATE PROPERTY name AS CHAR NO-UNDO GET. SET.

CONSTRUCTOR PUBLIC Investor (INPUT newName AS CHAR):

name = newName.

END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID Action (INPUT subject AS Subject): DEF VAR rStock AS CLASS Stock NO-UNDO. rStock = CAST (subject,Stock). MESSAGE NAME rStock:price VIEW-AS ALERT-BOX.

END METHOD.

END CLASS.

Page 47: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation47 Leveraging Design Patterns in ABL Applications

Observer Pattern Example

Main:DO:

DEF VAR rStock AS CLASS Stock NO-UNDO.

DEF VAR rInvestor1 AS CLASS Investor NO-UNDO. DEF VAR rInvestor2 AS CLASS Investor NO-UNDO.

rInvestor1 = NEW Investor("J Johnson"). rInvestor2 = NEW Investor("B Blogs").

rStock = NEW Stock("PRGS", 33.00). rStock:Attach(rInvestor1). rStock:Attach(rInvestor2).

rStock:price = 34.00. rStock:price = 35.00. rStock:DETACH(rInvestor2). rStock:price = 36.00. rStock:Detach(rInvestor1). rStock:price = 29.00. END.

Page 48: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation48 Leveraging Design Patterns in ABL Applications

Command Pattern

Name: Command

Classification: Behavioral

Motivation: Encapsulate a request as an object enabling the queuing and logging of requests and the un-doing and re-doing of operations.

Applicability: When support for undo and redo is required.

Participants: Command, ConcreteCommand, Client, Invoker, Receiver

Page 49: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation49 Leveraging Design Patterns in ABL Applications

Command Pattern Structure

Page 50: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation50 Leveraging Design Patterns in ABL Applications

Command Pattern Example

Page 51: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation51 Leveraging Design Patterns in ABL Applications

Command Pattern Example

CLASS Account:

DEF VAR rCalculator AS CLASS AccountCalculator NO-UNDO.

DEF PROTECTED TEMP-TABLE ttCommand NO-UNDO FIELD commandNum AS INT FIELD command AS CLASS PROGRESS.Lang.Object INDEX num commandNum.

DEF PRIVATE VAR curr AS INT INIT 0 NO-UNDO.

CONSTRUCTOR PUBLIC Account(): rCalculator = NEW AccountCalculator(). END CONSTRUCTOR. …

Page 52: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation52 Leveraging Design Patterns in ABL Applications

Command Pattern Example

… METHOD PUBLIC VOID CalcBalance (INPUT operator AS CHA, INPUT operand AS DECIMAL): DEF VAR rCommand AS CLASS COMMAND NO-UNDO. rCommand = NEW AccountCommand(rCalculator,operator,operand). rCommand:EXECUTE(). CREATE ttCommand. curr = curr + 1. ttCommand.commandNum = curr. ttCommand.command = rCommand.

END.

Page 53: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation53 Leveraging Design Patterns in ABL Applications

Command Pattern Example

METHOD PUBLIC VOID CommandRedo(INPUT levels AS INT):

DEF VAR l AS INT NO-UNDO. DEF VAR lastNum AS INT NO-UNDO. DEF VAR rCommand AS CLASS COMMAND NO-UNDO. FIND LAST ttCommand NO-ERROR. IF AVAILABLE ttCommand THEN lastNum = ttCommand.commandNum. DO l = 1 TO levels: IF curr > lastNum THEN DO: curr = lastNum. LEAVE. END. ELSE

Page 54: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation54 Leveraging Design Patterns in ABL Applications

Command Pattern Example

DO: FIND FIRST ttCommand WHERE ttCommand.commandNum = curr NO-ERROR. IF AVAILABLE ttCommand THEN DO: rCommand = CAST (ttCommand.command, Command). rCommand:Execute(). curr = curr + 1. END. END. END. END METHOD.

END CLASS.

Page 55: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation55 Leveraging Design Patterns in ABL Applications

Command Pattern Example

CLASS AccountCalculator:

DEFINE PRIVATE VAR curr AS DECIMAL INIT 0 NO-UNDO.

METHOD PUBLIC VOID Operation (INPUT operator AS CHA, INPUT operand AS DECIMAL):

CASE operator: WHEN '+' THEN curr = curr + operand. WHEN '-' THEN curr = curr - operand. WHEN '*' THEN curr = curr * operand. WHEN '/' THEN curr = curr / operand. END CASE. MESSAGE curr operator operand VIEW-AS ALERT-BOX. END.

END CLASS.

Page 56: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation56 Leveraging Design Patterns in ABL Applications

Command Pattern Example

CLASS Command:

METHOD PUBLIC VOID EXECUTE ():

/* to be overridden */ END METHOD.

METHOD PUBLIC VOID UnExecute ():

/* to be overridden */ END METHOD.

END CLASS.

Page 57: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation57 Leveraging Design Patterns in ABL Applications

Command Pattern Example

CLASS AccountCommand INHERITS Command:

DEF PUBLIC VAR accountCalculator AS CLASS AccountCalculator NO-UNDO. DEF PUBLIC PROPERTY operator AS CHAR NO-UNDO GET . SET . DEF PUBLIC PROPERTY operand AS DECIMAL NO-UNDO GET . SET . CONSTRUCTOR PUBLIC AccountCommand (INPUT calc AS CLASS AccountCalculator, INPUT opor AS CHAR, INPUT opand AS DECIMAL ): accountCalculator = calc. operator = opor. operand = opand. END CONSTRUCTOR.

METHOD PUBLIC OVERRIDE VOID EXECUTE():

accountCalculator:Operation (operator,operand). END METHOD.

Page 58: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation58 Leveraging Design Patterns in ABL Applications

Command Pattern Example

METHOD PUBLIC OVERRIDE VOID UnExecute():

DEF VAR undoOperator AS CHAR NO-UNDO. undoOperator = GetUndo(operator). accountCalculator:Operation (undoOperator,operand). END METHOD.

METHOD PRIVATE CHAR GetUndo (INPUT operator AS char): DEF VAR undoOperator AS CHAR NO-UNDO. CASE operator: WHEN '+' THEN undoOperator = '-'. WHEN '-' THEN undoOperator = '+'. WHEN '*' THEN undoOperator = '/'. WHEN '/' THEN undoOperator = '*'. OTHERWISE undoOperator = ' '. END CASE. RETURN undoOperator. END METHOD.

END CLASS.

Page 59: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation59 Leveraging Design Patterns in ABL Applications

Command Pattern Example

Main:DO:

DEF VAR rAccount AS CLASS Account NO-UNDO.

rAccount = NEW Account().

rAccount:CalcBalance("+", 100.00). rAccount:CalcBalance("-", 50.00). rAccount:CalcBalance("*", 1.0525). rAccount:CalcBalance("/", 2).

rAccount:CommandUndo(3).

rAccount:CommandRedo(2). END.

Page 60: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation60 Leveraging Design Patterns in ABL Applications

Sources of Design Patterns

Gang of Four (GoF) Core J2EE Pattern-Oriented Software Architecture (POSA) Patterns of Enterprise Application Architecture

(Fowler) Microsoft Solution Patterns Enterprise Integration Patterns (Hohpe & Woolf) Microsoft Integration Patterns

Page 61: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation61 Leveraging Design Patterns in ABL Applications

Other Relevant Design Patterns

Enterprise Application Patterns• Data Mapper

• Unit of Work

• Lazy Load

• Foreign Key Mapping

• Inheritance Mappers

Page 62: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation62 Leveraging Design Patterns in ABL Applications

Limitations of Design Patterns

Not a panacea Not directly reuse-able unlike components Just another set of abstractions Very dependent upon situation & context Don’t always apply to real-world situations More readily implemented in some

programming languages and not others

Page 63: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation63 Leveraging Design Patterns in ABL Applications

In Summary

Many common design problems already have tried and proven solutions

Some wheels have already been invented

Design patterns exist in the public domain

Design patterns can be readily implemented in OpenEdge ABL

Page 64: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation64 Leveraging Design Patterns in ABL Applications

For More Information, go to…

PSDN• Implementing the OpenEdge Reference Architecture

with Classes• http://

www.psdn.com/library/kbcategory.jspa?categoryID=1212

Progress eLearning Community• What's New OE 10.1 Object Oriented Programming

Documentation• 10.1B Object-oriented Programming manual • 10.1B New and Revised Features manual

Page 65: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation65 Leveraging Design Patterns in ABL Applications

Relevant Exchange 2007Sessions

DEV-6: Getting Started with Object-Oriented Programming

DEV-12: Object-Oriented Programming in OpenEdge ABL

DEV-20: Using Classes & Procedures in OpenEdge 10.1B

ARCH-7: A Class-Based Implementation of the OERA

Page 66: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation66 Leveraging Design Patterns in ABL Applications

Questions?

Page 67: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation67 Leveraging Design Patterns in ABL Applications

Thank you foryour time

Page 68: Leveraging Design Patterns in ABL Applications Phillip Magnay Technical Architect

© 2007 Progress Software Corporation68 Leveraging Design Patterns in ABL Applications