SlideShare a Scribd company logo
1 of 4
Download to read offline
64 Java™
Report | F E BR UA R Y 20 0 0 http://www.java re po rt.com
WHAT IS AN object worth? For that
matter, what is a pattern worth? The
answer to both of these questions is:
not much. At least, not on their own.
Object-oriented (OO) systems work because the
behavior and information of the system is distrib-
uted across a network of connected objects, each
responsible for a particular part of the system's
behavior and/or information, their granularity rang-
ing from the large to the small. The references con-
necting objects together may be held for the lifetime
of an object, or for less than the duration of a method
call. In execution the
threads of control ripple
through and affect this
network.
A similar thing can be
said of patterns: Patterns
do not exist in isolation
only solving individual
design problems at a sin-
gle level. Patterns can be
collected together for
common use, but more
powerfully they can be
connected together as a
pattern language to describe how to build a
particular kind of system or resolve a family of
related problems.
Putting Patterns in Their Place
The Gang of Four (GoF) catalog of design patterns1
col-
lects a number of general purpose patterns for use in
OO design. However, it is certainly not the last word
on either patterns or design. Design embraces many
levels of detail in a system, from its gross architecture
right down to the use of language features; design
must also relate to the purpose as well as the mecha-
nism of the system.
Pattern-Oriented Software Architecture (POSA)2
is another catalog that is in many ways GoF-like. One
way in which it goes further than GoF is in classify-
ing its patterns as belonging to one of three levels:
architecture, by which the gross architecture is
meant; design, by which detailed design at the same
level of GoF is intended; and idioms, which focus on
programming language-specific patterns.
Idioms
As anyone who has studied a language at school only
to be left—literally— speechless when visiting some-
where it is spoken natively will know, understanding
of any language goes beyond a by rote knowledge of
syntax and semantics. Fluency in a language is also
about embracing its idioms and expressing yourself
appropriately in that language with intention, rather
than by accident or by dogma. This is as true of pro-
gramming languages as it is of natural languages, and
Java presents a context of mechanisms and common
practices for design to incorporate.
Many idioms can be seen to define conventions of
style, e.g., class and method naming conventions.
Others have a more direct relationship to patterns.
Where patterns are considered to be solutions to
problems occurring in a context, many idioms are
language-level or technology-specific patterns3
; that
is, they have the language or technology as part of
their context.
Parts of Java's context that affects how design
decisions are taken include its strong typing, reflec-
tion, support for multithreading, garbage collection,
and reference-based objects. This context leads Java
developers down different routes than those taken
by either C++ or Smalltalk developers. For instance,
much of the detail describing C++ issues such as
memory management in Design Patterns1
is not rel-
evant in Java. At the same time, there are Java issues
of interest that are not explored. So, some idioms
may adapt general design patterns to fit in more
appropriately with the language, as was done with
the Design Patterns Smalltalk Companion,4
which
expresses and discusses the GoF patterns in a more
idiomatic form for Smalltalk programmers.
Idioms may also represent design decisions that
exist only in that language. Note that not all lan-
Patterns of Value
Kevlin Henney is a Principal Technologist with QA Training
in the UK.
KevlinHenney/ khenney@qatraining.com
Patterns in Java
65http://www.java re po rt.com F EB R UA R Y 2 00 0 | Java™
Report
guage-specific conventions warrant the name patterns.
For instance, the JavaBeans naming conventions—get*
and set*, etc.—are just that: naming conventions. They
define framework participation rules, to support mean-
ingful introspection, for non-BeanInfo implementers.
Therefore, although idiomatic in one sense, they are not
patterns in the sense we are talking about. When the
authors of the JavaBeans specification called the naming
convention design patterns, they confused regular
expression pattern matching with the more specific con-
cept of design patterns.
Java idioms are being documented in a number of
places, including a growing body of tentative idioms on
the Wiki.5
In some cases the patterns have a more specif-
ic context than simply Java, for instance, dealing with
concurrency.6
Pattern Languages
Patterns often have relationships with other patterns. The
related patterns may be used to resolve problems in the
new context introduced by applying a particular pattern,
or patterns may be used to support the development of a
particular solution. For instance, Iterator is often support-
ed by the use of a Factory Method.1
Patterns can be grouped together and collected in a
catalog to provide a useful knowledge source; a simple
software engineering handbook if you like, e.g., GoF
and POSA. There may be some documented relation-
ships between the patterns in a catalog. However,
the value of patterns is more fully realized when con-
necting them together in the narrative framework of a
pattern language3
:
A pattern language is a collection of patterns that
build on each other to generate a system. A pattern in
isolation solves an isolated design problem; a pattern
language builds a system. It is through pattern languages
that patterns achieve their fullest power.…A pattern lan-
guage should not be confused with a programming lan-
guage. A pattern language is a piece of literature that
describes an architecture, a design, a framework, or
other structure. It has structure, but not the same level
of formal structure that one finds in programming
languages.
A pattern language represents a reasonable set of prac-
tices and decisions that need to be taken together to
resolve a particular design challenge. The relationships
help the developer determine which patterns should be
applied and under what circumstances. The developer
works with a connected group of patterns rather than just
individual patterns.
The idea of pattern languages originated with patterns
in building architecture7
, but there are now many good
examples for software, for instance, in the Pattern
Language of Program Design books.8–10
There is even a pat-
tern language for writing pattern languages!11
Value-Based Programming
What kind of problem in Java needs the concerted col-
laboration of many patterns? There are many, but to give
you a simple and complete example that we can work
through in this and the next column, let us consider the
issue of expressing and using values in Java. Examples
of value types include strings, integers, and intervals, as
well as semantically richer dates, money, and physical
quantities such as length, mass, and time. We often
think of objects as representing the significant chunks of
a system; values, in effect, form the currency between
these chunks.
Identity, State, and Behavior
An object can be characterized by identity, state, and
behavior.12
Value objects have transparent identity, sig-
nificant state, and behavior directly related to the state.
Knowing the identity of an object means that you can
hold a reference to it. By transparent identity we mean
that a value object's identity is not important to the way
we use it, and one value object is substitutable for anoth-
er with the same state. An example of this is a string. Our
Figure 1. Patterns and their successors for supporting value-based programming in Java.
78
Patterns in Java / Kevlin Henney
WHOLE
VALUE
IMMUTABLE
VALUE
MUTABLE
COMPANION
VALUE
CLASS
CLASS FACTORY
METHOD
CLONEABLE
VALUE
ENUMARATION
VALUES
focus is on a string's content and its manipulation, and
not on the reference itself: Comparison of the content of
two strings is of interest, but comparison of their identi-
ty is less useful. In other words, common usage for String
is based on its overridden equals method and not on
the == operator.
Service-based objects are another example where iden-
tity is incidental. However, for service objects behavior
and not state is the most important feature; often service
objects are stateless. Contrast this with entity objects, for
which both identity and state are significant.
Values in Java
Except for the built-in types, such as int, Java currently
supports only reference-based objects. Interesting propos-
als for language extension aside,13
it is not currently possi-
ble for developers to create their own types to follow the
same behavior as the built-ins. For instance, there is no
operator overloading in Java, except for the indirect rela-
tionship between the + operator and the toString method,
and passing by copy is supported only in the context of
remoting, specifically java.io.Serializable types under RMI.
Nonetheless, this does not remove the need for devel-
opers to create types that act as values. The idioms for
supporting fine-grained value types can be described
through a pattern language.
A Pattern Language
The pattern language for value-based programming in Java
that follows is a work in progress. It is drawn from com-
mon Java practices as found in published code, including
the standard Java libraries. A summary and basic structure
of the language, followed by a simple example that
demonstrates its use, is shown this time. In the next col-
umn we will examine each of the patterns in more detail.
Overview of the Patterns
Figure 1 shows all of the patterns in the language. Lines
with arrows represent successor relationships, showing
how one pattern may be followed by another to support it
in some way; the detail of that support is found in the text
of the pattern itself.
An Immutable Value, for example, avoids the side-effect
problems that arise from sharing value objects between
objects, particularly across threads. However, it can be
costly and awkward, in terms of object creation, to only
66 Java™
Report | FE BR UAR Y 2 0 00 http://www.java re po rt.com
Patterns in Java / Kevlin Henney
Name Problem Solution
Class Factory Method How can you simplify,and potentially Provide static methods to be used instead of (or
optimize,construction of Value Class as well as) ordinary constructors.The methods
objects in expressions without return either newly created Value Class objects
resorting to intrusive new expressions? or cached objects from a table.
Cloneable Value How can you pass a Value Class object Implement the Cloneable interface for the Value
into and out of methods without Class and use a clone of the original whenever
allowing callers or called methods to it needs to be passed.
affect the original object?
Enumeration Values How can you represent a fixed set Each constant is represented by an Immutable
of constant values and preserve Value defined as a static final in the scope of the
type safety? Immutable Value class,which cannot be
instantiated outside the scope of that class.
Immutable Value How can you share Value Class Set the internal state of the Value Class object
objects and guarantee no side- at construction,and allow no subsequent
effect problems? modifications i.e.,implement only query methods.
Mutable Companion How can you simplify complex Implement a companion class that supports
construction of an Immutable Value? modifier methods and acts as a factory for
Immutable Value objects.
Value Class How do you define a class to Override the methods in Object whose action
represent values in your system? should be related to content and not identity
(e.g.,equal), and implement Serializable.The
Value Class will be either an Immutable Value or a
Cloneable Value.Simplify construction with a Class
Factory Method.
Whole Value How can you represent a primitive Express the type of the quantity as a Value Class.
domain quantity in your system
without loss of meaning?
Table1. Thumbnails for value-based programming patterns.
68 Java™
Report | FE BR UAR Y 2 0 0 0 http://www.java re po rt.com
Patterns in Java / Kevlin Henney
work with Immutable Value objects, and so it is often help-
ful to provide a Mutable Companion class for the
Immutable Value class. In the standard Java library,
java.lang.StringBuffer is an Immutable Value and java.
lang.StringBuffer is a Mutable Companion.
Table 1 summarizes each of the patterns alphabetically
in what is commonly known as thumbnail form: The
name, essential problem, and brief solution are presented
without rationale or examples.
Putting the Patterns to Work
A simple example can be used to illustrate the pattern lan-
guage in action. Consider the problem of representing
dates in an object system. The resulting code is shown in
Listing 1 (available online in the code section of
www.javareport.com ).
The Whole Value pattern,14
also known as the Quantity
pattern,15
and Value Class pattern offer the entry points into
the pattern language. We can already guess that the best
way to represent dates in our systems is directly as objects,
hence the need for a class Date. The way in which Date
should be implemented is as a Value Class, which describes
what is involved in making its instances value-like.
A Date object is considered to be an Immutable Value16
to avoid problems arising from sharing a single Date
object among other objects. For instance, two objects
sharing a Date object expect that the value it represents
should remain unchanged. However, if one of the objects
modifies it, the other will also experience the change—a
person object holding a date of birth field may unexpect-
edly find its birthday moved! To simplify manipulation
of dates Mutable Companion, DateManipulator, is also pro-
vided. An alternative to this approach is to make Date a
Cloneable Value.
One issue that needs to be addressed is what field order
should be used to initialize Date objects: YYYY/MM/DD,
DD/MM/YYYY, or MM/DD/YYYY? The joy of standards
is that there are so many to choose from, but if we choose
one how do we enforce that choice? If int is used to repre-
sent the year, the month, and the day, there is no type
checking to catch incorrect use of the other cases, e.g.,
given the following constructor:
public class Date implements Serializable
{
public Date(int year, int month, int day) ...
...
}
All of the following will compile:
Date right = new Date(year, month, day);
Date wrong = new Date(day, month, year);
Date alsoWrong = new Date(month, day, year);
Months can be conveniently represented as Enumeration
Values, also known as Typesafe Constant,17
which deals
with expressing fixed sets of constants (think enum in C
and C++). A year can be conveniently wrappered as a
Whole Value, making it a distinct type and therefore
checked by the type system. The Year class is intended
for use as part of a method's interface rather than as part
of an object's representation; it is at the interface that the
type safety is really needed. Given that Month and Year
are now checked, it is safe to leave the day in the month
as a plain int, although you may wish to make it a Whole
Value for consistency.
The Class Factory Method pattern generally supports
the Value Class pattern, making it easier to express new
objects in expressions, as in the case of Year. The Class
Factory Method pattern is a more specific variant of the
Factory Method1
pattern: Factory Method deals specifically
with managing object creation in a class hierarchy,
Class Factory Method focuses on providing an alternative
method of object creation to calling new with a
constructor.
Conclusion
Patterns are gregarious: They like company, and can work
well with other patterns to assist in design. The simple
issue resolved here, that of value-based programming in
Java, hopefully illustrates how a pattern language com-
bines patterns to work through a problem and support a
set of principles. Next time, we will look at each of the
patterns in greater detail. s
References
1. Gamma, E., et al., Design Patterns: Elements of Reusable
Object-Oriented Software, Addison–Wesley, 1995.
2. Buschmann, F., et al., Pattern-Oriented Software
Architecture: A System of Patterns, Wiley, 1996.
3. Coplien, J., Software Patterns, SIGS, 1996.
4. Alpert, S., Brown, K., Woolf, B., The Design Patterns
Smalltalk Companion, Addison–Wesley, 1998.
5. Java Idioms, http://c2.com/cgi/wiki.
6. Lea, D., Concurrent Programming in Java: Design
Principles and Patterns, Addison–Wesley, 1999.
7. Alexander, C., et al., A Pattern Language: Towns,
Buildings, Construction, Oxford University Press, 1977.
8. Coplien, J. and D. Schmidt, Eds., Pattern Languages of
Program Design, Addison–Wesley, 1995.
9. Vlissides, J., J. Coplien, and N. Kerth, Eds., Pattern
Languages of Program Design 2, Addison–Wesley, 1996.
10. Martin, R., D. Riehle, and F. Buschmann, Eds., Pattern
Languages of Program Design 3, Addison–Wesley, 1998.
11. Meszaros, G., Doble, J., "A Pattern Language for Writing
Pattern Writing," PLoPD1998.
12. Booch, G., Object-Oriented Analysis and Design with
Applications, 2nd edition, Benjamin/Cummings, 1994.
13. Gosling, J., "The Evolution of Numerical Computing in
Java," http://java.sun.com/people/jag/FP.html.
14. Cunningham, W., "The CHECKS Pattern Language of
Information Integrity," PLoPD1995.
15. Fowler, M., Analysis Patterns: Reusable Object Models,
Addison–Wesley, 1997.
16. Henney, K., "Java Patterns and Implementations,"
presented at BCS OOPS Patterns Day, Oct. 1997,
presentation notes and whitepaper,
techland.qatraining.com/profile.htm.
17. Warren, N., Bishop, P., Java in Practice: Design Styles
and Idioms for Effective Java, Addison–Wesley, 1999.

