SlideShare a Scribd company logo
1 of 74
Download to read offline
@lukaszchrusciel
Is
Is SOLID
SOLID
dead?
dead?
Let's discuss reusable
Let's discuss reusable
software design
software design
@lukaszchrusciel
@lukaszchrusciel
Context
Context is a King
is a King
@lukaszchrusciel
Story
Story
@lukaszchrusciel
S
Single
ingle
Responsibility
Responsibility
Principle
Principle
@lukaszchrusciel
public function __invoke(string $orderNumber, int $unitId, int $amount,
RefundTypeInterface $refundType): void
{
/** @var OrderInterface|null $order */
$order = $this->orderRepository->findOneByNumber($orderNumber);
Assert::notNull($order);
$remainingTotal = $this->remainingTotalProvider->getTotalLeftToRefund($unitId,
$refundType);
if ($remainingTotal === 0) {
throw UnitAlreadyRefunded::withIdAndOrderNumber($unitId, $orderNumber);
}
$refund = $this->refundFactory->createWithData($order, $unitId, $amount,
$refundType);
$this->refundManager->persist($refund);
$this->refundManager->flush();
}
@lukaszchrusciel
Types of classes
Types of classes
@lukaszchrusciel
Types of classes
Types of classes
Data structures
Data structures
@lukaszchrusciel
Data structures
Data structures
ValueObjects
–
@lukaszchrusciel
Data structures
Data structures
ValueObjects
–
DataTransferObjects
–
@lukaszchrusciel
Data structures
Data structures
ValueObjects
–
DataTransferObjects
–
Models
–
@lukaszchrusciel
Data structures
Data structures
ValueObjects
–
DataTransferObjects
–
Models
–
Entities
–
@lukaszchrusciel
Data structures
Data structures
readonly class BlameCart
{
public function __construct(
public string $shopUserEmail,
public string $orderTokenValue
) {
}
}
@lukaszchrusciel
Types of classes
Types of classes
Data structures
Data structures
Calculations
Calculations
@lukaszchrusciel
Calculations
Calculations
F(X) →
F(X) → Y
Y
@lukaszchrusciel
Calculations (pure functions)
Calculations (pure functions)
final class PerUnitRateCalculator implements CalculatorInterface
{
public function calculate(ShipmentInterface $subject, array
$configuration): int
{
return (int) ($configuration['amount'] * $subject-
>getShippingUnitCount());
}
public function getType(): string
{
return 'per_unit_rate';
}
}
@lukaszchrusciel
Calculations (impure functions)
Calculations (impure functions)
final class PromotionApplicator implements PromotionApplicatorInterface
{
public function __construct(private ServiceRegistryInterface $registry)
{
}
public function apply(PromotionSubjectInterface $subject, PromotionInterface $promotion): void
{
$applyPromotion = false;
foreach ($promotion->getActions() as $action) {
$result = $this->registry->get($action->getType())->execute($subject, $action-
>getConfiguration(), $promotion);
$applyPromotion = $applyPromotion || $result;
}
if ($applyPromotion) {
$subject->addPromotion($promotion);
}
}
}
@lukaszchrusciel
Calculations (impure functions)
Calculations (impure functions)
final class PromotionApplicator implements PromotionApplicatorInterface
{
public function __construct(private ServiceRegistryInterface $registry)
{
}
public function apply(PromotionSubjectInterface $subject, PromotionInterface $promotion): void
{
$applyPromotion = false;
foreach ($promotion->getActions() as $action) {
$result = $this->registry->get($action->getType())->execute($subject, $action-
>getConfiguration(), $promotion);
$applyPromotion = $applyPromotion || $result;
}
if ($applyPromotion) {
$subject->addPromotion($promotion);
}
}
}
@lukaszchrusciel
Types of classes
Types of classes
Data structures
Data structures
Calculations
Calculations
Side effects
Side effects
@lukaszchrusciel
Communication outside of the local
Communication outside of the local
scope
scope
Mailing
–
@lukaszchrusciel
Communication outside of the local
Communication outside of the local
scope
scope
Mailing
–
Transaction committing
–
@lukaszchrusciel
Communication outside of the local
Communication outside of the local
scope
scope
Mailing
–
Transaction committing
–
Making request
–
@lukaszchrusciel
public function __invoke(string $orderNumber, int $unitId, int $amount,
RefundTypeInterface $refundType): void
{
/** @var OrderInterface|null $order */
$order = $this->orderRepository->findOneByNumber($orderNumber);
Assert::notNull($order);
$remainingTotal = $this->remainingTotalProvider->getTotalLeftToRefund($unitId,
$refundType);
if ($remainingTotal === 0) {
throw UnitAlreadyRefunded::withIdAndOrderNumber($unitId, $orderNumber);
}
$refund = $this->refundFactory->createWithData($order, $unitId, $amount,
$refundType);
$this->refundManager->persist($refund);
$this->refundManager->flush();
}
@lukaszchrusciel
Communication outside of the local scope
Communication outside of the local scope
public function __invoke(string $orderNumber, int $unitId, int $amount, RefundTypeInterface
$refundType): void
{
$order = $this->orderRepository->findOneByNumber($orderNumber);
$remainingTotal = $this->remainingTotalProvider->getTotalLeftToRefund($unitId, $refundType);
if ($remainingTotal === 0) {
throw UnitAlreadyRefunded::withIdAndOrderNumber($unitId, $orderNumber);
}
$refund = $this->refundFactory->createWithData(
$order,
$unitId,
$amount,
$refundType
);
$this->refundManager->persist($refund);
$this->refundManager->flush();
}
@lukaszchrusciel
Communication outside of the local scope
Communication outside of the local scope
public function __invoke(string $orderNumber, int $unitId, int $amount, RefundTypeInterface
$refundType): void
{
$order = $this->orderRepository->findOneByNumber($orderNumber);
$remainingTotal = $this->remainingTotalProvider->getTotalLeftToRefund($unitId, $refundType);
if ($remainingTotal === 0) {
throw UnitAlreadyRefunded::withIdAndOrderNumber($unitId, $orderNumber);
}
$refund = $this->refundFactory->createWithData(
$order,
$unitId,
$amount,
$refundType
);
return $refund;
}
@lukaszchrusciel
@lukaszchrusciel
O
Open-Close
pen-Close
Principle
Principle
@lukaszchrusciel
private function getRefundUnitTotal(
int $id,
RefundTypeInterface $refundType
): int
@lukaszchrusciel
private function getRefundUnitTotal(int $id,
RefundTypeInterface $refundType): int
{
if ($refundType->getValue() ===
RefundTypeInterface::ORDER_ITEM_UNIT) {
// calculation
return $value;
}
// calculation
return $otherValue;
}
@lukaszchrusciel
private function getRefundUnitTotal(int
$id, RefundTypeInterface $refundType): int
{
$refundUnitTotalProvider = $this-
>totalProviderRegistry->get($refundType-
>getValue());
return $refundUnitTotalProvider-
>getRefundUnitTotal($id);
}
@lukaszchrusciel
protected function configureOptionsNode(ArrayNodeDefinition
$optionsNode): void
{
$optionsNode
->children()
->integerNode('amount')->isRequired()->min(0)->end()
->scalarNode('channel')->cannotBeEmpty()->end()
->scalarNode('customer')->cannotBeEmpty()->end()
->scalarNode('country')->cannotBeEmpty()->end()
->booleanNode('fulfilled')->defaultValue(false)-
>end()
->end()
;
}
@lukaszchrusciel
@lukaszchrusciel
@lukaszchrusciel
@lukaszchrusciel
protected function configureOptionsNode(ArrayNodeDefinition
$optionsNode): void
{
$optionsNode
->children()
->integerNode('amount')->isRequired()->min(0)->end()
->scalarNode('channel')->cannotBeEmpty()->end()
->scalarNode('customer')->cannotBeEmpty()->end()
->scalarNode('country')->cannotBeEmpty()->end()
->booleanNode('fulfilled')->defaultValue(false)-
>end()
->end()
;
}
@lukaszchrusciel
L
Liskov
iskov
Substitution
Substitution
Principle
Principle
@lukaszchrusciel
Behavioural
Behavioural
sub-typing
sub-typing
@lukaszchrusciel
Covariance
Covariance
abstract class Animal
{
}
class Cat extends Animal
{
}
interface AnimalShelter
{
public function adopt(): Animal;
}
class CatShelter implements AnimalShelter
{
public function adopt(): Cat // instead of returning class type Animal, it can return class type Cat
{
return new Cat();
}
}
@lukaszchrusciel
abstract class Animal
{
}
class Cat extends Animal
{
}
interface CatShelter
{
public function adopt(Cat $cat);
}
class AnimalShelter implements CatShelter
{
public function adopt(Animal $animal) // instead of accepting class type Cat, it can
accept any Animal
{
return new Cat();
}
}
@lukaszchrusciel
abstract class Animal
{
}
class Cat extends Animal
{
}
interface CatShelter
{
public function adopt(Animal $cat);
}
class AnimalShelter implements CatShelter
{
public function adopt(Cat $animal) // instead of accepting class type Cat, it can accept any Animal
{
return new Cat();
}
}
Fatal error: Declaration of AnimalShelter::adopt(Cat $animal) must be compatible with
CatShelter::adopt(Animal $cat) in /tmp/preview on line 19
@lukaszchrusciel
interface CalculatorInterface
{
public function
calculate(ShipmentInterface $subject,
array $configuration): int;
public function getType(): string;
}
@lukaszchrusciel
final class PerUnitRateCalculator implements CalculatorInterface
{
public function calculate(ShipmentInterface $subject, array
$configuration): int
{
return (int) ($configuration['amount'] * $subject-
>getShippingUnitCount());
}
public function getType(): string
{
return 'per_unit_rate';
}
}
@lukaszchrusciel
{
/**
* @param array{'amount': int}
$configuration
*/
public function calculate(ShipmentInterface
$subject, array $configuration): int;
public function getType(): string;
}
@lukaszchrusciel
interface CalculatorInterface
{
/**
* @throws
InvalidCalculatorConfigurationException
*/
public function calculate(ShipmentInterface
$subject, array $configuration): int;
public function getType(): string;
}
@lukaszchrusciel
public function configureOptions(OptionsResolver $resolver)
{
parent::configureOptions($resolver);
// some logic
$resolver->setDefined([
'data',
]);
$resolver->setDefaults([
'data_class' => $dataClass,
'empty_data' => $emptyData,
'...' =>
]);
@lukaszchrusciel
interface CalculatorInterface
{
/**
* @throws
InvalidCalculatorConfigurationException
*/
public function calculate(Configuration
$configuration): int;
public function getType(): string;
}
@lukaszchrusciel
$resources = $this->resourcesResolver-
>getResources($requestConfiguration, $repository);
$paginationLimits = [];
if ($resources instanceof ResourceGridView) {
$paginator = $resources->getData();
$paginationLimits = $resources-
>getDefinition()->getLimits();
} else {
$paginator = $resources;
}
@lukaszchrusciel
I
Interface
nterface
Segregation
Segregation
Principle
Principle
@lukaszchrusciel
interface OrderRepositoryInterface extends BaseOrderRepositoryInterface
{
public function createListQueryBuilder(): QueryBuilder;
public function createSearchListQueryBuilder(): QueryBuilder;
public function createByCustomerIdQueryBuilder($customerId): QueryBuilder;
public function createByCustomerAndChannelIdQueryBuilder($customerId, $channelId): QueryBuilder;
public function countByCustomerAndCoupon(CustomerInterface $customer, PromotionCouponInterface $coupon): int;
public function countByCustomer(CustomerInterface $customer): int;
public function findOrderById($id): ?OrderInterface;
public function findByCustomer(CustomerInterface $customer): array;
public function findForCustomerStatistics(CustomerInterface $customer): array;
public function findOneForPayment($id): ?OrderInterface;
public function findOneByNumberAndCustomer(string $number, CustomerInterface $customer): ?OrderInterface;
public function findCartByChannel($id, ChannelInterface $channel): ?OrderInterface;
public function findLatestCartByChannelAndCustomer(ChannelInterface $channel, CustomerInterface $customer): ?OrderInterface;
public function findLatestNotEmptyCartByChannelAndCustomer(ChannelInterface $channel, CustomerInterface $customer): ?OrderInterface;
public function getTotalSalesForChannel(ChannelInterface $channel): int;
public function getTotalPaidSalesForChannel(ChannelInterface $channel): int;
public function getTotalPaidSalesForChannelInPeriod(ChannelInterface $channel, DateTimeInterface $startDate, DateTimeInterface $endDate): int;
public function countFulfilledByChannel(ChannelInterface $channel): int;
public function countPaidByChannel(ChannelInterface $channel): int;
public function countPaidForChannelInPeriod(ChannelInterface $channel, DateTimeInterface $startDate, DateTimeInterface $endDate): int;
public function findLatestInChannel(int $count, ChannelInterface $channel): array;
public function findOrdersUnpaidSince(DateTimeInterface $terminalDate, ?int $limit = null): array;
public function findCartForSummary($id): ?OrderInterface;
public function findCartForAddressing($id): ?OrderInterface;
public function findCartForSelectingShipping($id): ?OrderInterface;
public function findCartForSelectingPayment($id): ?OrderInterface;
public function findCartByTokenValue(string $tokenValue): ?BaseOrderInterface;
public function findCartByTokenValueAndChannel(string $tokenValue, ChannelInterface $channel): ?BaseOrderInterface;
}
@lukaszchrusciel
OrderRepositoryInterface extends
BaseOrderRepositoryInterface
@lukaszchrusciel
D
Dependency
ependency
Inversion
Inversion
Principle
Principle
@lukaszchrusciel
public function __invoke(VerifyCustomerAccount $command): JsonResponse
{
/** @var UserInterface|null $user */
$user = $this->shopUserRepository->findOneBy(['emailVerificationToken' =>
$command->token]);
if (null === $user) {
throw new InvalidArgumentException(
sprintf('There is no shop user with %s email verification token',
$command->token),
);
}
$user->setVerifiedAt(new DateTime());
$user->setEmailVerificationToken(null);
$user->enable();
return new JsonResponse([]);
}
@lukaszchrusciel
public function __construct(
private RepositoryInterface $shopUserRepository,
private DateTimeProviderInterface $calendar,
) {
}
public function __invoke(VerifyCustomerAccount $command): JsonResponse
{
/** @var UserInterface|null $user */
$user = $this->shopUserRepository->findOneBy(['emailVerificationToken' => $command->token]);
if (null === $user) {
throw new InvalidArgumentException(
sprintf('There is no shop user with %s email verification token', $command->token),
);
}
$user->setVerifiedAt($this->calendar->now());
$user->setEmailVerificationToken(null);
$user->enable();
return new JsonResponse([]);
}
@lukaszchrusciel
Sylius/Calendar
–
PSR-20 Clock interface +
Symfony/Clock
–
@lukaszchrusciel
@lukaszchrusciel
@lukaszchrusciel
@lukaszchrusciel
FINAL
FINAL
@lukaszchrusciel
What the horse is, everyone can see
1
ks. Benedykta Chmielowskiego
1.
@lukaszchrusciel
What the address is, everyone can
see 1
Łukasz Chruściel
1.
@lukaszchrusciel
Łukasz Chruściel
Wólczańska 125
90-521 Łódź
Poland
@lukaszchrusciel
Name Surename
Street StreetNumber (?Flat)
PostCode City
Country
@lukaszchrusciel
Antigua and Barbuda
–
Aruba
–
Ascension island
–
Bahamas
–
Belize
–
Benin
–
Botswana
–
Bolivia
–
Bonaire, Sint Eustatius and Saba
–
Burkina Faso
–
Burundi
–
Cameroon
–
Central African Republic
–
Comoros
–
Congo
–
Congo the Democratic Republic of the
–
Cook Islands
–
Cote d’Ivoire
–
Curaçao
–
Djibouti
–
Dominica
–
East Timor
–
Equatorial Guinea
–
Eritrea
–
Fiji
–
French Southern Territories
–
Gambia
–
Gamon
–
Ghana
–
Grenada
–
Guyana
–
Heard and McDonald Islands
–
Hong Kong
–
Kiribati
–
Libya
–
Macau
–
Malawi
–
Mali
–
Mauritania
–
Nauru
–
Netherlands Antilles
–
Niue
–
North Korea
–
Qatar
–
Rwanda
–
Saint Kitts and Nevis
–
Sao Tome and Principe
–
Seychelles
–
Sierra Leone
–
Solomon Islands
–
Suriname
–
Syria
–
Timor-Leste
–
Togo
–
Tokelau
–
Tonga
–
Tuvalu
–
Uganda
–
United Arab Emirates
–
Vanuatu
–
Yemen
–
Zimbabwe
–
@lukaszchrusciel
Antigua and Barbuda
–
Aruba
–
Ascension island
–
Bahamas
–
Belize
–
Benin
–
Botswana
–
Bolivia
–
Bonaire, Sint Eustatius and Saba
–
Burkina Faso
–
Burundi
–
Cameroon
–
Central African Republic
–
Comoros
–
Congo
–
Congo the Democratic Republic of the
–
Cook Islands
–
Cote d’Ivoire
–
Curaçao
–
Djibouti
–
Dominica
–
East Timor
–
Equatorial Guinea
–
Eritrea
–
Fiji
–
French Southern Territories
–
Gambia
–
Gamon
–
Ghana
–
Grenada
–
Guyana
–
Heard and McDonald Islands
–
Hong Kong
Hong Kong
–
Kiribati
–
Libya
–
Macau
Macau
–
Malawi
–
Mali
–
Mauritania
–
Nauru
–
Netherlands Antilles
–
Niue
–
North Korea
–
Qatar
Qatar
–
Rwanda
–
Saint Kitts and Nevis
–
Sao Tome and Principe
–
Seychelles
–
Sierra Leone
–
Solomon Islands
–
Suriname
–
Syria
–
Timor-Leste
–
Togo
–
Tokelau
–
Tonga
–
Tuvalu
–
Uganda
–
United Arab Emirates
United Arab Emirates
–
Vanuatu
–
Yemen
–
Zimbabwe
–
@lukaszchrusciel
Name Surename
Street StreetNumber (?Flat)
PostCode City
Country
@lukaszchrusciel
Outro
Outro
@lukaszchrusciel
SOLID works perfectly
SOLID works perfectly in
in
the context of reusable
the context of reusable
software
software
@lukaszchrusciel
SOLID gives useful
SOLID gives useful
directions how to design
directions how to design
any code
any code
@lukaszchrusciel
Benefits of these
Benefits of these
approaches
approaches
@lukaszchrusciel
Is there anything
Is there anything
more in
more in CUPID
CUPID?
?
@lukaszchrusciel
Resources
Resources
https://symfonycasts.com/screencast/solid/
https://symfonycasts.com/screencast/solid/
https://stackoverflow.blog/2021/11/01/why-solid-principles-are-still-the-foundation-for-modern-
software-architecture/
–
https://dannorth.net/2022/02/10/cupid-for-joyful-coding/
–
https://speakerdeck.com/tastapod/why-every-element-of-solid-is-wrong
–
https://www.reddit.com/r/programming/comments/5qto27/why_every_element_of_solid_is_wrong/
–
https://solid-is-not-solid.com/
–
Norbert Wójtowicz (@pithyless) - Functional Programming
–
https://www.youtube.com/watch?v=-Z-17h3jG0A
–
@lukaszchrusciel
Takeaways
Takeaways If you see clickbait title with
If you see clickbait title with
question in it
question in it
Then the answer is always no
no
Functional programming may
Functional programming may
help us
help us
Deliver better ObjectOriented code
SOLID is a solid fundament for
SOLID is a solid fundament for
packages that will be reused by
packages that will be reused by
other devs
other devs
But end applications may benefit from it as well
Doing eCommerce? Give a
Doing eCommerce? Give a
Sylius try ;)
Sylius try ;)
Don't be discouraged by this presentation
@lukaszchrusciel
@lukaszchrusciel
Thank you!
Thank you!

