Download - Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering
![Page 1: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/1.jpg)
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
![Page 2: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/2.jpg)
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
![Page 3: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/3.jpg)
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 {//...
}
![Page 4: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/4.jpg)
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);
}}
![Page 5: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/5.jpg)
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)
![Page 6: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/6.jpg)
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
![Page 7: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/7.jpg)
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()
![Page 8: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/8.jpg)
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
![Page 9: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/9.jpg)
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;}
}
![Page 10: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/10.jpg)
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
![Page 11: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/11.jpg)
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}
![Page 12: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/12.jpg)
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
![Page 13: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/13.jpg)
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
![Page 14: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/14.jpg)
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)
![Page 15: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/15.jpg)
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());
}}
}}
![Page 16: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/16.jpg)
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)
![Page 17: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/17.jpg)
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” “[email protected]”
“js289” “[email protected]”
User table
firstName
“alice”
“john”
“bd” “[email protected]”“bob”
Candidate keyCandidate key
Primary key
![Page 18: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/18.jpg)
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
![Page 19: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/19.jpg)
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
![Page 20: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/20.jpg)
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
![Page 21: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/21.jpg)
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
![Page 22: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/22.jpg)
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
![Page 23: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/23.jpg)
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
![Page 24: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/24.jpg)
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
![Page 25: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/25.jpg)
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
![Page 26: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/26.jpg)
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)
![Page 27: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/27.jpg)
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)
![Page 28: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/28.jpg)
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 {...}
}
![Page 29: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/29.jpg)
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
...
![Page 30: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/30.jpg)
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 *
![Page 31: Figure 10-1, Model transformations, refactorings, forward engineering, and reverse engineering](https://reader033.vdocuments.us/reader033/viewer/2022051418/56815161550346895dbf88be/html5/thumbnails/31.jpg)
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 *