SlideShare a Scribd company logo
Object? You keep
using that word...
@KevlinHenney
Object? You Keep Using that Word
Object? You Keep Using that Word
/ WordFriday
Agglutination is a process in linguistic morphology
derivation in which complex words are formed by
stringing together morphemes, each with a single
grammatical or semantic meaning. Languages that
use agglutination widely are called agglutinative
languages.
http://en.wikipedia.org/wiki/Agglutination
pneumonoultramicroscopicsilicovolcanoconiosis
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz
fylkestrafikksikkerhetsutvalgssekretariatslederfunksjonene
muvaffakiyetsizleştiricileştiriveremeyebileceklerimizdenmişsinizcesine
hippopotomonstrosesquipedaliophobia
http://www.bonkersworld.net/object-world/
http://www.bonkersworld.net/object-world/
OBJECT-ORIENTED
VenetianBlind Door
Television
Picture
Glass
Sofa
TelevisionRemoteControl
Peephole
Object? You Keep Using that Word
People will be using the
words you choose in their
conversation for the next 20
years. You want to be sure
you do it right.
Unfortunately, many people
get all formal [...]. Just calling
it what it is isn't enough.
They have to tack on a
flowery, computer science-y,
impressive sounding, but
ultimately meaningless word,
like Object, Thing,
Component, Part, Manager,
Entity, or Item.
http://classnamer.com/
http://methodnamer.com/
public interface BookEntity ...
public interface BookEntityFactory ...
public interface ISBNValidator ...
public interface CatalogueRepository ...
public interface CatalogueRepositoryProvider ...
public abstract class AbstractBookEntity
implements BookEntity
public class BookEntityImpl
extends AbstractBookEntity ...
public class BookEntityFactoryImpl
implements BookEntityFactory ...
public class ISBNValidatorImpl
implements ISBNValidator ...
public class CatalogueRepositoryImpl
implements CatalogueRepository ...
public class CatalogueRepositoryProviderImpl
implements CatalogueRepositoryProvider ...
public interface Book ...
public final class ISBN ...
public interface Catalogue ...
public class DescriptionOfCatalogueImplementation
implements Catalogue ...
managerialism, noun
 belief in or reliance on the use of professional
managers in administering or planning an activity
 application of managerial techniques of businesses
to the running of other organisations, such as the
civil service or local authorities
 belief in the importance of tightly managed
organisations, as opposed to individuals, or
groups that do not resemble an organisation
Concise Oxford English Dictionary ∙ Dictionary.com ∙ Wikipedia
One way to name classes is to
give each a unique name,
indicative of its purpose. Unique
names give you the opportunity
to convey a lot of information
without creating names that are
long and unwieldy.
This is exactly the right thing to do
if the names are in common use.
LoanMember BookCopy
LoanIMember IBookCopy
Member BookCopy
Loan
Member BookCopy
role, noun
 an actor's part in a play, film, etc.
 a person or thing's function in a particular
situation
 a function, part or expected behaviour
