SlideShare uma empresa Scribd logo
1 de 77
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Jquery plugin development
Jquery plugin developmentJquery plugin development
Jquery plugin developmentFaruk Hossen
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan 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 JavascriptDarren 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 DevsRebecca 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 CodeRebecca 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#6Thomas Haessle
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryRebecca Murphey
 
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 atriumnameEmanuele 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 2Aaron 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.jsJxck 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
 

Mais procurados (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
 
えっ、なにそれこわい
えっ、なにそれこわいえっ、なにそれこわい
えっ、なにそれこわい
 

Semelhante a 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żykPROIDEA
 
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 2016Kacper Gunia
 
Demystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHPDemystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHPAlena 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 CodeSWIFTotter Solutions
 
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 ModelAttila Jenei
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony AppsKris 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 DICKonstantin 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 PHPAlena Holligan
 
Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Alena Holligan
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency InjectionRifat Nabi
 
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 CodeNeil 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
 

Semelhante a 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...
 

Último

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 

Último (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Make it SOLID!