SlideShare a Scribd company logo
Clean code & design patterns
Pascal Larocque
● TrustCharge Team
● Behat guy
● Testing guy
● SOLID guy
● Pattern guy
● Father of 3
● Star Wars Geek
@pascallarocque
Bad Code
● Singletons
● Tight Coupling
● Untestable
● Premature Optimization
● Indescriptive name
● Duplication
Cost of Bad Code
● Very hard / Impossible to estimate
● Slows down team velocity
● High Learning curve
● Brings down team moral
● Increases cost of development
The Primal Conundrum
Programmers face a conundrum of basic
values. All developers with more than a few
years experience know that previous messes
slow them down. And yet all developers feel the
pressure to make messes in order to meet
deadlines. In short, they don’t take the time to
go fast!
True professionals know that the second part of
the conundrum is wrong. You will not make the
deadline by making the mess. Indeed, the
mess will slow you down instantly, and will
force you to miss the deadline. The only way to
make the deadline—the only way to go fast—is
to keep the code as clean as possible at all
times.
How do I write Clean Code?
What is Clean Code?
“Clean code can be read, and enhanced by a
developer other than its original author. It has
unit and acceptance tests. It has meaningful
names. It provides one way rather than many
ways for doing one thing. It has minimal
dependencies, which are explicitly defined,
and provides a clear and minimal API. Code
should be literate since depending on the
language, not all necessary information can be
expressed clearly in code alone.”
- Dave Thomas
“Clean code is simple and direct. Clean code reads
like well-written prose. Clean code never obscures
the designer’s intent but rather is full of crisp
abstractions and straightforward lines of control.”
- Grady Booch
“I like my code to be elegant and efficient. The logic
should be straightforward to make it hard for bugs to
hide, the dependencies minimal to ease maintenance,
error handling complete according to an articulated
strategy, and performance close to optimal so as not to
tempt people to make the code messy with unprincipled
optimizations. Clean code does one thing well.”
- Bjarne Stroustrup
You know you are working on clean code
when each routine you read turns out to be
pretty much what you expected. You can call it
beautiful code when the code also makes it
look like the language was made for the
problem.
- Ward Cunningham
What is Clean Code?
The Boy Scout Rule
“Leave the campground cleaner than you found it”
Code Rots and Degrades as time passes
The Code has to be kept clean over time. We
must take an active role in preventing the
degradation.
Naming
● Use intention revealing names
○ Why it exists
○ What it does
○ How it’s used
● Classes should have nouns or noun phrases
○ Don’t use Manager, Processor, Data or Info
● Methods should have verbs or verb phrases
● Accessor, Mutators or predicates should
have get, set or is
● Use solution domain name
○ Factory, Visitor, Queue
Functions
● Small
● Smaller than that!!!
● Does ONE THING
● Does ONLY ONE THING
● Blocks and Indentation
○ IF, While, For
● One level of abstraction per function
○ getHTML()
○ $parsed = Parser::render($url)
○ $xml->append($node)
Functions
● Reads like a Top Down Narrative
○ To render the page we get all the content
○ To get all the content we extract it from the DB
○ To extract it from the DB we need to connect
Function Arguments
The ideal number of arguments for a function is
zero (niladic).
Next comes one (monadic), followed closely by
two (dyadic).
Three arguments (triadic) should be avoided
where possible.
More than three (polyadic) requires very special
justification—and then shouldn’t be used
anyway.
Function Arguments - Flags
Flag Arguments should
be avoided.
It does 1 thing if true
and another thing when
it’s false.
render(true):
renderForScreen()
renderForTest()
Function Argument - Objects
It’s easier to pass Objects instead of a long
argument list or array
Rectangle makeRectangle(Double x1, Double y1, Double x2, Double y2)
Rectangle makeRectangle(Point point1, Point point2)
checkPassword(username, password) {
user = $this->dataAccessor->findByUsername
(username)
valid= md5($user->getPassword()) === password
if(valid) {
Session.init(user)
} else {
Session.clear()
}
return valid
}
Have no side effect
Sides effects are lies.
BAD
Enforce Temporal Coupling
class ACL {
function login(username, password) {
this->user = this->findUser(username, password)
this->getPermissions()
this->startACLSession()
}
}
BAD
class ACL {
function login(username, password) {
this->user = this->findUser(username, password)
this->permissions = this->getPermissions($this->user)
this->startACLSession(this->permissions)
}
}
BETTER
if ($this->_sortBySet() === true) {
...
} else if ($this->_sortByActor() === true) {
...
} else if ($this->_sortByClip() === true) {
...
} else {
…
}
Make Conditions clear
if (true === $bySetId && (true === empty($photoCollection) || true === empty($photoSet))) {
...
} else if (true === $byActorId && (true === empty($photoCollection) || true === empty($actor))) {
...
} else if (true === $byClipId && (true === empty($photoCollection) || true === empty($scene))) {
...
} else {
…
}
BAD
BETTER
sortingAlgorithmInterface = phosetSortingFactory->findSorter(sortBy)
sorted list = sortingAlgorithmInterface ->sort(photosetList)
Replace Conditions with Factory
if ($this->_sortBySet() === true) {
...
} else if ($this->_sortByActor() === true {
...
} else if ($this->_sortByClip() === true) {
...
} else {
…
}
POLYMORPHISM
GOODNESS
Abstract Factory Pattern
Encapsulate Change
Class UserRepository {
function findById(id) {
return Doctrine::getTable('Users')->createQuery(‘u’)
->where(‘u.id = ?’, id)
->fetchOne();
}
}
ORM
MY
GOD
Class UserRepository {
function findById(id) {
userData = this->dataAccessor->findById(id)
user = userFactory->create(userData)
return user
}
}
The only constant is Change.
Strategy Pattern
The Law of Demeter
method f of a class C should only call the
methods of these:
● C
● An object created by f
● An object passed as an argument to f
● An object held in an instance variable of C
Class ACL {
protected user
function hasAccessToAdmin() {
return this->user ->isAdmin()
}
}
The Law of Demeter
Class ACL {
function hasAccessToAdmin() {
return getUserManager()
->getUser(123)
->getProfile()
->isAdmin()
}
}
BAD
Class ACL {
protected user
protected aclVisitor
function setVisitor(visitor) { … }
function hasAccessToAdmin() {
return this->aclVisitor
->isAdmin(this->user-getProfile())
}
}
Class AclVisitor {
function isAdmin(profile) {
return profile->isadmin()
}
}
MEH
PATTERNS!!!
Visitor Pattern
Don’t pass NULL, Don’t return NULL
Throw an exception
Return a NullObject
findUser(ID) {
user = this->dataAccessor->findById(ID)
if(user == null) {
user = new NullUser();
}
return user
}
Class NullUser {
function getName { return ‘’ //DO NOTHING }
}
NullObject Pattern
Observer Pattern
Singleton Pattern
Singleton Pattern
"Singletons are the path of the dark side.
Singletons lead to implicit dependencies.
Implicit dependencies lead to global state.
Global state leads to suffering."
As events arrive from the outside world at a port, a
technology-specific adapter converts it into a usable
procedure call or message and passes it to the application.
CreditCardService
Hexagonal Architecture
CreditCardService
HTTP
REST
PHPUnit
SOCKET ADAPTER
When the application has something to send out, it sends it out through a port
to an adapter, which creates the appropriate signals needed by the receiving
technology (human or automated).
CreditCardService
Hexagonal Architecture
CreditCardService
HTML
XML
PHPUnit
JSONP
ADAPTER
Class CreditCardService
__construct(InputInterface, OutputInterface) {
this->input = InputInterface
this->output = OutputInterface
}
function process() {
input = this->input->getInput()
output = this->doProcessing(input)
return this->ouput
->sendOutput(output)
}
}
CreditCardService
Hexagonal Architecture
CreditCardService
class CreditCardHTTPInputAdapter implements
InputInterface{
function getInput() {..}
}
class CreditCardJSONPOutputAdapter
implements OutputInterface{
function sendOutput(output) {..}
}
More stuff
Command Query Separation
Functions should either do something or answer something, but not both.
DRY
Don’t repeat yourself. Duplication may be the root of all evil in software.
SOLID
Single Responsibility, Open/Closed Principle, Liskov substitution principle,
Interface segregation, Dependency Inversion
Structured Programming
Every function and every block has one Entry and one Exit
Use Exceptions and Error Handling
Functions should do one thing. Error handling is one thing. Thus, a function that
handles errors should do nothing else.
SHARE KNOWLEDGE
KNOWLEDGE DECAYS FAST
SLOW DOWN TO GO FAST
NEVER ASK PERMISSION TO DO YOUR
JOB CORRECTLY
QUESTIONS?

More Related Content

What's hot (6)

PPT
JAVA Collections frame work ppt
Ranjith Alappadan
 
PPTX
React JS part 1
Diluka Wittahachchige
 
PDF
React native - under the bridge - react week NYC
Chen Feldman
 
PPTX
Ecommerce Mini Project / Group Project Coding
Hemant Sarthak
 
PPT
Test Automation Framework Development Introduction
Ganuka Yashantha
 
PDF
Log4j2
joergreichert
 
JAVA Collections frame work ppt
Ranjith Alappadan
 
React JS part 1
Diluka Wittahachchige
 
React native - under the bridge - react week NYC
Chen Feldman
 
Ecommerce Mini Project / Group Project Coding
Hemant Sarthak
 
Test Automation Framework Development Introduction
Ganuka Yashantha
 

Viewers also liked (14)

PPTX
Clean Code - Design Patterns and Best Practices at Silicon Valley Code Camp
Theo Jungeblut
 
PPTX
Kata - Java - Tests - JUnit 4
kaftanenko
 
PPTX
SOLID and Clean Code with life project example
vasya_bh
 
PPTX
Clean Code
Bruno Lui
 
PDF
Agile! Welche Rolle spielt das Management
Mischa Ramseyer
 
ODP
Conhecendo Melhor O Linux
Ricardo Pinheiro
 
PPTX
Boas práticas técnica para um código limpo (Clean Code)
Rodrigo Kono
 
PPT
História do linux ppt
shade09
 
PPT
How To Draw A Boy The Easy Way
Irvine Blue
 
PDF
How to make Awesome Diagrams for your slides
otikik
 
PDF
2015 Upload Campaigns Calendar - SlideShare
SlideShare
 
PPTX
What to Upload to SlideShare
SlideShare
 
PDF
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
 
PDF
Getting Started With SlideShare
SlideShare
 
Clean Code - Design Patterns and Best Practices at Silicon Valley Code Camp
Theo Jungeblut
 
Kata - Java - Tests - JUnit 4
kaftanenko
 
SOLID and Clean Code with life project example
vasya_bh
 
Clean Code
Bruno Lui
 
Agile! Welche Rolle spielt das Management
Mischa Ramseyer
 
Conhecendo Melhor O Linux
Ricardo Pinheiro
 
Boas práticas técnica para um código limpo (Clean Code)
Rodrigo Kono
 
História do linux ppt
shade09
 
How To Draw A Boy The Easy Way
Irvine Blue
 
How to make Awesome Diagrams for your slides
otikik
 
2015 Upload Campaigns Calendar - SlideShare
SlideShare
 
What to Upload to SlideShare
SlideShare
 
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
 
Getting Started With SlideShare
SlideShare
 
Ad

Similar to Clean code & design patterns (20)

PDF
Clean code and code smells
Md. Aftab Uddin Kajal
 
PDF
Clean Code V2
Jean Carlo Machado
 
PPTX
Clean code - DSC DYPCOE
Patil Shreyas
 
PPTX
Principled And Clean Coding
Metin Ogurlu
 
PDF
Clean code
Khou Suylong
 
PDF
Agileee Developers Toolkit In The Agile World
Agileee
 
PPTX
CLEAN CODING AND DEVOPS Final.pptx
JEEVANANTHAMG6
 
PPTX
Clean code presentation
Bhavin Gandhi
 
PDF
Clean Code
Chris Farrell
 
PPTX
Clean code
Mahmoud Zizo
 
PDF
Writing Readable Code
eddiehaber
 
PDF
Does your code spark joy? Refactoring techniques to make your life easier.
Juciellen Cabrera
 
PPTX
Clean code, Feb 2012
cobyst
 
PDF
UNIT I cloud computing ppt cloud ccd all about the cloud computing
vishnubala78900
 
PPT
Clean Code summary
Jan de Vries
 
PPT
Writing Quality Code
indikaMaligaspe
 
PPSX
Clean code
AgniGonalves
 
PDF
Solid OO & Clean Coding is essential to successful Agile development
Simon Gould
 
PPTX
Clean Code
swaraj Patil
 
PDF
AN EXERCISE IN CLEANER CODE - FROM LEGACY TO MAINTAINABLE
Gavin Pickin
 
Clean code and code smells
Md. Aftab Uddin Kajal
 
Clean Code V2
Jean Carlo Machado
 
Clean code - DSC DYPCOE
Patil Shreyas
 
Principled And Clean Coding
Metin Ogurlu
 
Clean code
Khou Suylong
 
Agileee Developers Toolkit In The Agile World
Agileee
 
CLEAN CODING AND DEVOPS Final.pptx
JEEVANANTHAMG6
 
Clean code presentation
Bhavin Gandhi
 
Clean Code
Chris Farrell
 
Clean code
Mahmoud Zizo
 
Writing Readable Code
eddiehaber
 
Does your code spark joy? Refactoring techniques to make your life easier.
Juciellen Cabrera
 
Clean code, Feb 2012
cobyst
 
UNIT I cloud computing ppt cloud ccd all about the cloud computing
vishnubala78900
 
Clean Code summary
Jan de Vries
 
Writing Quality Code
indikaMaligaspe
 
Clean code
AgniGonalves
 
Solid OO & Clean Coding is essential to successful Agile development
Simon Gould
 
Clean Code
swaraj Patil
 
AN EXERCISE IN CLEANER CODE - FROM LEGACY TO MAINTAINABLE
Gavin Pickin
 
Ad

Recently uploaded (20)

PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 

Clean code & design patterns

  • 2. Pascal Larocque ● TrustCharge Team ● Behat guy ● Testing guy ● SOLID guy ● Pattern guy ● Father of 3 ● Star Wars Geek @pascallarocque
  • 3. Bad Code ● Singletons ● Tight Coupling ● Untestable ● Premature Optimization ● Indescriptive name ● Duplication
  • 4. Cost of Bad Code ● Very hard / Impossible to estimate ● Slows down team velocity ● High Learning curve ● Brings down team moral ● Increases cost of development
  • 5. The Primal Conundrum Programmers face a conundrum of basic values. All developers with more than a few years experience know that previous messes slow them down. And yet all developers feel the pressure to make messes in order to meet deadlines. In short, they don’t take the time to go fast!
  • 6. True professionals know that the second part of the conundrum is wrong. You will not make the deadline by making the mess. Indeed, the mess will slow you down instantly, and will force you to miss the deadline. The only way to make the deadline—the only way to go fast—is to keep the code as clean as possible at all times.
  • 7. How do I write Clean Code?
  • 8. What is Clean Code? “Clean code can be read, and enhanced by a developer other than its original author. It has unit and acceptance tests. It has meaningful names. It provides one way rather than many ways for doing one thing. It has minimal dependencies, which are explicitly defined, and provides a clear and minimal API. Code should be literate since depending on the language, not all necessary information can be expressed clearly in code alone.” - Dave Thomas “Clean code is simple and direct. Clean code reads like well-written prose. Clean code never obscures the designer’s intent but rather is full of crisp abstractions and straightforward lines of control.” - Grady Booch “I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well.” - Bjarne Stroustrup You know you are working on clean code when each routine you read turns out to be pretty much what you expected. You can call it beautiful code when the code also makes it look like the language was made for the problem. - Ward Cunningham
  • 10. The Boy Scout Rule “Leave the campground cleaner than you found it” Code Rots and Degrades as time passes The Code has to be kept clean over time. We must take an active role in preventing the degradation.
  • 11. Naming ● Use intention revealing names ○ Why it exists ○ What it does ○ How it’s used ● Classes should have nouns or noun phrases ○ Don’t use Manager, Processor, Data or Info ● Methods should have verbs or verb phrases ● Accessor, Mutators or predicates should have get, set or is ● Use solution domain name ○ Factory, Visitor, Queue
  • 12. Functions ● Small ● Smaller than that!!! ● Does ONE THING ● Does ONLY ONE THING ● Blocks and Indentation ○ IF, While, For ● One level of abstraction per function ○ getHTML() ○ $parsed = Parser::render($url) ○ $xml->append($node)
  • 13. Functions ● Reads like a Top Down Narrative ○ To render the page we get all the content ○ To get all the content we extract it from the DB ○ To extract it from the DB we need to connect
  • 14. Function Arguments The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification—and then shouldn’t be used anyway.
  • 15. Function Arguments - Flags Flag Arguments should be avoided. It does 1 thing if true and another thing when it’s false. render(true): renderForScreen() renderForTest()
  • 16. Function Argument - Objects It’s easier to pass Objects instead of a long argument list or array Rectangle makeRectangle(Double x1, Double y1, Double x2, Double y2) Rectangle makeRectangle(Point point1, Point point2)
  • 17. checkPassword(username, password) { user = $this->dataAccessor->findByUsername (username) valid= md5($user->getPassword()) === password if(valid) { Session.init(user) } else { Session.clear() } return valid } Have no side effect Sides effects are lies. BAD
  • 18. Enforce Temporal Coupling class ACL { function login(username, password) { this->user = this->findUser(username, password) this->getPermissions() this->startACLSession() } } BAD class ACL { function login(username, password) { this->user = this->findUser(username, password) this->permissions = this->getPermissions($this->user) this->startACLSession(this->permissions) } } BETTER
  • 19. if ($this->_sortBySet() === true) { ... } else if ($this->_sortByActor() === true) { ... } else if ($this->_sortByClip() === true) { ... } else { … } Make Conditions clear if (true === $bySetId && (true === empty($photoCollection) || true === empty($photoSet))) { ... } else if (true === $byActorId && (true === empty($photoCollection) || true === empty($actor))) { ... } else if (true === $byClipId && (true === empty($photoCollection) || true === empty($scene))) { ... } else { … } BAD BETTER
  • 20. sortingAlgorithmInterface = phosetSortingFactory->findSorter(sortBy) sorted list = sortingAlgorithmInterface ->sort(photosetList) Replace Conditions with Factory if ($this->_sortBySet() === true) { ... } else if ($this->_sortByActor() === true { ... } else if ($this->_sortByClip() === true) { ... } else { … } POLYMORPHISM GOODNESS
  • 22. Encapsulate Change Class UserRepository { function findById(id) { return Doctrine::getTable('Users')->createQuery(‘u’) ->where(‘u.id = ?’, id) ->fetchOne(); } } ORM MY GOD Class UserRepository { function findById(id) { userData = this->dataAccessor->findById(id) user = userFactory->create(userData) return user } } The only constant is Change.
  • 24. The Law of Demeter method f of a class C should only call the methods of these: ● C ● An object created by f ● An object passed as an argument to f ● An object held in an instance variable of C
  • 25. Class ACL { protected user function hasAccessToAdmin() { return this->user ->isAdmin() } } The Law of Demeter Class ACL { function hasAccessToAdmin() { return getUserManager() ->getUser(123) ->getProfile() ->isAdmin() } } BAD Class ACL { protected user protected aclVisitor function setVisitor(visitor) { … } function hasAccessToAdmin() { return this->aclVisitor ->isAdmin(this->user-getProfile()) } } Class AclVisitor { function isAdmin(profile) { return profile->isadmin() } } MEH PATTERNS!!!
  • 27. Don’t pass NULL, Don’t return NULL Throw an exception Return a NullObject findUser(ID) { user = this->dataAccessor->findById(ID) if(user == null) { user = new NullUser(); } return user } Class NullUser { function getName { return ‘’ //DO NOTHING } }
  • 31. Singleton Pattern "Singletons are the path of the dark side. Singletons lead to implicit dependencies. Implicit dependencies lead to global state. Global state leads to suffering."
  • 32. As events arrive from the outside world at a port, a technology-specific adapter converts it into a usable procedure call or message and passes it to the application. CreditCardService Hexagonal Architecture CreditCardService HTTP REST PHPUnit SOCKET ADAPTER
  • 33. When the application has something to send out, it sends it out through a port to an adapter, which creates the appropriate signals needed by the receiving technology (human or automated). CreditCardService Hexagonal Architecture CreditCardService HTML XML PHPUnit JSONP ADAPTER
  • 34. Class CreditCardService __construct(InputInterface, OutputInterface) { this->input = InputInterface this->output = OutputInterface } function process() { input = this->input->getInput() output = this->doProcessing(input) return this->ouput ->sendOutput(output) } } CreditCardService Hexagonal Architecture CreditCardService class CreditCardHTTPInputAdapter implements InputInterface{ function getInput() {..} } class CreditCardJSONPOutputAdapter implements OutputInterface{ function sendOutput(output) {..} }
  • 35. More stuff Command Query Separation Functions should either do something or answer something, but not both. DRY Don’t repeat yourself. Duplication may be the root of all evil in software. SOLID Single Responsibility, Open/Closed Principle, Liskov substitution principle, Interface segregation, Dependency Inversion Structured Programming Every function and every block has one Entry and one Exit Use Exceptions and Error Handling Functions should do one thing. Error handling is one thing. Thus, a function that handles errors should do nothing else.
  • 36. SHARE KNOWLEDGE KNOWLEDGE DECAYS FAST SLOW DOWN TO GO FAST NEVER ASK PERMISSION TO DO YOUR JOB CORRECTLY