performed in a particular operation or process
Concise Oxford English Dictionary ∙ Merriam-Webster's Collegiate Dictionary
LoanBorrower LoanItem
Member BookCopy
interface
TreeBuilderParser
TreeBuilderParser
BuilderImpl
TreeParserListenerParser
Builder
Tree
ParserListenerParser
Builder
You can communicate how the new
class is the same by naming some
superclass. It need not be the
immediate superclass, if some distant
ancestor communicates more
clearly.
You can communicate how the new
class is different by finding a word
that accurately highlights the reason
the new class isn't just the superclass.
Connection
Connection
Factory
Connection
Impl
Connection
Connection
Pool
Pooled
Connection
public Connection createConnection(Provider provider)
throws ConnectionFailureException
...
public Connection connectTo(Provider ofUpdates)
throws ConnectionFailure
...
OOP to me means only messaging,
local retention and protection and
hiding of state-process, and
extreme late-binding of all things.
It can be done in Smalltalk and in
LISP. There are possibly other
systems in which this is possible,
but I'm not aware of them.
Alan Kay
William Cook, "On Understanding Data Abstraction, Revisited"
Ignorance
Apathy
Selfishness
Identity
State
Behaviour
Object? You Keep Using that Word
Stack
Stack
{push, pop, depth, top}
Stack[T]
{
push(T),
pop(),
depth() : Integer,
top() : T
}
An interface is a contract to deliver
a certain amount of service.
Clients of the interface depend on
the contract, which is usually
documented in the interface
specification.
Butler W Lampson
"Hints for Computer System Design"
Object? You Keep Using that Word
Stack[T]
{
push(T item),
pop(),
depth() : Integer,
top() : T
}
given:
before = depth()
postcondition:
depth() = before + 1 ∧ top() = item
precondition:
depth() > 0
given:
before = depth()
precondition:
before > 0
postcondition:
depth() = before – 1
given:
result = depth()
postcondition:
result ≥ 0
Object? You Keep Using that Word
alphabet(Stack) =
{push, pop, depth, top}
trace(Stack) =
{⟨ ⟩,
⟨push⟩, ⟨depth⟩,
⟨push, pop⟩, ⟨push, top⟩,
⟨push, depth⟩, ⟨push, push⟩,
⟨depth, push⟩, ⟨depth, depth⟩,
⟨push, push, pop⟩,
...}
Non-EmptyEmpty
depth depth
top
push
pop [depth > 1]
push
pop [depth = 1]
public class Stack_spec
{
public static class A_new_stack
{
@Test
public void has_no_depth() 
@Test()
public void has_no_top() 
}
public static class An_empty_stack
{
@Test()
public void throws_when_popped() 
@Test
public void acquires_depth_by_retaining_a_pushed_item_as_its_top() 
}
public static class A_non_empty_stack
{
@Test
public void becomes_deeper_by_retaining_a_pushed_item_as_its_top() 
@Test
public void on_popping_reveals_tops_in_reverse_order_of_pushing() 
}
}
public class
Stack_spec
{
public static class
A_new_stack
{
@Test
public void has_no_depth() 
@Test()
public void has_no_top() 
}
public static class
An_empty_stack
{
@Test()
public void throws_when_popped() 
@Test
public void acquires_depth_by_retaining_a_pushed_item_as_its_top() 
}
public static class
A_non_empty_stack
{
@Test
public void becomes_deeper_by_retaining_a_pushed_item_as_its_top() 
@Test
public void on_popping_reveals_tops_in_reverse_order_of_pushing() 
}
}
public class
Stack_spec
{
public static class
A_new_stack
{
@Test
public void has_no_depth() 
@Test()
public void has_no_top() 
}
public static class
An_empty_stack
{
@Test()
public void throws_when_popped() 
@Test
public void acquires_depth_by_retaining_a_pushed_item_as_its_top() 
}
public static class
A_non_empty_stack
{
@Test
public void becomes_deeper_by_retaining_a_pushed_item_as_its_top() 
@Test
public void on_popping_reveals_tops_in_reverse_order_of_pushing() 
}
}
Object? You Keep Using that Word
Many objects have no conceptual
identity. These objects describe
some characteristic of a thing.
When you care only about the
attributes of an element of the
model, classify it as a value
object. Make it express the
meaning of the attributes it
conveys and give it related
functionality. Treat the value
object as immutable. Don't give it
any identity and avoid the design
complexities necessary to
maintain entities.
Identity
State
Behaviour
Identity
State
Behaviour
Encapsulation
Inheritance
Polymorphism
Encapsulation
Polymorphism
Inheritance
Encapsulation
Polymorphism
Inheritance
encapsulate, verb
 enclose (something) in or as if in a capsule.
 express the essential feature of (someone or
something) succinctly.
 provide an interface for (a piece of software or
hardware) to allow or simplify access for the user.
The New Oxford Dictionary of English
In many object-oriented programming languages the concept of
inheritance is present, which provides a mechanism for sharing code
among several classes of objects. Many people even regard inheritance
as the hallmark of object-orientedness in programming languages. We
do not agree with this view, and argue that the essence of object-
oriented programming is the encapsulation of data and operations in
objects and the protection of individual objects against each other.
Pierre America
"A Behavioural Approach to Subtyping in Object-Oriented Programming Languages"
In many object-oriented programming languages the concept of
inheritance is present, which provides a mechanism for sharing code
among several classes of objects. Many people even regard inheritance
as the hallmark of object-orientedness in programming languages. We
do not agree with this view, and argue that the essence of object-
oriented programming is the encapsulation of data and operations in
objects and the protection of individual objects against each other.
The author considers this principle of protection of objects against each
other as the basic and essential characteristic of object-oriented
programming. It is a refinement of the technique of abstract data types,
because it does not only protect one type of objects against all other
types, but one object against all other ones. As a programmer we can
consider ourselves at any moment to be sitting in exactly one object and
looking at all the other objects from outside.
Pierre America
"A Behavioural Approach to Subtyping in Object-Oriented Programming Languages"
Object? You Keep Using that Word
Object-oriented programming does not
have an exclusive claim to all these good
properties. Systems may be modeled by
other paradigms.
Resilience can be achieved just as well
by organizing programs around abstract
data types, independently of taxonomies;
in fact, data abstraction alone is
sometimes taken as the essence of object
orientation.
abstraction, n. (Logic)
 the process of formulating a generalized concept of
a common property by disregarding the differences
between a number of particular instances. On such
an account, we acquired the concept of red by
recognizing it as common to, and so abstracting it
from the other properties of, those individual
objects we were originally taught to call red.
 an operator that forms a class name or predicate
