Custom View
Context
You are exploring a live domain model and find some interesting information.
Problem
How do you make it easy to find interesting information again?
Forces
Navigating to the data you want to reach may entail a sequence of operations, either clicking in views, or evaluating Playground snippets, to reach a new Inspector instance.
The sequence of steps may be cumbersome to follow repeatedly.
Solution
Turn interesting data into a
viewable entity
. Extract the navigation steps into a new custom view for the moldable object you start navigating from. Possibly start with a simple forward
view to an existing view of the target data, and later refine this into a dedicated view.
Steps
A simple example is the view of the state of the stack of the StackMachine.
In this example, we must navigate to the stack
slot to see the stack items.
By creating a forwarding view, we “lift” the view we want to the StackMachine itself:
Pretty much any view can be seen as an example of this principle. Consider the example of Working with a REST API: the GitHub case study. In the example below, the Repositories view is obtained by navigating to a list of repositories that are created programmatically.
By lifting this code into the GhOrganization
class and creating a dedicated view, we can explore the repositories without having to first navigate to a collection of repositories.
Similarly, in the GtLudoRecordingGame
, many of the views are lifted from collaborating objects to eliminate the need for navigation when exploring. The views for
Players
,
Squares
,
Tokens
and
Moves
all replace the need for navigation.
Consequences
A custom view exposes information about a domain that can otherwise be hard to find. Custom views become an intrinsic part of a software system, thus turning it into an Explainable System.
You need a Moldable Tool into which you can dynamically plug custom views.
Related patterns
Sometimes repeated navigation code does not lead to a view but rather an action that is performed. In this case, instead of adding a custom view, a Custom Action may be needed.