Chapter 10, Mapping Models to Code - PowerPoint PPT Presentation

About This Presentation
Title:

Chapter 10, Mapping Models to Code

Description:

Mapping Models to Code Overview Object design is situated between system design and implementation. Object design is not very well understood and if not well done ... – PowerPoint PPT presentation

Number of Views:187
Avg rating:3.0/5.0
Slides: 49
Provided by: Bernd225
Category:

less

Transcript and Presenter's Notes

Title: Chapter 10, Mapping Models to Code


1
Chapter 10,Mapping Models to Code
2
Overview
  • Object design is situated between system design
    and implementation. Object design is not very
    well understood and if not well done, leads to a
    bad system implementation.
  • In this lecture, we describe a selection of
    transformations to illustrate a disciplined
    approach to implementation to avoid system
    degradation.
  • Operations on the object model
  • Optimizations to address performance requirements
  • Implementation of class model components
  • Realization of associations
  • Realization of operation contracts
  • Realizing entity objects based on selected
    storage strategy
  • Mapping the class model to a storage schema

3
Characteristics of Object Design Activities
  • Developers perform transformations to the object
    model to improve its modularity and performance.
  • Developers transform the associations of the
    object model into collections of object
    references, because programming languages do not
    support the concept of association.
  • If the programming language does not support
    contracts, the developer needs to write code for
    detecting and handling contract violations.
  • Developers often revise the interface
    specification to accommodate new requirements
    from the client.
  • All these activities are intellectually not
    challenging
  • However, they have a repetitive and mechanical
    flavor that makes them error prone.

4
State of the Art of Model-based Software
Engineering
  • The Vision
  • During object design we would like to implement
    a system that realizes the use cases specified
    during requirements elicitation and system
    design.
  • The Reality
  • Different developers usually handle contract
    violations differently.
  • Undocumented parameters are often added to the
    API to address a requirement change.
  • Additional attributes are usually added to the
    object model, but are not handled by the
    persistent data management system, possibly
    because of a miscommunication.
  • Many improvised code changes and workarounds that
    eventually yield to the degradation of the system.

5
Model transformations
6
Model Transformation Example
Object design model before transformation
Object design model after transformation
7
Refactoring Example Pull Up Field
  • public class User
  • private String email
  • public class Player extends User
  • //...
  • public class LeagueOwner extends User
  • //...
  • public class Advertiser extends User
  • //...
  • public class Player
  • private String email
  • //...
  • public class LeagueOwner
  • private String eMail
  • //...
  • public class Advertiser
  • private String email_address
  • //...

8
Refactoring Example Pull Up Constructor Body
  • 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)
  • 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 extendsUser
  • public Advertiser(String email)
  • this.email email

9
Forward Engineering Example
Object design model before transformation
LeagueOwner
User
maxNumLeaguesint
emailString
notify(msgString)
Source code after transformation
  • 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 /

10
Other Mapping Activities
  • Optimizing the Object Design Model
  • Mapping Associations
  • Mapping Contracts to Exceptions
  • Mapping Object Models to Tables

11
Collapsing an object without interesting behavior
Object design model before transformation
Person
SocialSecurity
numberString
?
Object design model after transformation
12
Delaying expensive computations
Object design model before transformation
?
Object design model after transformation
13
Other Mapping Activities
  • Optimizing the Object Design Model
  • Mapping Associations
  • Mapping Contracts to Exceptions
  • Mapping Object Models to Tables

14
Implement Associations
  • Strategy for implementing associations
  • Be as uniform as possible
  • Individual decision for each association
  • Example of uniform implementation
  • 1-to-1 association
  • Role names are treated like attributes in the
    classes and translate to references
  • 1-to-many association
  • Translate to Vector

15
Unidirectional 1-to-1 Association
Usually this transformation is automatically
applied by the CASE tool in the code model
16
Bidirectional 1-to-1 Association
Object design model before transformation
MapArea
ZoomInAction
1
1
Object design model after transformation
MapArea
ZoomInAction
-targetMapMapArea
-zoomInZoomInAction
getZoomInAction()
getTargetMap()
setZoomInAction(action)
setTargetMap(map)
17
1-to-Many Association
Object design model before
transformation
Layer
LayerElement
1