More Related Content

What's hot

New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
New Quantitative Methodology for Identification of Drug Abuse Based on Featur...New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
Carrie Wang
 
Eswc2012 ss ontologies
Eswc2012 ss ontologiesEswc2012 ss ontologies
Eswc2012 ss ontologies
Elena Simperl
 
Information retrieval based on word sens 1
Information retrieval based on word sens 1Information retrieval based on word sens 1
Information retrieval based on word sens 1
ATHMAN HAJ-HAMOU
 
Introduction to Distributional Semantics
Introduction to Distributional SemanticsIntroduction to Distributional Semantics
Introduction to Distributional Semantics
Andre Freitas
 
Doc format.
Doc format.Doc format.
Doc format.
butest
 

What's hot (20)

Introduction to Ontology Engineering with Fluent Editor 2014
Introduction to Ontology Engineering with Fluent Editor 2014Introduction to Ontology Engineering with Fluent Editor 2014
Introduction to Ontology Engineering with Fluent Editor 2014
 
Controlled Natural Language Generation from a Multilingual FrameNet-based Gra...
Controlled Natural Language Generation from a Multilingual FrameNet-based Gra...Controlled Natural Language Generation from a Multilingual FrameNet-based Gra...
Controlled Natural Language Generation from a Multilingual FrameNet-based Gra...
 