More Related Content

What's hot

Course 102: Lecture 6: Seeking Help
Course 102: Lecture 6: Seeking HelpCourse 102: Lecture 6: Seeking Help
Course 102: Lecture 6: Seeking HelpAhmed El-Arabawy
 
Solaris Linux Performance, Tools and Tuning
Solaris Linux Performance, Tools and TuningSolaris Linux Performance, Tools and Tuning
Solaris Linux Performance, Tools and TuningAdrian Cockcroft
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBRavi Teja
 
Xfs file system for linux
Xfs file system for linuxXfs file system for linux
Xfs file system for linuxAjay Sood
 
Practical Problem Solving with Apache Hadoop & Pig
Practical Problem Solving with Apache Hadoop & PigPractical Problem Solving with Apache Hadoop & Pig
Practical Problem Solving with Apache Hadoop & PigMilind Bhandarkar
 
OODM-object oriented data model
OODM-object oriented data modelOODM-object oriented data model
OODM-object oriented data modelAnilPokhrel7
 
Clean code: understanding Boundaries and Unit Tests
Clean code: understanding Boundaries and Unit TestsClean code: understanding Boundaries and Unit Tests
Clean code: understanding Boundaries and Unit Testsradin reth
 
Course 102: Lecture 3: Basic Concepts And Commands
Course 102: Lecture 3: Basic Concepts And Commands Course 102: Lecture 3: Basic Concepts And Commands
Course 102: Lecture 3: Basic Concepts And Commands Ahmed El-Arabawy
 