from any given expression.
E J Borowski and J M Borwein
Dictionary of Mathematics
 T   RecentlyUsedList 
{
new : RecentlyUsedList[T],
isEmpty : RecentlyUsedList[T]  Boolean,
size : RecentlyUsedList[T]  Integer,
add : RecentlyUsedList[T]  T  RecentlyUsedList[T],
get : RecentlyUsedList[T]  Integer  T,
equals : RecentlyUsedList[T]  RecentlyUsedList[T]  Boolean
}
public class RecentlyUsedList
{
private …
public boolean isEmpty() …
public int size() …
public void add(String toAdd) …
public String get(int index) …
public boolean equals(RecentlyUsedList other) …
}
public class RecentlyUsedList
{
private …
public boolean isEmpty() …
public int size() …
public void add(String toAdd) …
public String get(int index) …
public boolean equals(RecentlyUsedList other) …
public boolean equals(Object other) …
}
public class RecentlyUsedList
{
private List<String> items = new ArrayList<String>();
public boolean isEmpty()
{
return items.isEmpty();
}
public int size()
{
return items.size();
}
public void add(String toAdd)
{
items.remove(toAdd);
items.add(toAdd);
}
public String get(int index)
{
return items.get(size() – index – 1);
}
public boolean equals(RecentlyUsedList other)
{
return other != null && items.equals(other.items);
}
public boolean equals(Object other)
{
return
other instanceof RecentlyUsedList &&
equals((RecentlyUsedList) other);
}
}
typedef struct RecentlyUsedList RecentlyUsedList;
RecentlyUsedList * create();
void destroy(RecentlyUsedList *);
bool isEmpty(const RecentlyUsedList *);
int size(const RecentlyUsedList *);
void add(RecentlyUsedList *, int toAdd);
int get(const RecentlyUsedList *, int index);
bool equals(const RecentlyUsedList *, const RecentlyUsedList *);
struct RecentlyUsedList
{
int * items;
int length;
};
RecentlyUsedList * create()
{
RecentlyUsedList * result = (RecentlyUsedList *) malloc(sizeof(RecentlyUsedList));
result->items = 0;
result->length = 0;
return result;
}
void destroy(RecentlyUsedList * self)
{
free(self->items);
free(self);
}
bool isEmpty(const RecentlyUsedList * self)
{
return self->length == 0;
}
int size(const RecentlyUsedList * self)
{
return self->length;
}
static int indexOf(const RecentlyUsedList * self, int toFind)
{
int result = -1;
for(int index = 0; result == -1 && index != self->length; ++index)
if(self->items[index] == toFind)
result = index;
return result;
}
static void removeAt(RecentlyUsedList * self, int index)
{
memmove(&self->items[index], &self->items[index + 1], (self->length - index - 1) * sizeof(int));
--self->length;
}
void add(RecentlyUsedList * self, int toAdd)
{
int found = indexOf(self, toAdd);
if(found != -1)
removeAt(self, found);
self->items = (int *) realloc(self->items, (self->length + 1) * sizeof(int));
self->items[self->length] = toAdd;
++self->length;
}
int get(const RecentlyUsedList * self, int index)
{
return self->items[self->length - index - 1];
}
bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
return lhs->length == rhs->length && memcmp(lhs->items, rhs->items, lhs->length * sizeof(int)) == 0;
}
struct RecentlyUsedList
{
std::vector<int> items;
};
extern "C"
{
RecentlyUsedList * create()
{
return new RecentlyUsedList;
}
void destroy(RecentlyUsedList * self)
{
delete self;
}
bool isEmpty(const RecentlyUsedList * self)
{
return self->items.empty();
}
int size(const RecentlyUsedList * self)
{
return self->items.size();
}
void add(RecentlyUsedList * self, int toAdd)
{
std::vector<int>::iterator found =
std::find(self->items.begin(), self->items.end(), toAdd);
if(found != self->items.end())
self->items.erase(found);
self->items.push_back(toAdd);
}
int get(const RecentlyUsedList * self, int index)
{
return self->items[self->items.size() - index - 1];
}
bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
return lhs->items == rhs->items;
}
}
OO ≡ ADT?
OO ≡ ADT/
William Cook, "On Understanding Data Abstraction, Revisited"
public class RecentlyUsedList
{
...
public boolean equals(RecentlyUsedList other)
{
return other != null && items.equals(other.items);
}
public boolean equals(Object other)
{
return
other instanceof RecentlyUsedList &&
equals((RecentlyUsedList) other);
}
}
bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
return
lhs->length == rhs->length &&
memcmp(lhs->items, rhs->items, lhs->length * sizeof(int)) == 0;
}
extern "C"
{
...
bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
return lhs->items == rhs->items;
}
}
bool equals(
const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
bool result = size(lhs) == size(rhs);
for(int index = 0; result && index != size(lhs); ++index)
result = get(lhs, index) == get(rhs, index);
return result;
}
extern "C" bool equals(
const RecentlyUsedList * lhs, const RecentlyUsedList * rhs)
{
bool result = size(lhs) == size(rhs);
for(int index = 0; result && index != size(lhs); ++index)
result = get(lhs, index) == get(rhs, index);
return result;
}
public class RecentlyUsedList
{
...
public boolean equals(RecentlyUsedList other)
{
boolean result = other != null && size() == other.size();
for(int index = 0; result && index != size(); ++index)
result = get(index).equals(other.get(index));
return result;
}
public boolean equals(Object other)
{
return
other instanceof RecentlyUsedList &&
equals((RecentlyUsedList) other);
}
}
One of the most pure object-oriented
programming models yet defined is the
Component Object Model (COM). It
enforces all of these principles rigorously.
Programming in COM is very flexible and
powerful as a result. There is no built-in notion
of equality. There is no way to determine if
an object is an instance of a given class.
William Cook
"On Understanding Data Abstraction, Revisited"
public class RecentlyUsedList
{
...
public boolean equals(RecentlyUsedList other)
{
boolean result = other != null && size() == other.size();
for(int index = 0; result && index != size(); ++index)
result = get(index).equals(other.get(index));
return result;
}
public boolean equals(Object other)
{
return
other instanceof RecentlyUsedList &&
equals((RecentlyUsedList) other);
}
}
public class RecentlyUsedList
{
...
public boolean equals(RecentlyUsedList other)
{
boolean result = other != null && size() == other.size();
for(int index = 0; result && index != size(); ++index)
result = get(index).equals(other.get(index));
return result;
}
}
In a purist view of object-oriented
methodology, dynamic dispatch is the only
mechanism for taking advantage of attributes
that have been forgotten by subsumption.
This position is often taken on abstraction
grounds: no knowledge should be obtainable
about objects except by invoking their
methods. In the purist approach,
subsumption provides a simple and effective
mechanism for hiding private attributes.
William Cook, "On Understanding Data Abstraction, Revisited"
public interface RecentlyUsedList
{
boolean isEmpty();
int size();
void add(String toAdd);
String get(int index);
boolean equals(RecentlyUsedList other);
}
public class RecentlyUsedListImpl
implements RecentlyUsedList
{
private List<String> items = …;
public boolean isEmpty() …
public int size() …
public void add(String toAdd) …
public String get(int index) …
public boolean equals(RecentlyUsedList other) …
public boolean equals(Object other) …
}
public class ArrayListBasedRecentlyUsedList
implements RecentlyUsedList
{
private List<String> items = …;
public boolean isEmpty() …
public int size() …
public void add(String toAdd) …
public String get(int index) …
public boolean equals(RecentlyUsedList other) …
public boolean equals(Object other) …
}
public class RandomAccessRecentlyUsedList
implements RecentlyUsedList
{
private List<String> items = …;
public boolean isEmpty() …
public int size() …
public void add(String toAdd) …
public String get(int index) …
public boolean equals(RecentlyUsedList other) …
public boolean equals(Object other) …
}
RecentlyUsedList list =
new RandomAccessRecentlyUsedList();
William Cook, "On Understanding Data Abstraction, Revisited"
Object? You Keep Using that Word
Object? You Keep Using that Word

