![Page 1: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/1.jpg)
Kaya Gibi Sağlam Yazılım Projelerineİmza Atmanın5 Prensibi
İbrahim GündüzTemmuz 2015 @ PHPKonf
![Page 2: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/2.jpg)
İbrahim GündüzYazılım Geliştirici
http://tr.linkedin.com/in/ibrahimgunduz
https://github.com/ibrahimgunduz34
https://twitter.com/ibrahimgunduz34
http://www.ibrahimgunduz.net/
![Page 3: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/3.jpg)
"... the design of a software project is documented primarily by its source code."
Robert C. Martin
![Page 4: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/4.jpg)
“Biz döküman yazmıyoruz, iş yapıyoruz”
![Page 5: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/5.jpg)
KÖTÜ TASARIM ÇÜRÜR!!!
![Page 6: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/6.jpg)
ÇÜRÜYEN TASARIM KOKAR!!!
![Page 7: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/7.jpg)
Esnemezlik(Rigidity)
![Page 8: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/8.jpg)
Esnemezlik (Rigidity)
● Kaynak kodunda değişikliğe karşı artan zorlaşma eğilimi
● Tek bir değişikliğin bile başka pek çok modülde değişikliğe neden olması
● Geliştirme süresinin gitgide artması
![Page 9: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/9.jpg)
Kırılganlık(Fragility)
![Page 10: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/10.jpg)
Kırılganlık (Fragility)
● En küçük değişiklikle bile uygulamada pek çok noktada kırılabilme eğiliminin artması
● Yapılan değişiklikle doğrudan ilgisi olmayan farklı noktada meydana gelen kırılmalar
● Yapılan her hata giderme işlemi ile birlikte olası beklenmedik hataların oluşması ihtimalinin artması
![Page 11: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/11.jpg)
Taşınamamazlık(Immobility)
![Page 12: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/12.jpg)
Taşınamamazlık (Immobility)
● Modüller arası yüksek bağımlılık
● Taşınamayan, mevcut veya başka bir proje tarafından kullanılamayan kod blokları
● Gereksiz kod tekrarları
![Page 13: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/13.jpg)
Akışkanlık Direnci(Viscosity)
![Page 14: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/14.jpg)
Akışkanlık Direnci (Viscosity)
● Tasarımı koruma yoluna gitmek, gelişi güzel iş yapmaktan daha zor hale geldiğinde akışkanlık direnci yüksektir.
● Geliştirme ortamının yavaş yada elverişsiz olması geliştiricilerin gelişi güzel iş yapma eğilimini arttırır.
![Page 15: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/15.jpg)
Gereksiz Tekrar(Needless Repetition)
![Page 16: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/16.jpg)
Gereksiz Tekrar (Needles Repetition)
● Tasarımın, tek soyutlamanın içinde tekrarlanan yapılar içermesi
● Geliştiricinin kopyala/yapıştır kavramını su istimal etmesi
● Tekrarlanan kodla anlaşılmaz ve bakımı zor hale gelen sistem
![Page 17: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/17.jpg)
Gereksiz Karmaşa(Needless Complexity)
![Page 18: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/18.jpg)
Gereksiz Karmaşa (Needles Complexity)
● Proje, anlaşılması güç ve hiçbir zaman kullanılmayan yapılarla doludur.
● Kullanışsız kod blokları karmaşa hissi uyandırır.
![Page 19: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/19.jpg)
“Any fool can write code that a computer can understand. Good programmers can write code that humans can understand.”
Martin Fowler
![Page 20: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/20.jpg)
S.O.L.I.D. Prensipleri
![Page 21: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/21.jpg)
SOLID PrensipleriNedir ?Robert Martin sunumu ile ortaya çıkan bağımlılık yönetimi biçiminin baş harfleridir.
Ne Sağlar ?● Gevşek bağlara sahip● Yeniden Kullanılabilir ● Kolaylıkla test edilebilir● Gerektiğinde rahatlıkla
bakım yapılabilir● Yüksek uyumluğa sahip
![Page 22: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/22.jpg)
“S”Single ResponsibilityTekil Sorumluluk
![Page 23: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/23.jpg)
Single Responsbility
Her sınıfın ve metodun tek bir sorumluluğu olmalı.
![Page 24: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/24.jpg)
class UserManager
{
public function register($email, $fullname, $password)
{
//validasyon
if( !$email || !$this->isEmail($email)) {,
throw new ValidationError('Email must be valid email address.');
}
if(!$fullname || len($fullname) < 20 || len(split(' ', $email)) < 2) {
throw new ValidationError('Fullname must be valid name.');
}
if(len($password) < 6 || len($password) > 30) {
throw new ValidationError('Password length must be greater than six character and less than thirty character.');
}
//veritabaninda kullanici kaydi olusturuluyor
try {
$user = new User();
$user->setName($fullname);
$user->setEmail($email);
$user->generatePassword($password);
$user->persist();
$user->flush();
$mailer = new Mailer();
$mailer->send($user->getEmail(), 'Registration is completed successfuly.', 'bla..bla...'
);
} catch(DatabaseError $error) {
Logger::exception($error);
throw new SystemError('User registration is failed.');
}
}
}
![Page 25: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/25.jpg)
class UserManager
{
private function createUser($email, $fullname, password)
{
$user = new User();
$user->setName($fullname);
$user->setEmail($email);
$user->generatePassword($password);
$user->persist();
$user->flush();
return $user;
}
public function register($email, $fullname, $password)
{
//validasyon
$validator = new UserRegistrationValidator($email, $fullname, $password);
$validator->validate();
//veritabaninda kullanici kaydi olusturuluyor
try {
$user = $this->createUser($email, $fullname, $password);
$eventDispatcher->dispatch('user.registred', new UserRegisterEvent($user));
return true;
} catch(DatabaseError $exc) {
Logger::exception($exc);
throw new SystemError('User registration is failed.');
}
}
}
![Page 26: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/26.jpg)
“O”Open-Closed
Açık / Kapalı
![Page 27: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/27.jpg)
Open - Closed
Kaynak kodu genişlemeye açık, değişime kapalı olmalıdır.
![Page 28: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/28.jpg)
class SaleRules
{
public function calculateDiscount($customerGroup, $totalAmount)
{
if($customerGroup == CustomerGroup::STANDARD) {
$discount = $totalAmount * 0.95 + 3 / 2
} elseif ($customerGroup == CustomerGroup::SILVER) {
$discount = ...
} elseif($customerGroup == CustomerGroup::PLATIN) {
$discount = ...
} elseif($customerGroup == CustomerGroup::GOLD) {
$discount = ...
}
return $discount
}
}
![Page 29: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/29.jpg)
interface CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount);
}
class StandardGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SilverGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SaleRules
{
public function calculateDiscount($rule, $totalAmount)
{
return $rule->calculateDiscount($totalAmount);
}
}
![Page 30: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/30.jpg)
“L”Liskov Substitution
Liskov’un Yerine Geçme
![Page 31: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/31.jpg)
Liskov Substitution
Alt sınıflardan oluşturulan nesneler, üst sınıflardan oluşturulan nesnelerle yer değiştirdiklerinde aynı davranışı sergilemek zorundadırlar.
![Page 32: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/32.jpg)
class Employee
{
protected $baseSalary = 2000;
public function getSalary()
{
throw new EmployeException('This employee salary is not defined yet.');
}
}
class Engineer extends Employee
{
public function getSalary()
{
return $this->baseSalary * 3
}
}
class Manager extends Employee
{
public function getSalary()
{
return $this->baseSalary * 5;
}
}
class Intern extends Employee {}
![Page 33: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/33.jpg)
class SalaryCalculator
{
public function getTotalSalary()
{
$total = 0;
foreach(getEmployeers() as $employee) {
if($employee instanceof Intern) {
$total += 0;
} else {
$total += $employee->getSalary();
}
}
return $total;
}
}
![Page 34: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/34.jpg)
class SalaryCalculator
{
public function getTotalSalary()
{
$total = 0;
foreach(getEmployeers() as $employee) {
$total += $employee->getSalary();
}
return $total;
}
}
![Page 35: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/35.jpg)
“I”Interface Segregation
Arayüz Ayırma
![Page 36: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/36.jpg)
Interface Segregation
Birbiriyle ilişkili olmayan pek çok metodu ihtiva eden arayüzler yerine birbiriyle ilişkili metodlardan oluşan çok sayıda arayüz kullanılmalı.
![Page 37: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/37.jpg)
interface PosInterface
{
public function preAuthorization(PreAuthorizationRequest $request);
public function postAuthorization(PostAuthorizationRequest $request);
public function sale(SaleRequest $request);
public function refund(RefundRequest $request);
public function cancel(CancelRequest $request);
public function processProviderResponse(ProviderResponse $providerResponse);
public function finalize(Finalize3dRequest $request);
}
class SynchPayA implements PosInterface
{
/...
}
class SynchPayB implements PosInterface
{
/...
}
![Page 38: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/38.jpg)
interface PosInterface
{
public function sale(SaleRequest $request);
public function refund(RefundRequest $request);
public function cancel(CancelRequest $request);
}
interface ThreeDSecureAware
{
public function processProviderResponse(ProviderResponse $providerResponse);
public function finalize(Finalize3dRequest $request);
}
interface PreAuthorizationWare
{
public function preAuthorization(PreAuthorizationRequest $request);
public function postAuthorization(PostAuthorizationRequest $request);
}
class SynchPayA implements PosInterface, PreAuthorizationWare
{
/...
}
class SynchPayB implements PosInterface, PreAuthorizationWare, ThreeDSecureAware
{
/...
}
![Page 39: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/39.jpg)
“D”Dependency Inversion
Bağımlılıkların Tersine Çevirilmesi
![Page 40: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/40.jpg)
Dependency Inversion
Somut sınıflarla olan bağımlılıklar arayüzler ve soyut sınıflar kullanılarak kaldırılmalı.
![Page 41: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/41.jpg)
interface CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount);
}
class StandardGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SilverGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SaleRules
{
public function calculateDiscount($rule, $totalAmount)
{
if($rule instanceof StandardGroupRule) {
/...
$discount $rule->calculateDiscount
} elseif($rule instanceof SilverGroupRule) {
/...
$discount $rule->calculateDiscount
}
return $discount
}
}
![Page 42: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/42.jpg)
interface CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount);
}
class StandardGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SilverGroupRule implements CustomerGroupRuleInterface
{
public function calculateDiscount($totalAmount)
{
return $totalAmount * 0.95 + 3 / 2
}
}
class SaleRules
{
public function calculateDiscount(CustomerGroupRuleInterface $rule, $totalAmount)
{
return $rule->calculateDiscount($totalAmount);
}
}
![Page 43: Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi](https://reader033.vdocuments.pub/reader033/viewer/2022042604/588224521a28ab52368b4a3b/html5/thumbnails/43.jpg)
http://tr.linkedin.com/in/ibrahimgunduz
https://github.com/ibrahimgunduz34
https://twitter.com/ibrahimgunduz34
http://www.ibrahimgunduz.net/
Teşekkürler