Hunt for Domain Controller : Active Directory Pentesting Session
Hunt for Domain Controller : ActiveDirectory Pentesting SessionHunt for Domain Controller : ActiveDirectory Pentesting Session
Hunt for Domain Controller : Active Directory Pentesting Sessionhacknpentest
 
Object oreinted php | OOPs
Object oreinted php | OOPsObject oreinted php | OOPs
Object oreinted php | OOPsRavi Bhadauria
 
Presentation of DBMS (database management system) part 1
Presentation of DBMS (database management system) part 1Presentation of DBMS (database management system) part 1
Presentation of DBMS (database management system) part 1Junaid Nadeem
 
Data Storage In Android
Data Storage In Android Data Storage In Android
Data Storage In Android Aakash Ugale
 

What's hot (20)

Course 102: Lecture 6: Seeking Help
Course 102: Lecture 6: Seeking HelpCourse 102: Lecture 6: Seeking Help
Course 102: Lecture 6: Seeking Help
 
In-Memory DataBase
In-Memory DataBaseIn-Memory DataBase
In-Memory DataBase
 
Solaris Linux Performance, Tools and Tuning
Solaris Linux Performance, Tools and TuningSolaris Linux Performance, Tools and Tuning
Solaris Linux Performance, Tools and Tuning
 
