And so to Code. Forward, Reverse, and Round-Trip Engineering Forward Engineering Reverse Engineering...

Preview:

Citation preview

And so to Code

Forward, Reverse, and Round-Trip Engineering

• Forward Engineering • Reverse Engineering• Round-Trip Engineering

Forward Engineering• Forward engineering means the generation of code from

UML diagrams• Many of the tools can only do the static models:

– They can generate class diagrams from code, but can't generate interaction diagrams.

– For forward engineering, they can generate the basic (e.g., Java) class definition from a class diagram, but not the method bodies from interaction diagrams.

• Demo Generate

Reverse Engineering• Reverse engineering means generation of UML diagrams

from code• Demo

Re-Engineer

Round-Trip Engineering• Round-trip engineering closes the loop

– the tool supports generation in either direction and can synchronize between UML diagrams and code, ideally automatically and immediately as either is changed.

• Demo

Mapping Designs to Code

• Creating Class Definitions from Class Diagram• Creating Methods from Interaction Diagrams• Using Collection Classes to implement

relationships Code

Creating Class Definitions from Class Diagram

Creating Methods from Interaction Diagrams

Collection Classes in Code

.NET Sequence & Object Diagrams

Exercises

1. Draw a sequence diagram to model the following code

public class Cat{

private Person owner;

public void Kick(){

Meow();owner.Bite();

}

public void Meow(){}

}

public class Person{

private Cat cat;

public void KickCat(){

// start herecat.Kick();

}

public void Bite(){}

}

public class Cat{

private Person owner;

public void Kick(){

Meow();owner.Bite();

}

public void Meow(){}

}

public class Person{

private Cat cat;

public void KickCat(){

// start herecat.Kick();

}

public void Bite(){}

}

Solution

public class Cat{

private Person owner;

public void Kick(){

Meow();owner.Bite();

}

public void Meow(){}

}

public class Person{

private Cat cat;

public void KickCat(){

// start herecat.Kick();

}

public void Bite(){}

}

public class Cat{

private Person owner;

public void Kick(){

Meow();owner.Bite();

}

public void Meow(){}

}

public class Person{

private Cat cat;

public void KickCat(){

// start herecat.Kick();

}

public void Bite(){}

}

/owner : Person cat : Cat

Kick()

Meow()Bite()

2. Draw a sequence diagram to model the following code

public class Cat{

private Person owner;

public void Kick(){

Meow();if(owner != null){

owner.Bite();}

}

public void Meow(){}

}

public class Person{

private IList cats;

public void KickCat(){

// start hereforeach(Cat cat in cats){

cat.Kick();}

}

public void Bite(){}

}

public class Cat{

private Person owner;

public void Kick(){

Meow();if(owner != null){

owner.Bite();}

}

public void Meow(){}

}

public class Person{

private IList cats;

public void KickCat(){

// start hereforeach(Cat cat in cats){

cat.Kick();}

}

public void Bite(){}

}

/owner : Person cat : Cat

Kick()

Meow()

[owner != null] Bite()

[for each cat in cats]

Solution

public class Cat{

private Person owner;

public void Kick(){

Meow();if(owner != null){

owner.Bite();}

}

public void Meow(){}

}

public class Person{

private IList cats;

public void KickCat(){

// start hereforeach(Cat cat in cats){

cat.Kick();}

}

public void Bite(){}

}

public class Cat{

private Person owner;

public void Kick(){

Meow();if(owner != null){

owner.Bite();}

}

public void Meow(){}

}

public class Person{

private IList cats;

public void KickCat(){

// start hereforeach(Cat cat in cats){

cat.Kick();}

}

public void Bite(){}

}

UML Exercises :

Class Diagrams for .NET Developers

Draw a class diagram based on the following code

public class Whiskey{

private IList tangos;

public Whiskey(){

tangos = new ArrayList();}

public void AddTango(Tango tango){

tangos.Add(tango);}

}

public class Tango : Foxtrot{

public void Lima(){}

}

