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

Oracle SQLcl: Formatting your Query Results
Oracle SQLcl: Formatting your Query ResultsOracle SQLcl: Formatting your Query Results
Oracle SQLcl: Formatting your Query ResultsJeff Smith
 
스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략if kakao
 
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)Scott Sutherland
 
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28Shang Wei Li
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeAjeet Singh Raina
 
Designing with Capabilities
Designing with CapabilitiesDesigning with Capabilities
Designing with CapabilitiesScott Wlaschin
 
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...OpenStack Korea Community
 
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례rockplace
 
Practical API Security - PyCon 2018
Practical API Security - PyCon 2018Practical API Security - PyCon 2018
Practical API Security - PyCon 2018Adam Englander
 
Api gateway
Api gatewayApi gateway
Api gatewayenyert
 
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?williciousk
 
Xampp εγκατάσταση και ρυθμίσεις
Xampp   εγκατάσταση και ρυθμίσειςXampp   εγκατάσταση και ρυθμίσεις
Xampp εγκατάσταση και ρυθμίσειςTheodoros Douvlis
 
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Edureka!
 
Functional Error Handling with Cats
Functional Error Handling with CatsFunctional Error Handling with Cats
Functional Error Handling with CatsMark Canlas
 
Advanced SQL injection to operating system full control (whitepaper)
Advanced SQL injection to operating system full control (whitepaper)Advanced SQL injection to operating system full control (whitepaper)
Advanced SQL injection to operating system full control (whitepaper)Bernardo Damele A. G.
 
OWASP Top 10 API Security Risks
OWASP Top 10 API Security RisksOWASP Top 10 API Security Risks
OWASP Top 10 API Security RisksIndusfacePvtLtd
 
Building Windows Images with Packer
Building Windows Images with PackerBuilding Windows Images with Packer
Building Windows Images with PackerMatt Wrock
 

What's hot (20)

Oracle SQLcl: Formatting your Query Results
Oracle SQLcl: Formatting your Query ResultsOracle SQLcl: Formatting your Query Results
Oracle SQLcl: Formatting your Query Results
 
스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략스프링5 웹플럭스와 테스트 전략
스프링5 웹플럭스와 테스트 전략
 
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)
Into the Abyss: Evaluating Active Directory SMB Shares on Scale (Secure360)
 
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
HITCON GIRLS_惡意程式分析介紹_in 成功大學_by Turkey_2016.04.28
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm Mode
 
Designing with Capabilities
Designing with CapabilitiesDesigning with Capabilities
Designing with Capabilities
 
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...
[OpenInfra Days Korea 2018] (Track 4) Provisioning Dedicated Game Server on K...
 
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례
공개소프트웨어 DBMS에 대한 주요 도입 및 마이그레이션 사례
 
Completable future
Completable futureCompletable future
Completable future
 
Practical API Security - PyCon 2018
Practical API Security - PyCon 2018Practical API Security - PyCon 2018
Practical API Security - PyCon 2018
 
Web Service API Odoo - android
Web Service API Odoo - androidWeb Service API Odoo - android
Web Service API Odoo - android
 
Api gateway
Api gatewayApi gateway
Api gateway
 
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
 
Final terraform
Final terraformFinal terraform
Final terraform
 
Xampp εγκατάσταση και ρυθμίσεις
Xampp   εγκατάσταση και ρυθμίσειςXampp   εγκατάσταση και ρυθμίσεις
Xampp εγκατάσταση και ρυθμίσεις
 
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
 
Functional Error Handling with Cats
Functional Error Handling with CatsFunctional Error Handling with Cats
Functional Error Handling with Cats
 
Advanced SQL injection to operating system full control (whitepaper)
Advanced SQL injection to operating system full control (whitepaper)Advanced SQL injection to operating system full control (whitepaper)
Advanced SQL injection to operating system full control (whitepaper)
 
OWASP Top 10 API Security Risks
OWASP Top 10 API Security RisksOWASP Top 10 API Security Risks
OWASP Top 10 API Security Risks
 
Building Windows Images with Packer
Building Windows Images with PackerBuilding Windows Images with Packer
Building Windows Images with Packer
 

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
 
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
 
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
 
Why do I love and hate php?
Why do I love and hate php?Why do I love and hate php?
Why do I love and hate php?
 

Recently uploaded

How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
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)

How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
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