BIGDATA ANALYTICS LAB MANUAL final.pdf
BIGDATA  ANALYTICS LAB MANUAL final.pdfBIGDATA  ANALYTICS LAB MANUAL final.pdf
BIGDATA ANALYTICS LAB MANUAL final.pdf
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Xfs file system for linux
Xfs file system for linuxXfs file system for linux
Xfs file system for linux
 
Dbms presentaion
Dbms presentaionDbms presentaion
Dbms presentaion
 
Practical Problem Solving with Apache Hadoop & Pig
Practical Problem Solving with Apache Hadoop & PigPractical Problem Solving with Apache Hadoop & Pig
Practical Problem Solving with Apache Hadoop & Pig
 
OODM-object oriented data model
OODM-object oriented data modelOODM-object oriented data model
OODM-object oriented data model
 
Clean code: understanding Boundaries and Unit Tests
Clean code: understanding Boundaries and Unit TestsClean code: understanding Boundaries and Unit Tests
Clean code: understanding Boundaries and Unit Tests
 
Net framework
Net frameworkNet framework
Net framework
 
Course 102: Lecture 3: Basic Concepts And Commands
Course 102: Lecture 3: Basic Concepts And Commands Course 102: Lecture 3: Basic Concepts And Commands
Course 102: Lecture 3: Basic Concepts And Commands
 