New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
New Quantitative Methodology for Identification of Drug Abuse Based on Featur...New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
New Quantitative Methodology for Identification of Drug Abuse Based on Featur...
 
Transformers to Learn Hierarchical Contexts in Multiparty Dialogue
Transformers to Learn Hierarchical Contexts in Multiparty DialogueTransformers to Learn Hierarchical Contexts in Multiparty Dialogue
Transformers to Learn Hierarchical Contexts in Multiparty Dialogue
 
Language Identification System For Code-Mixed Social Media Text Analysis
Language Identification System For Code-Mixed Social Media Text AnalysisLanguage Identification System For Code-Mixed Social Media Text Analysis
Language Identification System For Code-Mixed Social Media Text Analysis
 
Generating Lexical Information for Terminology in a Bioinformatics Ontology
Generating Lexical Information for Terminologyin a Bioinformatics OntologyGenerating Lexical Information for Terminologyin a Bioinformatics Ontology
Generating Lexical Information for Terminology in a Bioinformatics Ontology
 
Plug play language_models
Plug play language_modelsPlug play language_models
Plug play language_models
 
NLP_KASHK:Text Normalization
NLP_KASHK:Text NormalizationNLP_KASHK:Text Normalization
NLP_KASHK:Text Normalization
 
[Paper Reading] Supervised Learning of Universal Sentence Representations fro...
[Paper Reading] Supervised Learning of Universal Sentence Representations fro...[Paper Reading] Supervised Learning of Universal Sentence Representations fro...
[Paper Reading] Supervised Learning of Universal Sentence Representations fro...
 
