SlideShare una empresa de Scribd logo
1 de 77
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

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
 

La actualidad más candente (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 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
 

Similar 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

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
🐬 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
 
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
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
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
 
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
 
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
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
[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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 

Último (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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...
 
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
 
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
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
[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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 

Make it SOLID!