Introduction to NoSQL
Introduction to NoSQLIntroduction to NoSQL
Introduction to NoSQL
 
Database programming
Database programmingDatabase programming
Database programming
 
Hunt for Domain Controller : Active Directory Pentesting Session
Hunt for Domain Controller : ActiveDirectory Pentesting SessionHunt for Domain Controller : ActiveDirectory Pentesting Session
Hunt for Domain Controller : Active Directory Pentesting Session
 
Rdbms
RdbmsRdbms
Rdbms
 
Object oreinted php | OOPs
Object oreinted php | OOPsObject oreinted php | OOPs
Object oreinted php | OOPs
 
Object oriented dbms
Object oriented dbmsObject oriented dbms
Object oriented dbms
 
Presentation of DBMS (database management system) part 1
Presentation of DBMS (database management system) part 1Presentation of DBMS (database management system) part 1
Presentation of DBMS (database management system) part 1
 
Data Storage In Android
Data Storage In Android Data Storage In Android
Data Storage In Android
 

Similar to SymfonyLive Online 2023 - Is SOLID dead? .pdf

You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix itRafael Dohms
 
Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConRafael Dohms
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolveXSolve
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome TownRoss Tuck
 
The Art of Transduction
The Art of TransductionThe Art of Transduction
The Art of TransductionDavid Stockton
 