Nlp research presentation
Nlp research presentationNlp research presentation
Nlp research presentation
 
Languages, Ontologies and Automatic Grammar Generation - Prof. Pedro Rangel H...
Languages, Ontologies and Automatic Grammar Generation - Prof. Pedro Rangel H...Languages, Ontologies and Automatic Grammar Generation - Prof. Pedro Rangel H...
Languages, Ontologies and Automatic Grammar Generation - Prof. Pedro Rangel H...
 
A deep analysis of Multi-word Expression and Machine Translation
A deep analysis of Multi-word Expression and Machine TranslationA deep analysis of Multi-word Expression and Machine Translation
A deep analysis of Multi-word Expression and Machine Translation
 
Eswc2012 ss ontologies
Eswc2012 ss ontologiesEswc2012 ss ontologies
Eswc2012 ss ontologies
 
NLP Project Presentation
NLP Project PresentationNLP Project Presentation
NLP Project Presentation
 
Ijarcet vol-3-issue-3-623-625 (1)
Ijarcet vol-3-issue-3-623-625 (1)Ijarcet vol-3-issue-3-623-625 (1)
Ijarcet vol-3-issue-3-623-625 (1)
 
MORPHOLOGICAL SEGMENTATION WITH LSTM NEURAL NETWORKS FOR TIGRINYA
MORPHOLOGICAL SEGMENTATION WITH LSTM NEURAL NETWORKS FOR TIGRINYAMORPHOLOGICAL SEGMENTATION WITH LSTM NEURAL NETWORKS FOR TIGRINYA
MORPHOLOGICAL SEGMENTATION WITH LSTM NEURAL NETWORKS FOR TIGRINYA
 
ESR10 Joachim Daiber - EXPERT Summer School - Malaga 2015
ESR10 Joachim Daiber - EXPERT Summer School - Malaga 2015ESR10 Joachim Daiber - EXPERT Summer School - Malaga 2015
ESR10 Joachim Daiber - EXPERT Summer School - Malaga 2015
 
Information retrieval based on word sens 1
Information retrieval based on word sens 1Information retrieval based on word sens 1
Information retrieval based on word sens 1
 
Introduction to Distributional Semantics
Introduction to Distributional SemanticsIntroduction to Distributional Semantics
Introduction to Distributional Semantics
 
Doc format.
Doc format.Doc format.
Doc format.
 

Similar to Patterns of Value

A Survey of Object Oriented Programming LanguagesMaya Hris.docx
A Survey of Object Oriented Programming LanguagesMaya Hris.docxA Survey of Object Oriented Programming LanguagesMaya Hris.docx
A Survey of Object Oriented Programming LanguagesMaya Hris.docx
daniahendric
 