More Related Content

What's hot (20)

PPT
Using uml for ontology construction a case study in agriculture
AIMS (Agricultural Information Management Standards)
 
PPTX
CLASS OBJECT AND INHERITANCE IN PYTHON
Lalitkumar_98
 
PDF
Contexts 4 quantification (CommonSense2013)
Valeria de Paiva
 
PPT
Artificial intelligence Prolog Language
REHMAT ULLAH
 
PPTX
Python OOPs
Binay Kumar Ray
 
PPTX
C# interview
Thomson Reuters
 
DOC
C#
LiquidHub
 
PDF
Object oriented programming
mustafa sarac
 
PPTX
Polymorphism in Python
Home
 
PPT
ITU - MDD - XText
Tonny Madsen
 
PDF
Lean Logic for Lean Times: Entailment and Contradiction Revisited
Valeria de Paiva
 
PPTX
Object Oriented Programming in Python
Sujith Kumar
 
DOCX
C# interview quesions
Shashwat Shriparv
 
PPTX
Class, object and inheritance in python
Santosh Verma
 
PPTX
Top 20 c# interview Question and answers
w3asp dotnet
 
PDF
Architecture logicielle #3 : object oriented design
Jean Michel
 
PDF
Monad Fact #6
Philip Schwarz
 
PDF
Benchmarking Linear Logic Proofs
Valeria de Paiva
 
PPTX
Js: master prototypes
Barak Drechsler
 
PPT
Adapt OWL as a Modular Ontology Language
Jie Bao
 
Using uml for ontology construction a case study in agriculture
AIMS (Agricultural Information Management Standards)
 
CLASS OBJECT AND INHERITANCE IN PYTHON
Lalitkumar_98
 
Contexts 4 quantification (CommonSense2013)
Valeria de Paiva
 
Artificial intelligence Prolog Language
REHMAT ULLAH
 
Python OOPs
Binay Kumar Ray
 
C# interview
Thomson Reuters
 
Object oriented programming
mustafa sarac
 
Polymorphism in Python
Home
 
ITU - MDD - XText
Tonny Madsen
 
Lean Logic for Lean Times: Entailment and Contradiction Revisited
Valeria de Paiva
 
Object Oriented Programming in Python
Sujith Kumar
 
C# interview quesions
Shashwat Shriparv
 
Class, object and inheritance in python
Santosh Verma
 
Top 20 c# interview Question and answers
w3asp dotnet
 
Architecture logicielle #3 : object oriented design
Jean Michel
 
Monad Fact #6
Philip Schwarz
 
Benchmarking Linear Logic Proofs
Valeria de Paiva
 
Js: master prototypes
Barak Drechsler
 
Adapt OWL as a Modular Ontology Language
Jie Bao
 

Viewers also liked (20)

PDF
Declarative Thinking, Declarative Practice
Kevlin Henney
 
PDF
The Error of Our Ways
Kevlin Henney
 
PDF
Seven Ineffective Coding Habits of Many Programmers
Kevlin Henney
 
PDF
Python Advanced – Building on the foundation
Kevlin Henney
 
PDF
Game of Sprints
Kevlin Henney
 
PDF
Object Oriented Css For High Performance Websites And Applications
PerconaPerformance
 
PPTX
Salt Lake City 2013 - Presentation
Jiří Douša George.Dousa
 
PDF
Object-Oriented Design Heuristics
kim.mens
 
PDF
FizzBuzz Trek
Kevlin Henney
 
PDF
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Kevlin Henney
 
PDF
The Rule of Three
Kevlin Henney
 
PPTX
RED Y NET (Cordara y Beltran)
Sele Cordara
 
DOCX
Quick installation with an existing router or modern router
IT Tech
 
PPS
Domek
guest370085
 
PPT
Fundraising and the next gen 3.10.11
Emily Davis Consulting
 
PDF
Piotr Wilam - Product Development Days - Raise the bar high
Innovation Nest VC
 
PDF
05042 0-16-131 benjamin mauricio rivera fernandez
mauricio benitez
 
PDF
2016 October Tools for Change CGI Newsletter
Dr. Chris Stout
 
PPTX
Nature Thrill
Maxpromotion
 
PPTX
Equity Scholarship Provision in Australian Universities: Insights and Directions
Australian Centre for Student Equity and Success
 
Declarative Thinking, Declarative Practice
Kevlin Henney
 
The Error of Our Ways
Kevlin Henney
 
Seven Ineffective Coding Habits of Many Programmers
Kevlin Henney
 
Python Advanced – Building on the foundation
Kevlin Henney
 
Game of Sprints
Kevlin Henney
 
Object Oriented Css For High Performance Websites And Applications
PerconaPerformance
 
Salt Lake City 2013 - Presentation
Jiří Douša George.Dousa
 
Object-Oriented Design Heuristics
kim.mens
 
FizzBuzz Trek
Kevlin Henney
 
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Kevlin Henney
 
The Rule of Three
Kevlin Henney
 
RED Y NET (Cordara y Beltran)
Sele Cordara
 
Quick installation with an existing router or modern router
IT Tech
 
Fundraising and the next gen 3.10.11
Emily Davis Consulting
 
Piotr Wilam - Product Development Days - Raise the bar high
Innovation Nest VC
 