Oneal perl-code-to-extract-from-voyager
Oneal perl-code-to-extract-from-voyagerOneal perl-code-to-extract-from-voyager
Oneal perl-code-to-extract-from-voyagerENUG
 
Writing Sensible Code
Writing Sensible CodeWriting Sensible Code
Writing Sensible CodeAnis Ahmad
 
Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?Lucas Witold Adamus
 
PHP for Python Developers
PHP for Python DevelopersPHP for Python Developers
PHP for Python DevelopersCarlos Vences
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mockingKonstantin Kudryashov
 
Introduction to DI(C)
Introduction to DI(C)Introduction to DI(C)
Introduction to DI(C)Radek Benkel
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Leonardo Proietti
 
Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Gonzalo Ayuso
 
Command-Oriented Architecture
Command-Oriented ArchitectureCommand-Oriented Architecture
Command-Oriented ArchitectureLuiz Messias
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console componentHugo Hamon
 
Your code sucks, let's fix it - PHP Master Series 2012
Your code sucks, let's fix it - PHP Master Series 2012Your code sucks, let's fix it - PHP Master Series 2012
Your code sucks, let's fix it - PHP Master Series 2012Rafael Dohms
 

Similar to SymfonyLive Online 2023 - Is SOLID dead? .pdf (20)

You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnCon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
The Art of Transduction
The Art of TransductionThe Art of Transduction
The Art of Transduction
 