Object And Oriented Programing ( Oop ) Languages
Object And Oriented Programing ( Oop ) LanguagesObject And Oriented Programing ( Oop ) Languages
Object And Oriented Programing ( Oop ) Languages
Jessica Deakin
 
Proposal of an Ontology Applied to Technical Debt on PL/SQL Development
Proposal of an Ontology Applied to Technical Debt on PL/SQL DevelopmentProposal of an Ontology Applied to Technical Debt on PL/SQL Development
Proposal of an Ontology Applied to Technical Debt on PL/SQL Development
Jorge Barreto
 
Object Oriented Approach For Software Development
Object Oriented Approach For Software DevelopmentObject Oriented Approach For Software Development
Object Oriented Approach For Software Development
Jessica Tanner
 

Similar to Patterns of Value (20)

Java OOPs Concepts.docx
Java OOPs Concepts.docxJava OOPs Concepts.docx
Java OOPs Concepts.docx
 
Class notes(week 2) on basic concepts of oop-2
Class notes(week 2) on basic concepts of oop-2Class notes(week 2) on basic concepts of oop-2
Class notes(week 2) on basic concepts of oop-2
 
Class notes(week 2) on basic concepts of oop-2
Class notes(week 2) on basic concepts of oop-2Class notes(week 2) on basic concepts of oop-2
Class notes(week 2) on basic concepts of oop-2
 
Unit No 6 Design Patterns.pptx
Unit No 6 Design Patterns.pptxUnit No 6 Design Patterns.pptx
Unit No 6 Design Patterns.pptx
 
Ruby Interview Questions
Ruby Interview QuestionsRuby Interview Questions
Ruby Interview Questions
 
Writing good C# code for good cloud applications - Draft Oct 20, 2014
Writing good C# code for good cloud applications - Draft Oct 20, 2014Writing good C# code for good cloud applications - Draft Oct 20, 2014
Writing good C# code for good cloud applications - Draft Oct 20, 2014
 
A Survey of Object Oriented Programming LanguagesMaya Hris.docx
A Survey of Object Oriented Programming LanguagesMaya Hris.docxA Survey of Object Oriented Programming LanguagesMaya Hris.docx
A Survey of Object Oriented Programming LanguagesMaya Hris.docx
 
Introduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John MulhallIntroduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John Mulhall
 
Reflective Plan Examples
Reflective Plan ExamplesReflective Plan Examples
Reflective Plan Examples
 
SWSN UNIT-3.pptx we can information about swsn professional
SWSN UNIT-3.pptx we can information about swsn professionalSWSN UNIT-3.pptx we can information about swsn professional
SWSN UNIT-3.pptx we can information about swsn professional
 
Oop
OopOop
Oop
 
Pattern-Level Programming with Asteroid
Pattern-Level Programming with AsteroidPattern-Level Programming with Asteroid
Pattern-Level Programming with Asteroid
 
Challenges in transfer learning in nlp
Challenges in transfer learning in nlpChallenges in transfer learning in nlp
Challenges in transfer learning in nlp
 
Object And Oriented Programing ( Oop ) Languages
Object And Oriented Programing ( Oop ) LanguagesObject And Oriented Programing ( Oop ) Languages
Object And Oriented Programing ( Oop ) Languages
 
Proposal of an Ontology Applied to Technical Debt on PL/SQL Development
Proposal of an Ontology Applied to Technical Debt on PL/SQL DevelopmentProposal of an Ontology Applied to Technical Debt on PL/SQL Development
Proposal of an Ontology Applied to Technical Debt on PL/SQL Development
 
Object Oriented Approach For Software Development
Object Oriented Approach For Software DevelopmentObject Oriented Approach For Software Development
Object Oriented Approach For Software Development
 
LectureNotes-01-DSA
LectureNotes-01-DSALectureNotes-01-DSA
LectureNotes-01-DSA
 
Basic design pattern interview questions
Basic design pattern interview questionsBasic design pattern interview questions
Basic design pattern interview questions
 
Substitutability
SubstitutabilitySubstitutability
Substitutability
 
Practical OOP In Java
Practical OOP In JavaPractical OOP In Java
Practical OOP In Java
 

More from Kevlin Henney

More from Kevlin Henney (20)

Program with GUTs
Program with GUTsProgram with GUTs
Program with GUTs
 
The Case for Technical Excellence
The Case for Technical ExcellenceThe Case for Technical Excellence
The Case for Technical Excellence
 
Empirical Development
Empirical DevelopmentEmpirical Development
Empirical Development
 
Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
 
Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
 
Solid Deconstruction
Solid DeconstructionSolid Deconstruction
Solid Deconstruction
 
Get Kata
Get KataGet Kata
Get Kata
 
Procedural Programming: It’s Back? It Never Went Away
Procedural Programming: It’s Back? It Never Went AwayProcedural Programming: It’s Back? It Never Went Away
Procedural Programming: It’s Back? It Never Went Away
 
Structure and Interpretation of Test Cases
Structure and Interpretation of Test CasesStructure and Interpretation of Test Cases
Structure and Interpretation of Test Cases
 