05042 0-16-131 benjamin mauricio rivera fernandez
mauricio benitez
 
2016 October Tools for Change CGI Newsletter
Dr. Chris Stout
 
Nature Thrill
Maxpromotion
 
Equity Scholarship Provision in Australian Universities: Insights and Directions
Australian Centre for Student Equity and Success
 
Ad

Similar to Object? You Keep Using that Word (20)

DOCX
Java OOPs Concepts.docx
FredWauyo
 
PPTX
Introduction to OOP.pptx
ParthaSarathiBehera9
 
PDF
Semantic IoT Semantic Inter-Operability Practices - Part 1
iotest
 
PPTX
01. design pattern
MD Sayem Ahmed
 
DOCX
A Survey of Object Oriented Programming LanguagesMaya Hris.docx
daniahendric
 
PDF
It Is Possible to Do Object-Oriented Programming in Java
Kevlin Henney
 
PPTX
OOP by hrishikesh dhola
HrishikeshDhola
 
PPT
Oop by edgar lagman jr
Jun-jun Lagman
 
PDF
Oop.concepts
tahir266
 
PPT
SEMINAR
priteshkhandelwal
 
PPT
Seminar
priteshkhandelwal
 
PDF
Object And Oriented Programing ( Oop ) Languages
Jessica Deakin
 
PDF
SMalL - Semantic Malware Log Based Reporter
Stefan Prutianu
 
PDF
SELFLESS INHERITANCE
ijpla
 
PPTX
OOPS in Java
Zeeshan Khan
 
PPT
Object Oriented Language
dheva B
 
PPTX
NUIG Research Showcase 2014
Bianca Pereira
 
PPTX
Object Oriented Principles
Emprovise
 
Java OOPs Concepts.docx
FredWauyo
 
Introduction to OOP.pptx
ParthaSarathiBehera9
 
Semantic IoT Semantic Inter-Operability Practices - Part 1
iotest
 
01. design pattern
MD Sayem Ahmed
 
A Survey of Object Oriented Programming LanguagesMaya Hris.docx
daniahendric
 
It Is Possible to Do Object-Oriented Programming in Java
Kevlin Henney
 
OOP by hrishikesh dhola
HrishikeshDhola
 
Oop by edgar lagman jr
Jun-jun Lagman
 
Oop.concepts
tahir266
 
Object And Oriented Programing ( Oop ) Languages
Jessica Deakin
 
SMalL - Semantic Malware Log Based Reporter
Stefan Prutianu
 
SELFLESS INHERITANCE
ijpla
 
OOPS in Java
Zeeshan Khan
 
Object Oriented Language
dheva B
 
NUIG Research Showcase 2014
Bianca Pereira
 
Object Oriented Principles
Emprovise
 
Ad

More from Kevlin Henney (20)

PDF
Program with GUTs
Kevlin Henney
 
PDF
The Case for Technical Excellence
Kevlin Henney
 
PDF
Empirical Development
Kevlin Henney
 
PDF
Lambda? You Keep Using that Letter
Kevlin Henney
 
PDF
Lambda? You Keep Using that Letter
Kevlin Henney
 
PDF
Get Kata
Kevlin Henney
 
PDF
Procedural Programming: It’s Back? It Never Went Away
Kevlin Henney
 
PDF
Structure and Interpretation of Test Cases
Kevlin Henney
 
PDF
Agility ≠ Speed
Kevlin Henney
 
PDF
Refactoring to Immutability
Kevlin Henney
 
PDF
Old Is the New New
Kevlin Henney
 
PDF
Turning Development Outside-In
Kevlin Henney
 
PDF
Giving Code a Good Name
Kevlin Henney
 
PDF
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Kevlin Henney
 
PDF
Thinking Outside the Synchronisation Quadrant
Kevlin Henney
 
PDF
Code as Risk
Kevlin Henney
 
PDF
Software Is Details
Kevlin Henney
 
PDF
Good Code
Kevlin Henney
 
PDF
Driven to Tests
Kevlin Henney
 
PDF
Learning Curve
Kevlin Henney
 
Program with GUTs
Kevlin Henney
 
The Case for Technical Excellence
Kevlin Henney
 
Empirical Development
Kevlin Henney
 
Lambda? You Keep Using that Letter
Kevlin Henney
 
Lambda? You Keep Using that Letter
Kevlin Henney
 
Get Kata
Kevlin Henney
 
Procedural Programming: It’s Back? It Never Went Away
Kevlin Henney
 
Structure and Interpretation of Test Cases
Kevlin Henney
 
Agility ≠ Speed
Kevlin Henney
 
Refactoring to Immutability
Kevlin Henney
 
Old Is the New New
Kevlin Henney
 
Turning Development Outside-In
Kevlin Henney
 
Giving Code a Good Name
Kevlin Henney
 
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Kevlin Henney
 
Thinking Outside the Synchronisation Quadrant
Kevlin Henney
 
Code as Risk
Kevlin Henney
 
Software Is Details
Kevlin Henney
 
Good Code
Kevlin Henney
 
Driven to Tests
Kevlin Henney
 
Learning Curve
Kevlin Henney
 

Recently uploaded (20)

PDF
Difference Between Kubernetes and Docker .pdf
Kindlebit Solutions
 
PPTX
NeuroStrata: Harnessing Neuro-Symbolic Paradigms for Improved Testability and...
Ivan Ruchkin
 
PPTX
Cubase Pro Crack 2025 – Free Download Full Version with Activation Key
HyperPc soft
 
PDF
Understanding the Need for Systemic Change in Open Source Through Intersectio...
Imma Valls Bernaus
 
PDF
GridView,Recycler view, API, SQLITE& NetworkRequest.pdf
Nabin Dhakal
 
PDF
Dealing with JSON in the relational world
Andres Almiray
 