public interface Foxtrot{

void Lima();}

public class Whiskey{

private IList tangos;

public Whiskey(){

tangos = new ArrayList();}

public void AddTango(Tango tango){

tangos.Add(tango);}

}

public class Tango : Foxtrot{

public void Lima(){}

}

public interface Foxtrot{

void Lima();}

Whiskey

Whiskey()AddTango(tango : Tango)

Tango

Lima()

*

tangos

<<interface>>Foxtrot

Lima()

Multiplicity at this end is ambiguous

Solutionpublic class Whiskey{

private IList tangos;

public Whiskey(){

tangos = new ArrayList();}

public void AddTango(Tango tango){

tangos.Add(tango);}

}

public class Tango : Foxtrot{

public void Lima(){}

}

public interface Foxtrot{

void Lima();}

public class Whiskey{

private IList tangos;

public Whiskey(){

tangos = new ArrayList();}

public void AddTango(Tango tango){

tangos.Add(tango);}

}

public class Tango : Foxtrot{

public void Lima(){}

}

public interface Foxtrot{

void Lima();}

4. Draw a class diagram based on the following code

Party

# id : int

FullName() : string

Person

-firstName : string-lastName : string

FirstName() : stringFirstName(value : string)LastName() : stringLastName(value : string)FullName() : string = firstName + “ “ + lastName

Solution

public abstract class Party{

protected int id;

public abstract string FullName { get; }}

public class Person : Party{

private string firstName;private string lastName;

public string FirstName{

get { return firstName; }set { firstName = value; }

}

public string LastName{

get { return lastName; }set {lastName = value; }

}

public override string FullName{

get { return firstName + " " + lastName; }}

}

public abstract class Party{

protected int id;

public abstract string FullName { get; }}

public class Person : Party{

private string firstName;private string lastName;

public string FirstName{

get { return firstName; }set { firstName = value; }

}

public string LastName{

get { return lastName; }set {lastName = value; }

}

public override string FullName{

get { return firstName + " " + lastName; }}

}

Three Very Simple Use Cases

Create New Supplier

Delete Supplier

Update Supplier Details

Let’s consider some coding issues!

One “Entity” Class

clsSupplier

colSuppliedProduct : CollectionlngSupplierID : LongstrCompanyName : StringstrContactName : StringstrContactTitle : StringstrAddress : StringstrCity : StringstrRegion : StringstrPostalCode : StringstrCountry : StringstrPhone : StringstrFax : String

Delete()FindByID()Update()

(from Project1)

<<Class Module>>

Three Control Classes

Create New Supplier

Delete Supplier

Update Supplier Details

One Boundary Class for all Three Use Cases

One Boundary Class

One Class to Talk to the Database

Sequence Diagram for Create New Supplier

Supplier Form

Control Class

“Create Supplier”

Entity Class

“Supplier”

DB Connection

DBSupplier

Overview of the System Architecture

Project Window for the entire application

More Sophisticated Use Cases

Perhaps we could ask the Customer object to:

– Project future sales to this customer. This would involve analysing past sales to identify trends. Implies the need for a “Customer Sales History” class not currently included in the model.

– Collect overdue payments. This would involve generating standard letters to be sent to the customer. Implies collaboration with a “Payment” class (associated with Order or Invoice?) not currently included in the model.

Another Case Study

A Domain Model

A Class Diagram

Background to Naked Objects

‘Best practice’ in contemporary business systems design splits an application into four principal layers

Presentation

Application, Process, Task or Controller

Domain object model

Persistence

But “The Naked Objects Pattern” eliminates the controller layer by encapsulating all business functionality on the entity objects

Presentation

Application, Process or Use-case controller

Domain object model

Persistence

And has a generic presentation layer that automatically reflects the domain object model as an object-oriented user interface

Presentation

Application, Process or Use-case controller

Domain object model

Persistence

CarServ: A tale of two business applications

Good Idea?

• One of the research topics for the coursework element of this module

• Final project???

Recommended