Agility ≠ Speed
Agility ≠ SpeedAgility ≠ Speed
Agility ≠ Speed
 
Refactoring to Immutability
Refactoring to ImmutabilityRefactoring to Immutability
Refactoring to Immutability
 
Old Is the New New
Old Is the New NewOld Is the New New
Old Is the New New
 
Turning Development Outside-In
Turning Development Outside-InTurning Development Outside-In
Turning Development Outside-In
 
Giving Code a Good Name
Giving Code a Good NameGiving Code a Good Name
Giving Code a Good Name
 
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
 
Thinking Outside the Synchronisation Quadrant
Thinking Outside the Synchronisation QuadrantThinking Outside the Synchronisation Quadrant
Thinking Outside the Synchronisation Quadrant
 
Code as Risk
Code as RiskCode as Risk
Code as Risk
 
Software Is Details
Software Is DetailsSoftware Is Details
Software Is Details
 
Game of Sprints
Game of SprintsGame of Sprints
Game of Sprints
 
Good Code
Good CodeGood Code
Good Code
 

Recently uploaded

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
chiefasafspells
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Recently uploaded (20)

%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 

Patterns of Value

  • 1. 64 Java™ Report | F E BR UA R Y 20 0 0 http://www.java re po rt.com WHAT IS AN object worth? For that matter, what is a pattern worth? The answer to both of these questions is: not much. At least, not on their own. Object-oriented (OO) systems work because the behavior and information of the system is distrib- uted across a network of connected objects, each responsible for a particular part of the system's behavior and/or information, their granularity rang- ing from the large to the small. The references con- necting objects together may be held for the lifetime of an object, or for less than the duration of a method call. In execution the threads of control ripple through and affect this network. A similar thing can be said of patterns: Patterns do not exist in isolation only solving individual design problems at a sin- gle level. Patterns can be collected together for common use, but more powerfully they can be connected together as a pattern language to describe how to build a particular kind of system or resolve a family of related problems. Putting Patterns in Their Place The Gang of Four (GoF) catalog of design patterns1 col- lects a number of general purpose patterns for use in OO design. However, it is certainly not the last word on either patterns or design. Design embraces many levels of detail in a system, from its gross architecture right down to the use of language features; design must also relate to the purpose as well as the mecha- nism of the system. Pattern-Oriented Software Architecture (POSA)2 is another catalog that is in many ways GoF-like. One way in which it goes further than GoF is in classify- ing its patterns as belonging to one of three levels: architecture, by which the gross architecture is meant; design, by which detailed design at the same level of GoF is intended; and idioms, which focus on programming language-specific patterns. Idioms As anyone who has studied a language at school only to be left—literally— speechless when visiting some- where it is spoken natively will know, understanding of any language goes beyond a by rote knowledge of syntax and semantics. Fluency in a language is also about embracing its idioms and expressing yourself appropriately in that language with intention, rather than by accident or by dogma. This is as true of pro- gramming languages as it is of natural languages, and Java presents a context of mechanisms and common practices for design to incorporate. Many idioms can be seen to define conventions of style, e.g., class and method naming conventions. Others have a more direct relationship to patterns. Where patterns are considered to be solutions to problems occurring in a context, many idioms are language-level or technology-specific patterns3 ; that is, they have the language or technology as part of their context. Parts of Java's context that affects how design decisions are taken include its strong typing, reflec- tion, support for multithreading, garbage collection, and reference-based objects. This context leads Java developers down different routes than those taken by either C++ or Smalltalk developers. For instance, much of the detail describing C++ issues such as memory management in Design Patterns1 is not rel- evant in Java. At the same time, there are Java issues of interest that are not explored. So, some idioms may adapt general design patterns to fit in more appropriately with the language, as was done with the Design Patterns Smalltalk Companion,4 which expresses and discusses the GoF patterns in a more idiomatic form for Smalltalk programmers. Idioms may also represent design decisions that exist only in that language. Note that not all lan- Patterns of Value Kevlin Henney is a Principal Technologist with QA Training in the UK. KevlinHenney/ khenney@qatraining.com Patterns in Java
  • 2. 65http://www.java re po rt.com F EB R UA R Y 2 00 0 | Java™ Report guage-specific conventions warrant the name patterns. For instance, the JavaBeans naming conventions—get* and set*, etc.—are just that: naming conventions. They define framework participation rules, to support mean- ingful introspection, for non-BeanInfo implementers. Therefore, although idiomatic in one sense, they are not patterns in the sense we are talking about. When the authors of the JavaBeans specification called the naming convention design patterns, they confused regular expression pattern matching with the more specific con- cept of design patterns. Java idioms are being documented in a number of places, including a growing body of tentative idioms on the Wiki.5 In some cases the patterns have a more specif- ic context than simply Java, for instance, dealing with concurrency.6 Pattern Languages Patterns often have relationships with other patterns. The related patterns may be used to resolve problems in the new context introduced by applying a particular pattern, or patterns may be used to support the development of a particular solution. For instance, Iterator is often support- ed by the use of a Factory Method.1 Patterns can be grouped together and collected in a catalog to provide a useful knowledge source; a simple software engineering handbook if you like, e.g., GoF and POSA. There may be some documented relation- ships between the patterns in a catalog. However, the value of patterns is more fully realized when con- necting them together in the narrative framework of a pattern language3 : A pattern language is a collection of patterns that build on each other to generate a system. A pattern in isolation solves an isolated design problem; a pattern language builds a system. It is through pattern languages that patterns achieve their fullest power.…A pattern lan- guage should not be confused with a programming lan- guage. A pattern language is a piece of literature that describes an architecture, a design, a framework, or other structure. It has structure, but not the same level of formal structure that one finds in programming languages. A pattern language represents a reasonable set of prac- tices and decisions that need to be taken together to resolve a particular design challenge. The relationships help the developer determine which patterns should be applied and under what circumstances. The developer works with a connected group of patterns rather than just individual patterns. The idea of pattern languages originated with patterns in building architecture7 , but there are now many good examples for software, for instance, in the Pattern Language of Program Design books.8–10 There is even a pat- tern language for writing pattern languages!11 Value-Based Programming What kind of problem in Java needs the concerted col- laboration of many patterns? There are many, but to give you a simple and complete example that we can work through in this and the next column, let us consider the issue of expressing and using values in Java. Examples of value types include strings, integers, and intervals, as well as semantically richer dates, money, and physical quantities such as length, mass, and time. We often think of objects as representing the significant chunks of a system; values, in effect, form the currency between these chunks. Identity, State, and Behavior An object can be characterized by identity, state, and behavior.12 Value objects have transparent identity, sig- nificant state, and behavior directly related to the state. Knowing the identity of an object means that you can hold a reference to it. By transparent identity we mean that a value object's identity is not important to the way we use it, and one value object is substitutable for anoth- er with the same state. An example of this is a string. Our Figure 1. Patterns and their successors for supporting value-based programming in Java. 78 Patterns in Java / Kevlin Henney WHOLE VALUE IMMUTABLE VALUE MUTABLE COMPANION VALUE CLASS CLASS FACTORY METHOD CLONEABLE VALUE ENUMARATION VALUES
  • 3. focus is on a string's content and its manipulation, and not on the reference itself: Comparison of the content of two strings is of interest, but comparison of their identi- ty is less useful. In other words, common usage for String is based on its overridden equals method and not on the == operator. Service-based objects are another example where iden- tity is incidental. However, for service objects behavior and not state is the most important feature; often service objects are stateless. Contrast this with entity objects, for which both identity and state are significant. Values in Java Except for the built-in types, such as int, Java currently supports only reference-based objects. Interesting propos- als for language extension aside,13 it is not currently possi- ble for developers to create their own types to follow the same behavior as the built-ins. For instance, there is no operator overloading in Java, except for the indirect rela- tionship between the + operator and the toString method, and passing by copy is supported only in the context of remoting, specifically java.io.Serializable types under RMI. Nonetheless, this does not remove the need for devel- opers to create types that act as values. The idioms for supporting fine-grained value types can be described through a pattern language. A Pattern Language The pattern language for value-based programming in Java that follows is a work in progress. It is drawn from com- mon Java practices as found in published code, including the standard Java libraries. A summary and basic structure of the language, followed by a simple example that demonstrates its use, is shown this time. In the next col- umn we will examine each of the patterns in more detail. Overview of the Patterns Figure 1 shows all of the patterns in the language. Lines with arrows represent successor relationships, showing how one pattern may be followed by another to support it in some way; the detail of that support is found in the text of the pattern itself. An Immutable Value, for example, avoids the side-effect problems that arise from sharing value objects between objects, particularly across threads. However, it can be costly and awkward, in terms of object creation, to only 66 Java™ Report | FE BR UAR Y 2 0 00 http://www.java re po rt.com Patterns in Java / Kevlin Henney Name Problem Solution Class Factory Method How can you simplify,and potentially Provide static methods to be used instead of (or optimize,construction of Value Class as well as) ordinary constructors.The methods objects in expressions without return either newly created Value Class objects resorting to intrusive new expressions? or cached objects from a table. Cloneable Value How can you pass a Value Class object Implement the Cloneable interface for the Value into and out of methods without Class and use a clone of the original whenever allowing callers or called methods to it needs to be passed. affect the original object? Enumeration Values How can you represent a fixed set Each constant is represented by an Immutable of constant values and preserve Value defined as a static final in the scope of the type safety? Immutable Value class,which cannot be instantiated outside the scope of that class. Immutable Value How can you share Value Class Set the internal state of the Value Class object objects and guarantee no side- at construction,and allow no subsequent effect problems? modifications i.e.,implement only query methods. Mutable Companion How can you simplify complex Implement a companion class that supports construction of an Immutable Value? modifier methods and acts as a factory for Immutable Value objects. Value Class How do you define a class to Override the methods in Object whose action represent values in your system? should be related to content and not identity (e.g.,equal), and implement Serializable.The Value Class will be either an Immutable Value or a Cloneable Value.Simplify construction with a Class Factory Method. Whole Value How can you represent a primitive Express the type of the quantity as a Value Class. domain quantity in your system without loss of meaning? Table1. Thumbnails for value-based programming patterns.
  • 4. 68 Java™ Report | FE BR UAR Y 2 0 0 0 http://www.java re po rt.com Patterns in Java / Kevlin Henney work with Immutable Value objects, and so it is often help- ful to provide a Mutable Companion class for the Immutable Value class. In the standard Java library, java.lang.StringBuffer is an Immutable Value and java. lang.StringBuffer is a Mutable Companion. Table 1 summarizes each of the patterns alphabetically in what is commonly known as thumbnail form: The name, essential problem, and brief solution are presented without rationale or examples. Putting the Patterns to Work A simple example can be used to illustrate the pattern lan- guage in action. Consider the problem of representing dates in an object system. The resulting code is shown in Listing 1 (available online in the code section of www.javareport.com ). The Whole Value pattern,14 also known as the Quantity pattern,15 and Value Class pattern offer the entry points into the pattern language. We can already guess that the best way to represent dates in our systems is directly as objects, hence the need for a class Date. The way in which Date should be implemented is as a Value Class, which describes what is involved in making its instances value-like. A Date object is considered to be an Immutable Value16 to avoid problems arising from sharing a single Date object among other objects. For instance, two objects sharing a Date object expect that the value it represents should remain unchanged. However, if one of the objects modifies it, the other will also experience the change—a person object holding a date of birth field may unexpect- edly find its birthday moved! To simplify manipulation of dates Mutable Companion, DateManipulator, is also pro- vided. An alternative to this approach is to make Date a Cloneable Value. One issue that needs to be addressed is what field order should be used to initialize Date objects: YYYY/MM/DD, DD/MM/YYYY, or MM/DD/YYYY? The joy of standards is that there are so many to choose from, but if we choose one how do we enforce that choice? If int is used to repre- sent the year, the month, and the day, there is no type checking to catch incorrect use of the other cases, e.g., given the following constructor: public class Date implements Serializable { public Date(int year, int month, int day) ... ... } All of the following will compile: Date right = new Date(year, month, day); Date wrong = new Date(day, month, year); Date alsoWrong = new Date(month, day, year); Months can be conveniently represented as Enumeration Values, also known as Typesafe Constant,17 which deals with expressing fixed sets of constants (think enum in C and C++). A year can be conveniently wrappered as a Whole Value, making it a distinct type and therefore checked by the type system. The Year class is intended for use as part of a method's interface rather than as part of an object's representation; it is at the interface that the type safety is really needed. Given that Month and Year are now checked, it is safe to leave the day in the month as a plain int, although you may wish to make it a Whole Value for consistency. The Class Factory Method pattern generally supports the Value Class pattern, making it easier to express new objects in expressions, as in the case of Year. The Class Factory Method pattern is a more specific variant of the Factory Method1 pattern: Factory Method deals specifically with managing object creation in a class hierarchy, Class Factory Method focuses on providing an alternative method of object creation to calling new with a constructor. Conclusion Patterns are gregarious: They like company, and can work well with other patterns to assist in design. The simple issue resolved here, that of value-based programming in Java, hopefully illustrates how a pattern language com- bines patterns to work through a problem and support a set of principles. Next time, we will look at each of the patterns in greater detail. s References 1. Gamma, E., et al., Design Patterns: Elements of Reusable Object-Oriented Software, Addison–Wesley, 1995. 2. Buschmann, F., et al., Pattern-Oriented Software Architecture: A System of Patterns, Wiley, 1996. 3. Coplien, J., Software Patterns, SIGS, 1996. 4. Alpert, S., Brown, K., Woolf, B., The Design Patterns Smalltalk Companion, Addison–Wesley, 1998. 5. Java Idioms, http://c2.com/cgi/wiki. 6. Lea, D., Concurrent Programming in Java: Design Principles and Patterns, Addison–Wesley, 1999. 7. Alexander, C., et al., A Pattern Language: Towns, Buildings, Construction, Oxford University Press, 1977. 8. Coplien, J. and D. Schmidt, Eds., Pattern Languages of Program Design, Addison–Wesley, 1995. 9. Vlissides, J., J. Coplien, and N. Kerth, Eds., Pattern Languages of Program Design 2, Addison–Wesley, 1996. 10. Martin, R., D. Riehle, and F. Buschmann, Eds., Pattern Languages of Program Design 3, Addison–Wesley, 1998. 11. Meszaros, G., Doble, J., "A Pattern Language for Writing Pattern Writing," PLoPD1998. 12. Booch, G., Object-Oriented Analysis and Design with Applications, 2nd edition, Benjamin/Cummings, 1994. 13. Gosling, J., "The Evolution of Numerical Computing in Java," http://java.sun.com/people/jag/FP.html. 14. Cunningham, W., "The CHECKS Pattern Language of Information Integrity," PLoPD1995. 15. Fowler, M., Analysis Patterns: Reusable Object Models, Addison–Wesley, 1997. 16. Henney, K., "Java Patterns and Implementations," presented at BCS OOPS Patterns Day, Oct. 1997, presentation notes and whitepaper, techland.qatraining.com/profile.htm. 17. Warren, N., Bishop, P., Java in Practice: Design Styles and Idioms for Effective Java, Addison–Wesley, 1999.