Object design model after transformation
Layer
LayerElement
-containedInLayer
-layerElementsSet
elements()
getLayer()
addElement(le)
setLayer(l)
removeElement(le)
18
Qualification
19
Realization of a unidirectional, one-to-one
association
Object design model before transformation
1
1
Account
Advertiser
?
Source code after transformation
public class Advertiser private Account
account public Advertiser() account new
Account() public Account getAccount()
return account
20
Bidirectional one-to-one association
Object design model before transformation
1
1
Advertiser
Account
Source code after transformation
  • public class Advertiser
  • / 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
  • public class Account
  • / The owner field is initialized
  • during the constructor and
  • never modified. /
  • private Advertiser owner
  • public Account(ownerAdvertiser)
  • this.owner owner
  • public Advertiser getOwner()
  • return owner

21
Bidirectional, one-to-many association
Object design model before transformation
1

Advertiser
Account
Source code after transformation
  • 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)
  • 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)

22
Bidirectional, many-to-many association
Object design model before transformation
ordered


Tournament
Player
Source code after transformation
  • 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)

23
Bidirectional qualified association
Object design model before transformation


League
Player
nickName
Object design model before forward engineering
Source code after forward engineering
24
Bidirectional qualified association (continued)
Source code after forward engineering
  • 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)

25
Transformation of an association class
Object design model before transformation
Statistics

getAverageStat(name)

getTotalStat(name)

updateStats(match)
Tournament
Player


Object design model after transformation 1 class
and two binary associations
26
Other Mapping Activities
  • Optimizing the Object Design Model
  • Mapping Associations
  • Mapping Contracts to Exceptions
  • Mapping Object Models to Tables

27
Exceptions as building blocks for contract
violations
  • Many object-oriented languages, including Java do
    not include built-in support for contracts.
  • However, we can use their exception mechanisms as
    building blocks for signaling and handling
    contract violations
  • In Java we use the try-throw-catch mechanism
  • Example
  • Let us assume the acceptPlayer() operation of
    TournamentControl is invoked with a player who is
    already part of the Tournament.
  • In this case acceptPlayer() should throw an
    exception of type KnownPlayer.
  • See source code on next slide

28
The try-throw-catch Mechanism 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
  • for (Iteration i players.iterator()
    i.hasNext())
  • try // Delegate to the control
    object.
  • control.addPlayer((Player)i.next())
  • catch (KnownPlayerException e)
  • // If an exception was caught, log it to the
    console

29
Implementing a contract
  • For each operation in the contract, do the
    following
  • Check precondition Check the precondition before
    the beginning of the method with a test that
    raises an exception if the precondition is false.
  • Check postcondition Check the postcondition at
    the end of the method and raise an exception if
    the contract is violated. If more than one
    postcondition is not satisfied, raise an
    exception only for the first violation.
  • Check invariant Check invariants at the same
    time as postconditions.
  • Deal with inheritance Encapsulate the checking
    code for preconditions and postconditions into
    separate methods that can be called from
    subclasses.

30
A complete implementation of the
Tournament.addPlayer() contract
31
Heuristics for Mapping Contracts to Exceptions
  • Be pragmatic, if you dont have enough time.
  • Omit checking code for postconditions and
    invariants.
  • Usually redundant with the code accomplishing
    the functionality of the class
  • Not likely to detect many bugs unless written by
    a separate tester.
  • Omit the checking code for private and protected
    methods.
  • Focus on components with the longest life
  • Focus on Entity objects, not on boundary objects
    associated with the user interface.
  • Reuse constraint checking code.
  • Many operations have similar preconditions.
  • Encapsulate constraint checking code into methods
    so that they can share the same exception classes.

32
Other Mapping Activities
  • Optimizing the Object Design Model
  • Mapping Associations
  • Mapping Contracts to Exceptions
  • Mapping Object Models to Tables

33
Mapping an object model to a relational database
  • UML object models can be mapped to relational
    databases
  • Some degradation occurs because all UML
    constructs must be mapped to a single relational
    database construct - the table.
  • UML mappings
  • Each class is mapped to a table
  • Each class attribute is mapped onto a column in
    the table
  • An instance of a class represents a row in the
    table
  • A many-to-many association is mapped into its own
    table
  • A one-to-many association is implemented as
    buried foreign key
  • Methods are not mapped