PPTX
Automatic_Iperf_Log_Result_Excel_visual_v2.pptx
Chen-Chih Lee
 
PDF
Designing Accessible Content Blocks (1).pdf
jaclynmennie1
 
PDF
65811_Introducing the Fusion AI Agent Studio (1).pdf
g6129590
 
PDF
>Nitro Pro Crack 14.36.1.0 + Keygen Free Download [Latest]
utfefguu
 
PPTX
3uTools Full Crack Free Version Download [Latest] 2025
muhammadgurbazkhan
 
PDF
Capcut Pro Crack For PC Latest Version {Fully Unlocked} 2025
hashhshs786
 
PDF
Transparency into Your Software’s True Reach
team-WIBU
 
PPTX
For my supp to finally picking supp that work
necas19388
 
PPTX
ManageIQ - Sprint 264 Review - Slide Deck
ManageIQ
 
PPTX
Quality on Autopilot: Scaling Testing in Uyuni
Oscar Barrios Torrero
 
PPTX
EO4EU Ocean Monitoring: Maritime Weather Routing Optimsation Use Case
EO4EU
 
PPTX
ERP - FICO Presentation BY BSL BOKARO STEEL LIMITED.pptx
ravisranjan
 
PPTX
Android Notifications-A Guide to User-Facing Alerts in Android .pptx
Nabin Dhakal
 
PDF
Rewards and Recognition (2).pdf
ethan Talor
 
Difference Between Kubernetes and Docker .pdf
Kindlebit Solutions
 
NeuroStrata: Harnessing Neuro-Symbolic Paradigms for Improved Testability and...
Ivan Ruchkin
 
Cubase Pro Crack 2025 – Free Download Full Version with Activation Key
HyperPc soft
 
Understanding the Need for Systemic Change in Open Source Through Intersectio...
Imma Valls Bernaus
 
GridView,Recycler view, API, SQLITE& NetworkRequest.pdf
Nabin Dhakal
 
Dealing with JSON in the relational world
Andres Almiray
 
Automatic_Iperf_Log_Result_Excel_visual_v2.pptx
Chen-Chih Lee
 
Designing Accessible Content Blocks (1).pdf
jaclynmennie1
 
65811_Introducing the Fusion AI Agent Studio (1).pdf
g6129590
 
>Nitro Pro Crack 14.36.1.0 + Keygen Free Download [Latest]
utfefguu
 
3uTools Full Crack Free Version Download [Latest] 2025
muhammadgurbazkhan
 
Capcut Pro Crack For PC Latest Version {Fully Unlocked} 2025
hashhshs786
 
Transparency into Your Software’s True Reach
team-WIBU
 
For my supp to finally picking supp that work
necas19388
 
ManageIQ - Sprint 264 Review - Slide Deck
ManageIQ
 
Quality on Autopilot: Scaling Testing in Uyuni
Oscar Barrios Torrero
 
EO4EU Ocean Monitoring: Maritime Weather Routing Optimsation Use Case
EO4EU
 
ERP - FICO Presentation BY BSL BOKARO STEEL LIMITED.pptx
ravisranjan
 
Android Notifications-A Guide to User-Facing Alerts in Android .pptx
Nabin Dhakal
 
Rewards and Recognition (2).pdf
ethan Talor
 

