figure 10-1, model transformations, refactorings, forward engineering, and reverse engineering

Post on 22-Jan-2016

41 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering. Forward engineering. Refactoring. Model transformation. Reverse engineering. Model space. Source code space. Figure 10-2, An example of an object model transformation. - PowerPoint PPT Presentation

TRANSCRIPT

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 1

Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering.

Source code spaceModel space

Modeltransformation

RefactoringForward engineering

Reverse engineering

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 2

Figure 10-2, An example of an object model transformation.

Player

Object design model before transformation

Object design model after transformation

AdvertiserLeagueOwner

User

+email:Address

Advertiser

+email:Address

Player

+email:Address

LeagueOwner

+email:Address

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 3

Figure 10-3, Applying the Pull Up Field refactoring.

Before refactoring

public class Player {private String email;//...

}public class LeagueOwner {

private String eMail;//...

}public class Advertiser {

private String email_address;//...

}

After refactoringpublic class User {

private String email;}public class Player extends User {

//...}public class LeagueOwner extends

User {//...

}public class Advertiser extends

User {//...

}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 4

Figure 10-4, Pull Up Constructor Body refactoring.Before refactoring

public class User {private String email;

}

public class Player extends User {public Player(String email) {

this.email = email;}

}public class LeagueOwner extends

User{public LeagueOwner(String email) {

this.email = email;}

}public class Advertiser extends User{

public Advertiser(String email) {this.email = email;

}}

After refactoring

public class User {public User(String email) {

this.email = email;}

}public class Player extends User {

public Player(String email) {super(email);

}}public class LeagueOwner extends User

{public LeagueOwner(String email) {

super(email);}

}public class Advertiser extends User {

public Advertiser(String email) {super(email);

}}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 5

Figure 10-5, Realization of User and LeagueOwner

public class User {private String email;public String getEmail() {

return email;}public void setEmail(String value){

email = value;}public void notify(String msg) {

// ....}/* Other methods omitted */

}

public class LeagueOwner extends User {

private int maxNumLeagues;

public int getMaxNumLeagues() {

return maxNumLeagues;

}

public void setMaxNumLeagues

(int value) {

maxNumLeagues = value;

}

/* Other methods omitted */

}

User LeagueOwner

+maxNumLeagues:int

Object design model before transformation

Source code after transformation

+email:String+notify(msg:String)

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 6

Figure 10-6, Collapsing an object without interesting behavior into an attribute

Person SocialSecurity

number:String

Person

SSN:String

Object design model before transformation

Object design model after transformation

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 7

Figure 10-7, Delaying expensive computations

Image

filename:String

paint()

Image

filename:String

RealImage

data:byte[]

data:byte[]

ImageProxy

filename:String

image

1 0..1

Object design model before transformation

Object design model after transformation

paint()

paint() paint()

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 8

Figure 10-8, Realization of a unidirectional, one-to-one association

public class Advertiser {private Account account;public Advertiser() {

account = new Account();}public Account getAccount() {

return account;}

}

AccountAdvertiser11

Object design model before transformation

Source code after transformation

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 9

Figure 10-9, Realization of a bidirectional one-to-one association

public class Advertiser extends User{

/* The account field is initialized

* in the constructor and never

* modified. */

private Account account;

public Advertiser() {

account = new Account(this);

}

public Account getAccount() {

return account;

}

}

AccountAdvertiser11

Object design model before transformation

Source code after transformation

public class Account {/* The owner field is initialized * during the constructor and * never modified. */private Advertiser owner;

public Account(owner:Advertiser) {this.owner = owner;

}public Advertiser getOwner() {

return owner;}

}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 10

Figure 10-10, Realization of a bidirectional, one-to-many association

public class Advertiser {

private Set accounts;

public Advertiser() {

accounts = new HashSet();

}

public void addAccount(Account a) {

accounts.add(a);

a.setOwner(this);

}

public void removeAccount(Account a) {

accounts.remove(a);

a.setOwner(null);

}

}

public class Account {

private Advertiser owner;

public void setOwner(Advertiser newOwner) {

if (owner != newOwner) {

Advertiser old = owner;

owner = newOwner;

if (newOwner != null)

newOwner.addAccount(this);

if (oldOwner != null)

old.removeAccount(this);

}

}

}

Advertiser Account1 *

Object design model before transformation

Source code after transformation

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 11

Figure 10-11, Realization of a bidirectional, many-to-many association

public class Tournament {

private List players;

public Tournament() {

players = new ArrayList();

}

public void addPlayer(Player p) {

if (!players.contains(p)) {

players.add(p);

p.addTournament(this);

}

}

}

public class Player {

private List tournaments;

public Player() {

tournaments = new ArrayList();

}

public void addTournament(Tournament t) {

if (!tournaments.contains(t)) {

tournaments.add(t);

t.addPlayer(this);

}

}

}

Tournament Player* *

Object design model before transformation

Source code after transformation

{ordered}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 12

Figure 10-12, Realization of a bidirectional qualified association

PlayernickName0..1*

Object design model before forward engineering

League

Player**

Object design model before transformation

League

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 13

Figure 10-12, Realization of a bidirectional qualified association (continued)

public class League {

private Map players;

public void addPlayer(String nickName, Player p) {

if (!players.containsKey(nickName))

{

players.put(nickName, p);

p.addLeague(nickName, this);

}

}

}

public class Player {

private Map leagues;

public void addLeague

(String nickName, League l) {

if (!leagues.containsKey(l)) {

leagues.put(l, nickName);

l.addPlayer(nickName, this);

}

}

}

Source code after forward engineering

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 14

Figure 10-13, Transformation of an association class into an object and two binary associations

Tournament Player* *

Tournament Player* *

Object design model before transformation

Object design model after transformation

Statistics

1 1

+getAverageStat(name)+ getTotalStat(name)+ updateStats(match)

Statistics

+getAverageStat(name)+ getTotalStat(name)+ updateStats(match)

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 15

Figure 10-14, Example of exception handling in Java.

public class TournamentControl {private Tournament tournament;public void addPlayer(Player p) throws KnownPlayerException {

if (tournament.isPlayerAccepted(p)) {throw new KnownPlayerException(p);

}//... Normal addPlayer behavior

}}public class TournamentForm {

private TournamentControl control;private ArrayList players;public void processPlayerApplications() {

// Go through all the players who applied for this tournamentfor (Iteration i = players.iterator(); i.hasNext();) {

try {// Delegate to the control object.control.acceptPlayer((Player)i.next());

} catch (KnownPlayerException e) {// If an exception was caught, log it to the console, and // proceed to the next player.ErrorConsole.log(e.getMessage());

}}

}}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 16

Figure 10-15, A complete implementation of the Tournament.addPlayer() contract.

Tournament

+isPlayerAccepted(p:Player):boolean+addPlayer(p:Player)

+getMaxNumPlayers():int

-maxNumPlayers: int«precondition»

!isPlayerAccepted(p)

«invariant»getMaxNumPlayers() > 0

«precondition»getNumPlayers() <

getMaxNumPlayers()

+getNumPlayers():int

«postcondition»isPlayerAccepted(p)

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 17

Figure 10-16, An example of a relational table, with three attributes and three data records.

login email

“am384” “am384@mail.org”

“js289” “john@mail.de”

User table

firstName

“alice”

“john”

“bd” “bobd@mail.ch”“bob”

Candidate keyCandidate key

Primary key

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 18

Figure 10-17, An example of a foreign key. The owner attribute in the League table refers to the primary key of the User table in Figure 10-16.

login

“am384”

“am384”

League table

name

“tictactoeNovice”

“tictactoeExpert”

“js289”“chessNovice”

Foreign key referencing User table

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 19

Figure 10-18, Forward engineering of the User class to a database table

User

+firstName:String+login:String+email:String

id:long firstName:text[25] login:text[8] email:text[32]

User table

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 20

Figure 10-19, Mapping of the LeagueOwner/League association as a buried association.

id:long owner:long

LeagueLeagueOwner

LeagueOwner table League table

...... id:long

*1

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 21

Figure 10-20, Mapping of the Tournament/Player association as a separate table.

id

PlayerTournament

Tournament table Player table

**

tournament player

TournamentPlayerAssociation table

23 23

name ...

novice

24 expert

id

56

name ...

alice

79 john

56

23 79

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 22

Figure 10-21, Realizing the User inheritance hierarchy with a separate table.

id

Player

User

LeagueOwner table Player table

User table

56

maxNumLeagues ...

12

id

79

credits ...

126

LeagueOwner

id

56

name ...

zoe

79 john

role

LeagueOwner

Player

maxNumLeagues credits

name

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 23

Figure 10-22, Realizing the User inheritance hierarchy by duplicating columns.

id

Player

User

LeagueOwner table Player table

56

maxNumLeagues ...

12

id

79

credits ...

126

LeagueOwner

maxNumLeagues credits

name

name

zoe

name

john

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 24

Figure 10-23, Statistics as a product in the Game Abstract Factory

Game

createStatistics()

ChessGameTicTacToeGame

TTTStatistics ChessStatistics

Tournament

Statistics

update()getStat()

DefaultStatistics

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 25

Figure 10-24, N-ary association class Statistics relating League, Tournament, and Player

Tournament

0..10..10..1

1 *

1

LeagueGame Player

Statistics

0..1

1

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 26

Figure 10-25, SimpleStatisticsVault object realizing the N-ary association of Figure 10-24.

TournamentControl

Statistics

update(match,player)getStatNames()

SimpleStatisticsVault

getStatisticsObject(game,player)getStatisticsObject(league,player)getStatisticsObject(tournament,player)

StatisticsView

Game

createStatistics()

getStat(name)

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 27

Figure 10-26, StatisticsVault as a Facade shielding the control and boundary objects from the Statistics storage and computation

TournamentControl

Statistics

update(match,player)getStatNames()

StatisticsVault

update(match)getStatNames(game)getStat(name,game,player)getStat(name,league,player)getStat(name,tournament,player)

StatisticsView

Game

createStatistics()

getStat(name)

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 28

Figure 10-27, Public interface of the StatisticsVault class (Java).

public class StatisticsVault {public void update(Match m)

throws InvalidMatch, MatchNotCompleted {...}

public List getStatNames() {...}

public double getStat(String name, Game g, Player p)throws UnknownStatistic, InvalidScope {...}

public double getStat(String name, League l, Player p)throws UnknownStatistic, InvalidScope {...}

public double getStat(String name, Tournament t, Player p)throws UnknownStatistic, InvalidScope {...}

}

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 29

Figure 10-28, Database schema for the Statistics N-ary association of Figure 10-24.

scope:long

Statistics table

player:longscopetype:longid:long

id:long

StatisticCounters table

name:text[25] value:double

id:long

League table

...id:long

Game table

... id:long

Tournament table

...

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 30

Figure 10-29, Associations among Messages, Folders, Mailboxes, and Views in a hypothetical email client

Mailbox Folder Message

View

1 * *

*

1 *

Bernd Bruegge & Allen H. Dutoit Object-Oriented Software Engineering: Using UML, Patterns, and Java 31

Figure 10-30, Associations among League, Tournament, Round, and Player within ARENA

League Tournament Round

Player

1 * *

*

1 *

top related