Oneal perl-code-to-extract-from-voyager
Oneal perl-code-to-extract-from-voyagerOneal perl-code-to-extract-from-voyager
Oneal perl-code-to-extract-from-voyager
 
linieaire regressie
linieaire regressielinieaire regressie
linieaire regressie
 
Writing Sensible Code
Writing Sensible CodeWriting Sensible Code
Writing Sensible Code
 
Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?
 
PHP for Python Developers
PHP for Python DevelopersPHP for Python Developers
PHP for Python Developers
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Introduction to DI(C)
Introduction to DI(C)Introduction to DI(C)
Introduction to DI(C)
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
 
Desymfony2013.gonzalo123
Desymfony2013.gonzalo123Desymfony2013.gonzalo123
Desymfony2013.gonzalo123
 
Command-Oriented Architecture
Command-Oriented ArchitectureCommand-Oriented Architecture
Command-Oriented Architecture
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console component
 
Functional php
Functional phpFunctional php
Functional php
 
Oops in php
Oops in phpOops in php
Oops in php
 
Your code sucks, let's fix it - PHP Master Series 2012
Your code sucks, let's fix it - PHP Master Series 2012Your code sucks, let's fix it - PHP Master Series 2012
Your code sucks, let's fix it - PHP Master Series 2012
 