34
Mapping the User class to a database table
User
firstNameString
loginString
emailString
User table
idlong
firstNametext25
logintext8
emailtext32
35
Primary and Foreign Keys
  • Any set of attributes that could be used to
    uniquely identify any data record in a relational
    table is called a candidate key.
  • The actual candidate key that is used in the
    application to identify the records is called the
    primary key.
  • The primary key of a table is a set of attributes
    whose values uniquely identify the data records
    in the table.
  • A foreign key is an attribute (or a set of
    attributes) that references the primary key of
    another table.

36
Example for Primary and Foreign Keys
User tab
le
League table
37
Buried Association
  • Associations with multiplicity one can be
    implemented using a foreign key.
  • For one-to-many associations we add a foreign key
    to the table representing the class on the many
    end.
  • For all other associations we can select either
    class at the end of the association.

38
Buried Association
  • Associations with multiplicity one can be
    implemented using a foreign key. Because the
    association vanishes in the table, we call this a
    buried association.
  • For one-to-many associations we add the foreign
    key to the table representing the class on the
    many end.
  • For all other associations we can select either
    class at the end of the association.

39
Another Example for Buried Association
Portfolio portfolioID ...
Transaction transactionID

Foreign Key
40
Mapping Many-To-Many Associations
In this case we need a separate table for the
association
Separate table for Serves association
Primary Key
41
Mapping the Tournament/Player association as a
separate table


Player
Tournament
42
Realizing Inheritance
  • Relational databases do not support inheritance
  • Two possibilities to map UML inheritance
    relationships to a database schema
  • With a separate table (vertical mapping)
  • The attributes of the superclass and the
    subclasses are mapped to different tables
  • By duplicating columns (horizontal mapping)
  • There is no table for the superclass
  • Each subclass is mapped to a table containing the
    attributes of the subclass and the attributes of
    the superclass

43
Realizing inheritance with a separate table
44
Realizing inheritance by duplicating columns
User
name
LeagueOwner
Player
maxNumLeagues
credits
45
Comparison Separate Tables vs Duplicated Columns
  • The trade-off is between modifiability and
    response time
  • How likely is a change of the superclass?
  • What are the performance requirements for
    queries?
  • Separate table mapping
  • We can add attributes to the superclass easily by
    adding a column to the superclass table
  • Searching for the attributes of an object
    requires a join operation.
  • Duplicated columns
  • Modifying the database schema is more complex and
    error-prone
  • Individual objects are not fragmented across a
    number of tables, resulting in faster queries

46
Heuristics for Transformations
  • For a given transformation use the same tool
  • If you are using a CASE tool to map associations
    to code, use the tool to change association
    multiplicities.
  • Keep the contracts in the source code, not in the
    object design model
  • By keeping the specification as a source code
    comment, they are more likely to be updated when
    the source code changes.
  • Use the same names for the same objects
  • If the name is changed in the model, change the
    name in the code and or in the database schema.
  • Provides traceability among the models
  • Have a style guide for transformations
  • By making transformations explicit in a manual,
    all developers can apply the transformation in
    the same way.

47
Documenting the Object Design The Object Design
Document (ODD)
  • Object design document
  • Same as RAD ...
  • additions to object, functional and dynamic
    models (from solution domain)
  • Navigational map for object model
  • Javadoc documentation for all classes

48
Criteria for ODD
  • Restrictiveness
  • A specification should be precise enough that it
    excludes unwanted implementations.
  • Preconditions and postconditions specifying
    border cases is one way to achieve restrictive
    specifications.
  • Generality
  • A specification, however, should not restrict its
    implementation.
  • Clarity
  • A specification should be easily and
    unambiguously understandable by developers.
  • Certain behaviors are more easily described in
    natura1 language, whereas boundary cases can be
    described with constraints and exceptions.