Object? You Keep Using that Word

  • 1. Object? You keep using that word... @KevlinHenney
  • 5. Agglutination is a process in linguistic morphology derivation in which complex words are formed by stringing together morphemes, each with a single grammatical or semantic meaning. Languages that use agglutination widely are called agglutinative languages. http://en.wikipedia.org/wiki/Agglutination
  • 10. People will be using the words you choose in their conversation for the next 20 years. You want to be sure you do it right. Unfortunately, many people get all formal [...]. Just calling it what it is isn't enough.
  • 11. They have to tack on a flowery, computer science-y, impressive sounding, but ultimately meaningless word, like Object, Thing, Component, Part, Manager, Entity, or Item.
  • 14. public interface BookEntity ... public interface BookEntityFactory ... public interface ISBNValidator ... public interface CatalogueRepository ... public interface CatalogueRepositoryProvider ... public abstract class AbstractBookEntity implements BookEntity public class BookEntityImpl extends AbstractBookEntity ... public class BookEntityFactoryImpl implements BookEntityFactory ... public class ISBNValidatorImpl implements ISBNValidator ... public class CatalogueRepositoryImpl implements CatalogueRepository ... public class CatalogueRepositoryProviderImpl implements CatalogueRepositoryProvider ...
  • 15. public interface Book ... public final class ISBN ... public interface Catalogue ... public class DescriptionOfCatalogueImplementation implements Catalogue ...
  • 16. managerialism, noun  belief in or reliance on the use of professional managers in administering or planning an activity  application of managerial techniques of businesses to the running of other organisations, such as the civil service or local authorities  belief in the importance of tightly managed organisations, as opposed to individuals, or groups that do not resemble an organisation Concise Oxford English Dictionary ∙ Dictionary.com ∙ Wikipedia
  • 17. One way to name classes is to give each a unique name, indicative of its purpose. Unique names give you the opportunity to convey a lot of information without creating names that are long and unwieldy. This is exactly the right thing to do if the names are in common use.
  • 21. role, noun  an actor's part in a play, film, etc.  a person or thing's function in a particular situation  a function, part or expected behaviour performed in a particular operation or process Concise Oxford English Dictionary ∙ Merriam-Webster's Collegiate Dictionary
  • 28. You can communicate how the new class is the same by naming some superclass. It need not be the immediate superclass, if some distant ancestor communicates more clearly. You can communicate how the new class is different by finding a word that accurately highlights the reason the new class isn't just the superclass.
  • 31. public Connection createConnection(Provider provider) throws ConnectionFailureException ...
  • 32. public Connection connectTo(Provider ofUpdates) throws ConnectionFailure ...
  • 33. OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them. Alan Kay
  • 34. William Cook, "On Understanding Data Abstraction, Revisited"
  • 38. Stack
  • 41. An interface is a contract to deliver a certain amount of service. Clients of the interface depend on the contract, which is usually documented in the interface specification. Butler W Lampson "Hints for Computer System Design"
  • 43. Stack[T] { push(T item), pop(), depth() : Integer, top() : T } given: before = depth() postcondition: depth() = before + 1 ∧ top() = item precondition: depth() > 0 given: before = depth() precondition: before > 0 postcondition: depth() = before – 1 given: result = depth() postcondition: result ≥ 0
  • 46. trace(Stack) = {⟨ ⟩, ⟨push⟩, ⟨depth⟩, ⟨push, pop⟩, ⟨push, top⟩, ⟨push, depth⟩, ⟨push, push⟩, ⟨depth, push⟩, ⟨depth, depth⟩, ⟨push, push, pop⟩, ...}
  • 48. public class Stack_spec { public static class A_new_stack { @Test public void has_no_depth()  @Test() public void has_no_top()  } public static class An_empty_stack { @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  • 49. public class Stack_spec { public static class A_new_stack { @Test public void has_no_depth()  @Test() public void has_no_top()  } public static class An_empty_stack { @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  • 50. public class Stack_spec { public static class A_new_stack { @Test public void has_no_depth()  @Test() public void has_no_top()  } public static class An_empty_stack { @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  • 52. Many objects have no conceptual identity. These objects describe some characteristic of a thing.
  • 53. When you care only about the attributes of an element of the model, classify it as a value object. Make it express the meaning of the attributes it conveys and give it related functionality. Treat the value object as immutable. Don't give it any identity and avoid the design complexities necessary to maintain entities.
  • 59. encapsulate, verb  enclose (something) in or as if in a capsule.  express the essential feature of (someone or something) succinctly.  provide an interface for (a piece of software or hardware) to allow or simplify access for the user. The New Oxford Dictionary of English
  • 60. In many object-oriented programming languages the concept of inheritance is present, which provides a mechanism for sharing code among several classes of objects. Many people even regard inheritance as the hallmark of object-orientedness in programming languages. We do not agree with this view, and argue that the essence of object- oriented programming is the encapsulation of data and operations in objects and the protection of individual objects against each other. Pierre America "A Behavioural Approach to Subtyping in Object-Oriented Programming Languages"
  • 61. In many object-oriented programming languages the concept of inheritance is present, which provides a mechanism for sharing code among several classes of objects. Many people even regard inheritance as the hallmark of object-orientedness in programming languages. We do not agree with this view, and argue that the essence of object- oriented programming is the encapsulation of data and operations in objects and the protection of individual objects against each other. The author considers this principle of protection of objects against each other as the basic and essential characteristic of object-oriented programming. It is a refinement of the technique of abstract data types, because it does not only protect one type of objects against all other types, but one object against all other ones. As a programmer we can consider ourselves at any moment to be sitting in exactly one object and looking at all the other objects from outside. Pierre America "A Behavioural Approach to Subtyping in Object-Oriented Programming Languages"
  • 63. Object-oriented programming does not have an exclusive claim to all these good properties. Systems may be modeled by other paradigms. Resilience can be achieved just as well by organizing programs around abstract data types, independently of taxonomies; in fact, data abstraction alone is sometimes taken as the essence of object orientation.
  • 64. abstraction, n. (Logic)  the process of formulating a generalized concept of a common property by disregarding the differences between a number of particular instances. On such an account, we acquired the concept of red by recognizing it as common to, and so abstracting it from the other properties of, those individual objects we were originally taught to call red.  an operator that forms a class name or predicate from any given expression. E J Borowski and J M Borwein Dictionary of Mathematics
  • 65.  T   RecentlyUsedList  { new : RecentlyUsedList[T], isEmpty : RecentlyUsedList[T]  Boolean, size : RecentlyUsedList[T]  Integer, add : RecentlyUsedList[T]  T  RecentlyUsedList[T], get : RecentlyUsedList[T]  Integer  T, equals : RecentlyUsedList[T]  RecentlyUsedList[T]  Boolean }
  • 66. public class RecentlyUsedList { private … public boolean isEmpty() … public int size() … public void add(String toAdd) … public String get(int index) … public boolean equals(RecentlyUsedList other) … }
  • 67. public class RecentlyUsedList { private … public boolean isEmpty() … public int size() … public void add(String toAdd) … public String get(int index) … public boolean equals(RecentlyUsedList other) … public boolean equals(Object other) … }
  • 68. public class RecentlyUsedList { private List<String> items = new ArrayList<String>(); public boolean isEmpty() { return items.isEmpty(); } public int size() { return items.size(); } public void add(String toAdd) { items.remove(toAdd); items.add(toAdd); } public String get(int index) { return items.get(size() – index – 1); } public boolean equals(RecentlyUsedList other) { return other != null && items.equals(other.items); } public boolean equals(Object other) { return other instanceof RecentlyUsedList && equals((RecentlyUsedList) other); } }
  • 69. typedef struct RecentlyUsedList RecentlyUsedList; RecentlyUsedList * create(); void destroy(RecentlyUsedList *); bool isEmpty(const RecentlyUsedList *); int size(const RecentlyUsedList *); void add(RecentlyUsedList *, int toAdd); int get(const RecentlyUsedList *, int index); bool equals(const RecentlyUsedList *, const RecentlyUsedList *);
  • 70. struct RecentlyUsedList { int * items; int length; };
  • 71. RecentlyUsedList * create() { RecentlyUsedList * result = (RecentlyUsedList *) malloc(sizeof(RecentlyUsedList)); result->items = 0; result->length = 0; return result; } void destroy(RecentlyUsedList * self) { free(self->items); free(self); } bool isEmpty(const RecentlyUsedList * self) { return self->length == 0; } int size(const RecentlyUsedList * self) { return self->length; } static int indexOf(const RecentlyUsedList * self, int toFind) { int result = -1; for(int index = 0; result == -1 && index != self->length; ++index) if(self->items[index] == toFind) result = index; return result; } static void removeAt(RecentlyUsedList * self, int index) { memmove(&self->items[index], &self->items[index + 1], (self->length - index - 1) * sizeof(int)); --self->length; } void add(RecentlyUsedList * self, int toAdd) { int found = indexOf(self, toAdd); if(found != -1) removeAt(self, found); self->items = (int *) realloc(self->items, (self->length + 1) * sizeof(int)); self->items[self->length] = toAdd; ++self->length; } int get(const RecentlyUsedList * self, int index) { return self->items[self->length - index - 1]; } bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { return lhs->length == rhs->length && memcmp(lhs->items, rhs->items, lhs->length * sizeof(int)) == 0; }
  • 73. extern "C" { RecentlyUsedList * create() { return new RecentlyUsedList; } void destroy(RecentlyUsedList * self) { delete self; } bool isEmpty(const RecentlyUsedList * self) { return self->items.empty(); } int size(const RecentlyUsedList * self) { return self->items.size(); } void add(RecentlyUsedList * self, int toAdd) { std::vector<int>::iterator found = std::find(self->items.begin(), self->items.end(), toAdd); if(found != self->items.end()) self->items.erase(found); self->items.push_back(toAdd); } int get(const RecentlyUsedList * self, int index) { return self->items[self->items.size() - index - 1]; } bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { return lhs->items == rhs->items; } }
  • 76. William Cook, "On Understanding Data Abstraction, Revisited"
  • 77. public class RecentlyUsedList { ... public boolean equals(RecentlyUsedList other) { return other != null && items.equals(other.items); } public boolean equals(Object other) { return other instanceof RecentlyUsedList && equals((RecentlyUsedList) other); } }
  • 78. bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { return lhs->length == rhs->length && memcmp(lhs->items, rhs->items, lhs->length * sizeof(int)) == 0; }
  • 79. extern "C" { ... bool equals(const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { return lhs->items == rhs->items; } }
  • 80. bool equals( const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { bool result = size(lhs) == size(rhs); for(int index = 0; result && index != size(lhs); ++index) result = get(lhs, index) == get(rhs, index); return result; }
  • 81. extern "C" bool equals( const RecentlyUsedList * lhs, const RecentlyUsedList * rhs) { bool result = size(lhs) == size(rhs); for(int index = 0; result && index != size(lhs); ++index) result = get(lhs, index) == get(rhs, index); return result; }
  • 82. public class RecentlyUsedList { ... public boolean equals(RecentlyUsedList other) { boolean result = other != null && size() == other.size(); for(int index = 0; result && index != size(); ++index) result = get(index).equals(other.get(index)); return result; } public boolean equals(Object other) { return other instanceof RecentlyUsedList && equals((RecentlyUsedList) other); } }
  • 83. One of the most pure object-oriented programming models yet defined is the Component Object Model (COM). It enforces all of these principles rigorously. Programming in COM is very flexible and powerful as a result. There is no built-in notion of equality. There is no way to determine if an object is an instance of a given class. William Cook "On Understanding Data Abstraction, Revisited"
  • 84. public class RecentlyUsedList { ... public boolean equals(RecentlyUsedList other) { boolean result = other != null && size() == other.size(); for(int index = 0; result && index != size(); ++index) result = get(index).equals(other.get(index)); return result; } public boolean equals(Object other) { return other instanceof RecentlyUsedList && equals((RecentlyUsedList) other); } }
  • 85. public class RecentlyUsedList { ... public boolean equals(RecentlyUsedList other) { boolean result = other != null && size() == other.size(); for(int index = 0; result && index != size(); ++index) result = get(index).equals(other.get(index)); return result; } }
  • 86. In a purist view of object-oriented methodology, dynamic dispatch is the only mechanism for taking advantage of attributes that have been forgotten by subsumption. This position is often taken on abstraction grounds: no knowledge should be obtainable about objects except by invoking their methods. In the purist approach, subsumption provides a simple and effective mechanism for hiding private attributes.
  • 87. William Cook, "On Understanding Data Abstraction, Revisited"
  • 88. public interface RecentlyUsedList { boolean isEmpty(); int size(); void add(String toAdd); String get(int index); boolean equals(RecentlyUsedList other); }
  • 89. public class RecentlyUsedListImpl implements RecentlyUsedList { private List<String> items = …; public boolean isEmpty() … public int size() … public void add(String toAdd) … public String get(int index) … public boolean equals(RecentlyUsedList other) … public boolean equals(Object other) … }
  • 90. public class ArrayListBasedRecentlyUsedList implements RecentlyUsedList { private List<String> items = …; public boolean isEmpty() … public int size() … public void add(String toAdd) … public String get(int index) … public boolean equals(RecentlyUsedList other) … public boolean equals(Object other) … }
  • 91. public class RandomAccessRecentlyUsedList implements RecentlyUsedList { private List<String> items = …; public boolean isEmpty() … public int size() … public void add(String toAdd) … public String get(int index) … public boolean equals(RecentlyUsedList other) … public boolean equals(Object other) … }
  • 92. RecentlyUsedList list = new RandomAccessRecentlyUsedList();
  • 93. William Cook, "On Understanding Data Abstraction, Revisited"