SlideShare a Scribd company logo
MMaakkee iitt 
SSOOLLIIDD!! 
LLuuííss OOttáávviioo CCoobbuuccccii OObblloonncczzyykk 
@@llccoobbuuccccii
LLuuííss OOttáávviioo 
CCoobbuuccccii OObblloonncczzyykk 
@@llccoobbuuccccii
PPrriinnccííppiiooss 
ee vvaalloorreess
“Working software is the primary 
measure of progress.” 
PPrriinnccííppiiooss 
ee vvaalloorreess
“Welcome changing requirements, 
even late in development.” 
PPrriinnccííppiiooss 
ee vvaalloorreess
“Continuous attention to technical excellence 
and good design enhances agility.” 
PPrriinnccííppiiooss 
ee vvaalloorreess
NNoossssaass 
rreessppoonnssaabbiilliiddaaddeess??
NNoossssaass 
Traduzir desejos 
rreessppoonnssaabbiilliiddaaddeess??
NNoossssaass 
Traduzir desejos 
Escolher linguagem 
rreessppoonnssaabbiilliiddaaddeess??
Traduzir desejos 
Escolher linguagem Libs/frameworks 
NNoossssaass 
rreessppoonnssaabbiilliiddaaddeess??
Libs/frameworks 
NNoossssaass 
Traduzir desejos 
Escolher linguagem 
Definir arquitetura 
rreessppoonnssaabbiilliiddaaddeess??
Garantir qualidade 
Libs/frameworks 
NNoossssaass 
Traduzir desejos 
Escolher linguagem 
Definir arquitetura 
rreessppoonnssaabbiilliiddaaddeess??
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé??
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
Precisamos criar um 
Usuário com nome e idade
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
class UserCreator 
{ 
public function create($name, $age) { /*... */ } 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
public function __construct() { 
$this->conn = new PDO( 
'mysql:host=127.0.0.1;dbname=awesome', 
'root', 
'ImAGenius' 
); 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
public function create($name, $age) { 
$stm = $this->conn->prepare('...'); 
$stm->execute([$name, $age]); 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
Agora, temos que logar no 
arquivo /tmp/users.log, adicionando 
o responsável pelo cadastro
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
class UserCreator 
{ 
public function create($name, $age, $responsible) { /*... */ } 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
public function __construct() { 
// (…) 
$this->logger = new FileLogger(); 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
public function create($name, $age, $responsible) { 
$stm = $this->conn->prepare('...'); 
$stm->execute([$name, $age]); 
$this->logger->log(/* … */); 
}
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
Meu, num dá pra imprimir 
o último usuário criado?
CCooiissaass qquuee nnuunnccaa 
ooccoorrrreemm...... nnéé?? 
class UserCreator 
{ 
public function create($name, $age, $responsible) { /*... */ } 
public function print() { /* … */ } 
}
RReessuullttaaddoo
RReessuullttaaddoo 
Será que “APENAS 
funcionar” é suficiente?
RReessuullttaaddoo 
((rreeaall))
BBaadd ssmmeellllss
BBaadd ssmmeellllss 
Rigidez
BBaadd ssmmeellllss 
Rigidez 
Fragilidade
BBaadd ssmmeellllss 
Rigidez 
Fragilidade 
Imobilidade
BBaadd ssmmeellllss 
Rigidez 
Fragilidade 
Imobilidade 
Complexidade 
desnecessária
PPrriinncciipplleess ooff OOOODD
PPrriinncciipplleess ooff OOOODD 
Class design
PPrriinncciipplleess ooff OOOODD 
Class design 
Package cohesion
PPrriinncciipplleess ooff OOOODD 
Class design 
Package cohesion 
Package coupling
PPrriinncciipplleess ooff OOOODD 
Class design 
Package cohesion 
Package coupling 
SS..OO..LL..II..DD..
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
SSiinnggllee RReessppoonnssiibbiilliittyy 
One does not simply 
have more than a reason 
to modify a class...
SSiinnggllee RReessppoonnssiibbiilliittyy 
A class should have one, 
and only one, reason 
to change.
SSiinnggllee RReessppoonnssiibbiilliittyy 
class UserRepository 
{}
SSiinnggllee RReessppoonnssiibbiilliittyy 
class UserRepository 
{ 
public function findByAge($age) { /* … */ } 
public function findByName($name) { /* … */ } 
}
SSiinnggllee RReessppoonnssiibbiilliittyy 
class UserRepository 
{ 
public function findByAge($age) { /* … */ } 
public function findByName($name) { /* … */ } 
public function pdfReport() { /* … */ } 
}
SSiinnggllee RReessppoonnssiibbiilliittyy 
class UserRepository 
{ 
public function findByAge($age) { /* … */ } 
public function findByName($name) { /* … */ } 
} 
class UserReport 
{ 
public function generate() { /* … */ } 
}
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
OOppeenn//cclloosseedd 
Should be able to extend 
behaviors, without modifying 
the class
OOppeenn//cclloosseedd 
class Authenticator 
{}
OOppeenn//cclloosseedd 
class Authenticator 
{ 
public function authenticate($login, $passwd) { /* … */ } 
}
OOppeenn//cclloosseedd 
class Authenticator 
{ 
public function authenticate($login, $passwd) { /* … */ } 
private function findUser($login) { /* finds on DB */ } 
private function matchPasswd(User $user, $passwd) { /* … */ } 
}
OOppeenn//cclloosseedd 
class Authenticator 
{ 
public function authenticate($login, $passwd) { /* … */ } 
private function findUser($login) { /* finds on DB */ } 
private function matchPasswd(User $user, $passwd) { /* … */ } 
} 
E se precisarmos buscar 
em outro lugar?
OOppeenn//cclloosseedd 
class Authenticator 
{ 
public function authenticate($login, $passwd) { /* … */ } 
protected function findUser($login) { /* finds on DB */ } 
private function matchPasswd(User $user, $passwd) { /* … */ } 
} 
Assim podemos sobrescrever 
o método de busca...
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
LLiisskkoovv ssuubbssttiittuuttiioonn 
Derived classes must be 
substitutable for their base 
classes
LLiisskkoovv ssuubbssttiittuuttiioonn 
class Rectangle 
{ 
public function setX($x) { /* … */ } 
public function setY($y) { /* … */ } 
public function getArea() { /* … */ } 
}
LLiisskkoovv ssuubbssttiittuuttiioonn 
function getArea($x, $y, Rectangle $object) 
{ 
$object->setX($x); 
$object->setY($y); 
return $object->getArea(); 
} 
getArea(5, 10, new Rectangle());
LLiisskkoovv ssuubbssttiittuuttiioonn 
class Square extends Rectangle 
{ 
public function setX($x) { /* also setY() */ } 
public function setY($y) { /* also setX() */ } 
}
LLiisskkoovv ssuubbssttiittuuttiioonn 
function getArea($x, $y, Rectangle $object) 
{ 
$object->setX($x); 
$object->setY($y); 
return $object->getArea(); 
} 
getArea(5, 10, new Square());
LLiisskkoovv ssuubbssttiittuuttiioonn 
Contravariance of method arguments in subtypes 
Covariance of return types in subtypes
LLiisskkoovv ssuubbssttiittuuttiioonn 
Contravariance of method arguments in subtypes 
Covariance of return types in subtypes 
Preconditions cannot be strengthened in subtypes 
Postconditions cannot be weakened in subtypes
LLiisskkoovv ssuubbssttiittuuttiioonn 
Contravariance of method arguments in subtypes 
Covariance of return types in subtypes 
Preconditions cannot be strengthened in subtypes 
Postconditions cannot be weakened in subtypes 
No new exceptions! Don't violate history constraint
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
IInntteerrffaaccee sseeggrreeggaattiioonn 
Make fine grained interfaces 
that are client specific
IInntteerrffaaccee sseeggrreeggaattiioonn 
interface UserManager 
{}
IInntteerrffaaccee sseeggrreeggaattiioonn 
interface UserManager 
{ 
public function create($name, $email); 
public function remove($id); 
public function find($id); 
public function findByName($name); 
}
IInntteerrffaaccee sseeggrreeggaattiioonn 
class UserController 
{ 
public function find($id) { /* … */ } 
/** @return UserManager */ 
public function getManager(); 
}
IInntteerrffaaccee sseeggrreeggaattiioonn 
interface UserManager 
{ 
public function create($name, $email); 
public function remove($id); 
} 
interface UserLocator 
{ 
public function find($id); 
public function findByName($name); 
}
SS..OO..LL..II..DD.. pprriinncciipplleess 
Single Responsibility principle 
Open/Closed principle 
Liskov substitution principle 
Interface segregation principle 
Dependency inversion principle
DDeeppeennddeennccyy IInnvveerrssiioonn 
Depend on abstractions, 
not on concretions
DDeeppeennddeennccyy IInnvveerrssiioonn 
public function __construct( 
DatabasePersister $persister, 
FileNotifier $notifier 
) { 
$this->persister = $persister; 
$this->notifier = $notifier; 
}
DDeeppeennddeennccyy IInnvveerrssiioonn 
public function __construct(Persister $persister, Notifier $notifier) 
{ 
$this->persister = $persister; 
$this->notifier = $notifier; 
}
SSOOLLIIDD pprriinncciipplleess
SSOOLLIIDD pprriinncciipplleess 
Classes mais coesas
SSOOLLIIDD pprriinncciipplleess 
Classes mais coesas 
Menos acoplamento
SSOOLLIIDD pprriinncciipplleess 
Classes mais coesas 
Menos acoplamento 
Menos mudanças 
em código estável
SSOOLLIIDD pprriinncciipplleess 
Classes mais coesas 
Menos acoplamento 
Menos mudanças 
em código estável 
Testes mais fáceis
DDúúvviiddaass??
OObbrriiggaaddoo!! 
@@llccoobbuuccccii

More Related Content

What's hot

Jquery plugin development
Jquery plugin developmentJquery plugin development
Jquery plugin development
Faruk Hossen
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
Darren Mothersele
 
A New Baseline for Front-End Devs
A New Baseline for Front-End DevsA New Baseline for Front-End Devs
A New Baseline for Front-End Devs
Rebecca Murphey
 
Using Objects to Organize your jQuery Code
Using Objects to Organize your jQuery CodeUsing Objects to Organize your jQuery Code
Using Objects to Organize your jQuery Code
Rebecca Murphey
 
NodeJS The edge of Reason - Lille fp#6
NodeJS The edge of Reason - Lille fp#6NodeJS The edge of Reason - Lille fp#6
NodeJS The edge of Reason - Lille fp#6
Thomas Haessle
 
ES6 at PayPal
ES6 at PayPalES6 at PayPal
ES6 at PayPal
Jamund Ferguson
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryRebecca Murphey
 
PhoneGap: Local Storage
PhoneGap: Local StoragePhoneGap: Local Storage
PhoneGap: Local Storage
Ivano Malavolta
 
Phpで作るmovable typeプラグイン
Phpで作るmovable typeプラグインPhpで作るmovable typeプラグイン
Phpで作るmovable typeプラグイン
Yuji Takayama
 
Drupal csu-open atriumname
Drupal csu-open atriumnameDrupal csu-open atriumname
Drupal csu-open atriumname
Emanuele Quinto
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Acquia
 
Sins Against Drupal 2
Sins Against Drupal 2Sins Against Drupal 2
Sins Against Drupal 2
Aaron Crosman
 
Delivering a Responsive UI
Delivering a Responsive UIDelivering a Responsive UI
Delivering a Responsive UIRebecca Murphey
 
Real Time App with Node.js
Real Time App with Node.jsReal Time App with Node.js
Real Time App with Node.js
Jxck Jxck
 
Miniproject on Employee Management using Perl/Database.
Miniproject on Employee Management using Perl/Database.Miniproject on Employee Management using Perl/Database.
Miniproject on Employee Management using Perl/Database.
Sanchit Raut
 
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
Guilherme Carreiro
 
えっ、なにそれこわい
えっ、なにそれこわいえっ、なにそれこわい
えっ、なにそれこわい
Kei Shiratsuchi
 

What's hot (20)

Jquery plugin development
Jquery plugin developmentJquery plugin development
Jquery plugin development
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
 
A New Baseline for Front-End Devs
A New Baseline for Front-End DevsA New Baseline for Front-End Devs
A New Baseline for Front-End Devs
 
Using Objects to Organize your jQuery Code
Using Objects to Organize your jQuery CodeUsing Objects to Organize your jQuery Code
Using Objects to Organize your jQuery Code
 
NodeJS The edge of Reason - Lille fp#6
NodeJS The edge of Reason - Lille fp#6NodeJS The edge of Reason - Lille fp#6
NodeJS The edge of Reason - Lille fp#6
 
ES6 at PayPal
ES6 at PayPalES6 at PayPal
ES6 at PayPal
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQuery
 
PhoneGap: Local Storage
PhoneGap: Local StoragePhoneGap: Local Storage
PhoneGap: Local Storage
 
BVJS
BVJSBVJS
BVJS
 
Phpで作るmovable typeプラグイン
Phpで作るmovable typeプラグインPhpで作るmovable typeプラグイン
Phpで作るmovable typeプラグイン
 
Drupal csu-open atriumname
Drupal csu-open atriumnameDrupal csu-open atriumname
Drupal csu-open atriumname
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1
 
Sins Against Drupal 2
Sins Against Drupal 2Sins Against Drupal 2
Sins Against Drupal 2
 
Delivering a Responsive UI
Delivering a Responsive UIDelivering a Responsive UI
Delivering a Responsive UI
 
Real Time App with Node.js
Real Time App with Node.jsReal Time App with Node.js
Real Time App with Node.js
 
Miniproject on Employee Management using Perl/Database.
Miniproject on Employee Management using Perl/Database.Miniproject on Employee Management using Perl/Database.
Miniproject on Employee Management using Perl/Database.
 
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
 
API Design
API DesignAPI Design
API Design
 
えっ、なにそれこわい
えっ、なにそれこわいえっ、なにそれこわい
えっ、なにそれこわい
 

Similar to Make it SOLID!

Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
Krzysztof Menżyk
 
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
PROIDEA
 
Be pragmatic, be SOLID
Be pragmatic, be SOLIDBe pragmatic, be SOLID
Be pragmatic, be SOLID
Krzysztof Menżyk
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
Kacper Gunia
 
Demystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHPDemystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHP
Alena Holligan
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better Code
SWIFTotter Solutions
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
Yoan-Alexander Grigorov
 
The IoC Hydra
The IoC HydraThe IoC Hydra
The IoC Hydra
Kacper Gunia
 
Dependency injection in Drupal 8
Dependency injection in Drupal 8Dependency injection in Drupal 8
Dependency injection in Drupal 8Alexei Gorobets
 
Modularity and Layered Data Model
Modularity and Layered Data ModelModularity and Layered Data Model
Modularity and Layered Data Model
Attila Jenei
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
Kris Wallsmith
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
Demystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHPDemystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHP
Alena Holligan
 
Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016
Alena Holligan
 
Solid principles
Solid principlesSolid principles
Solid principles
Bastian Feder
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
Rifat Nabi
 
What is DDD and how could it help you
What is DDD and how could it help youWhat is DDD and how could it help you
What is DDD and how could it help you
Luis Henrique Mulinari
 
So S.O.L.I.D Fu - Designing Better Code
So S.O.L.I.D Fu - Designing Better CodeSo S.O.L.I.D Fu - Designing Better Code
So S.O.L.I.D Fu - Designing Better Code
Neil Crookes
 
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
James Titcumb
 

Similar to Make it SOLID! (20)

Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
Be pragmatic, be SOLID (at Boiling Frogs, Wrocław)
 
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
 
Be pragmatic, be SOLID
Be pragmatic, be SOLIDBe pragmatic, be SOLID
Be pragmatic, be SOLID
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
 
Demystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHPDemystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHP
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better Code
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
 
The IoC Hydra
The IoC HydraThe IoC Hydra
The IoC Hydra
 
Dependency injection in Drupal 8
Dependency injection in Drupal 8Dependency injection in Drupal 8
Dependency injection in Drupal 8
 
Modularity and Layered Data Model
Modularity and Layered Data ModelModularity and Layered Data Model
Modularity and Layered Data Model
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
Demystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHPDemystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHP
 
Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
What is DDD and how could it help you
What is DDD and how could it help youWhat is DDD and how could it help you
What is DDD and how could it help you
 
OOP in PHP
OOP in PHPOOP in PHP
OOP in PHP
 
So S.O.L.I.D Fu - Designing Better Code
So S.O.L.I.D Fu - Designing Better CodeSo S.O.L.I.D Fu - Designing Better Code
So S.O.L.I.D Fu - Designing Better Code
 
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
 

Recently uploaded

Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 

Recently uploaded (20)

Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 

Make it SOLID!