49
Approaches to documenting object design
  • Self-contained ODD generated from model.
  • We write and maintain a new UML model using a
    tool and generate the document automatically.
    This document would duplicate any application
    objects identified during analysis.
  • Disadvantages
  • redundancy with the Requirements Analysis
    Document (RAD)
  • high level of effort for maintaining consistency
    with the RAD.
  • This often leads to an RAD and an ODD that are
    inaccurate or out of date.
  • ODD as extension of the RAD
  • the object design is considered as the set of
    application objects augmented with solution
    objects (we add solution objects to the RAD)
  • Advantage
  • maintaining consistency between the RAD and the
    ODD becomes much easier
  • Disadvantages
  • Polluting the RAD with information that is
    irrelevant to the client and the user.
  • ODD embedded into source code.
  • We embed the ODD into the source code.
  • We first represent the ODD using a modeling tool.
  • Once the ODD becomes stable, we use the modeling
    tool to generate class stubs. We describe each
    class interface using tagged comments that
    distinguish source code comments from object
    design descriptions.
  • Once the object design model is documented in the
    code, we abandon the initial object design model.
  • Advantage
  • Consistency between the object design model and
    the source code

50
Embedded ODD approach
51
Documenting Object Design ODD Conventions
  • Each subsystem in a system provides a service
    (see Chapter on System Design)
  • Describes the set of operations provided by the
    subsystem
  • Specifying a service operation as
  • Signature Name of operation, fully typed
    parameter list and return type
  • Abstract Describes the operation
  • Pre Precondition for calling the operation
  • Post Postcondition describing important state
    after the execution of the operation
  • Use JavaDoc for the specification of service
    operations.

52
JavaDoc
  • Add documentation comments to the source code.
  • A doc comment consists of characters between /
    and /
  • When JavaDoc parses a doc comment, leading
    characters on each line are discarded. First,
    blanks and tabs preceding the initial
    characters are also discarded.
  • Doc comments may include HTML tags
  • Example of a doc comment
  • /
  • This is a ltbgt doc lt/bgt comment
  • /

53
More on Java Doc
  • Doc comments are only recognized when placed
    immediately before class, interface, constructor,
    method or field declarations.
  • When you embed HTML tags within a doc comment,
    you should not use heading tags such as lth1gt and
    lth2gt, because JavaDoc creates an entire
    structured document and these structural tags
    interfere with the formatting of the generated
    document.

54
Class and Interface Doc Tags
  • _at_author name-text
  • Creates an Author entry.
  • _at_version version-text
  • Creates a Version entry.
  • _at_see classname
  • Creates a hyperlink See Also classname
  • _at_since since-text
  • Adds a Since entry. Usually used to specify
    that a feature or change exists since the release
    number of the software specified in the
    since-text
  • _at_deprecated deprecated-text
  • Adds a comment that this method can no longer be
    used. Convention is to describe method that
    serves as replacement
  • Example _at_deprecated Replaced by setBounds(int,
    int, int, int).

55
Constructor and Method Doc Tags
  • Can contain _at_see tag, _at_since tag, _at_deprecated as
    well as
  • _at_param parameter-name description
  • Adds a parameter to the "Parameters" section. The
    description may be continued on the next line.
  • _at_return description
  • Adds a "Returns" section, which contains the
    description of the return value.
  • _at_exception fully-qualified-class-name description
  • Adds a "Throws" section, which contains the name
    of the exception that may be thrown by the
    method. The exception is linked to its class
    documentation.
  • _at_see classname
  • Adds a hyperlink "See Also" entry to the method.

56
Example Specifying a Service in Java
  • / Office is a physical structure in a building.
    It is possible to create an instance of a office
    add an occupant get the name and the number of
    occupants /
  • public class Office
  • / Adds an occupant to the office /
  • _at_param NAME name is a nonempty string /
  • public void AddOccupant(string name)
  • / _at_Return Returns the name of the office.
    Requires, that Office has been initialized with a
    name /
  • public string GetName()
  • ....

57
Summary
  • Undisciplined changes gt degradation of the
    system model
  • We reviewed model transformation and forward
    engineering techniques
  • Optiziming the class model
  • Mapping associations to collections
  • Mapping contracts to exceptions
  • Mapping class model to storage schemas
Write a Comment
User Comments (0)
About PowerShow.com