More from Łukasz Chruściel

Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024  - Need for Speed: Removing speed bumps in API ProjectsConFoo 2024  - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024 - Need for Speed: Removing speed bumps in API ProjectsŁukasz Chruściel
 
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionŁukasz Chruściel
 
SyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfSyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfŁukasz Chruściel
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsŁukasz Chruściel
 
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Łukasz Chruściel
 
4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdfŁukasz Chruściel
 
4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdfŁukasz Chruściel
 
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaBoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaŁukasz Chruściel
 
What we've learned designing new Sylius API
What we've learned designing new Sylius APIWhat we've learned designing new Sylius API
What we've learned designing new Sylius APIŁukasz Chruściel
 
How to optimize background processes.pdf
How to optimize background processes.pdfHow to optimize background processes.pdf
How to optimize background processes.pdfŁukasz Chruściel
 
SymfonyCon - Dilemmas and decisions..pdf
SymfonyCon - Dilemmas and decisions..pdfSymfonyCon - Dilemmas and decisions..pdf
SymfonyCon - Dilemmas and decisions..pdfŁukasz Chruściel
 
How to optimize background processes - when Sylius meets Blackfire
How to optimize background processes - when Sylius meets BlackfireHow to optimize background processes - when Sylius meets Blackfire
How to optimize background processes - when Sylius meets BlackfireŁukasz Chruściel
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsŁukasz Chruściel
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationŁukasz Chruściel
 
Dutch php a short tale about state machine
Dutch php   a short tale about state machineDutch php   a short tale about state machine
Dutch php a short tale about state machineŁukasz Chruściel
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machineŁukasz Chruściel
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machineŁukasz Chruściel
 
BDD in practice based on an open source project
BDD in practice based on an open source projectBDD in practice based on an open source project
BDD in practice based on an open source projectŁukasz Chruściel
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectŁukasz Chruściel
 

More from Łukasz Chruściel (20)

Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024  - Need for Speed: Removing speed bumps in API ProjectsConFoo 2024  - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
 
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
 
SyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfSyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdf
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API Projects
 
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
 
4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf
 
4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf
 
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaBoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
 
What we've learned designing new Sylius API
What we've learned designing new Sylius APIWhat we've learned designing new Sylius API
What we've learned designing new Sylius API
 
How to optimize background processes.pdf
How to optimize background processes.pdfHow to optimize background processes.pdf
How to optimize background processes.pdf
 
SymfonyCon - Dilemmas and decisions..pdf
SymfonyCon - Dilemmas and decisions..pdfSymfonyCon - Dilemmas and decisions..pdf
SymfonyCon - Dilemmas and decisions..pdf
 
How to optimize background processes - when Sylius meets Blackfire
How to optimize background processes - when Sylius meets BlackfireHow to optimize background processes - when Sylius meets Blackfire
How to optimize background processes - when Sylius meets Blackfire
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
 
Dutch php a short tale about state machine
Dutch php   a short tale about state machineDutch php   a short tale about state machine
Dutch php a short tale about state machine
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machine
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machine
 
BDD in practice based on an open source project
BDD in practice based on an open source projectBDD in practice based on an open source project
BDD in practice based on an open source project
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius project
 

Recently uploaded

Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....kzayra69
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 

Recently uploaded (20)

Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 

SymfonyLive Online 2023 - Is SOLID dead? .pdf