Mastering UML > Relationships in Use Case Modeling
In the world of software architecture, clarity is king. When defining the behavior of a system, we often encounter scenarios where specific actions are not always performed but are instead optional or triggered by exceptional circumstances. This is where the UML <
This tutorial explores the concept of extending use cases, using the example of a library system where a “Book Damaged” scenario extends a standard “Return Book” process. We will break down the syntax, the semantics, and the best practices for implementing this pattern effectively in your diagrams.
Understanding the <> Relationship
An extending use case is effectively an alternate course of the base use case. It allows you to modularize complex workflows by separating the standard path from optional or conditional paths. Instead of cluttering the primary flow with “if this happens, then do that” logic, you can isolate these specific behaviors.
Conceptually, the <
Key Components of the Relationship
- Base Use Case: The primary functionality being described (e.g., Return Book). This is the “normal” flow.
- Extending Use Case: The optional or conditional behavior (e.g., Book Damaged). This only executes under specific conditions.
- Dependency: The relationship is a dependency where the extending use case depends on the base use case.
Visualizing the Syntax
When modeling this in tools like Visual Paradigm or drawing diagrams for documentation, the syntax is distinct. The arrow always points from the extending use case to the base use case. This direction indicates that the extending use case adds behavior to the base.
The relationship is denoted by a dashed line with an open arrowhead and the specific stereotype <<Extend>>.
useCaseDiagram
actor Librarian
usecase "Return Book" as UC1
usecase "Book Damaged" as UC2
Librarian --> UC1
UC2 ..> UC1 : <>
In the diagram above, notice that the arrow originates from “Book Damaged” and points toward “Return Book.” This signifies that the “Book Damaged” scenario is an extension of the return process.
Why Use <> Instead of <>?
It is common for beginners to confuse <
- Include (<<include>>): Used when the behavior is mandatory. If you want to “Pay”, you must “Calculate Total”. The base use case cannot function without it.
- Extend (<<extend>>): Used when the behavior is optional or conditional. If you “Return Book”, you might encounter a “Book Damaged” situation, but the return process can still complete successfully if the book is undamaged.
Implementation Details
To implement this correctly, two critical rules must be followed:
- Directionality: The arrow always points from the extension to the base. The base use case is the parent context.
- Insertion Point: The extending use case inserts its behavior into the base use case at a specific point. In a “Return Book” scenario, the “Book Damaged” check typically occurs after the book is scanned but before the transaction is finalized.
Real-World Application: The Library System
Consider a library system where a librarian needs to process a book return. The standard flow is simple: scan the book, check it in, and return it to the shelf. However, what if the book is damaged?
By using the <
- The Base Use Case (“Return Book”) handles the standard logic: scanning the ID and updating the database.
- The Extending Use Case (“Book Damaged”) handles the exception logic: inspecting the book, recording damage, and perhaps charging a fine or refusing the return.
This separation ensures that the main process remains clean and easy to follow, while the complex exception handling is isolated in its own module.
Conclusion
The <