ݺߣ

ݺߣShare a Scribd company logo
Kaya Gibi Sağlam
Yazılım Projelerine
İmza Atmanın
5 Prensibi
İbrahim Gündüz
Temmuz 2015 @ PHPKonf
İbrahim GündüzYazılım Geliştirici
http://tr.linkedin.com/in/ibrahimgunduz
https://github.com/ibrahimgunduz34
https://twitter.com/ibrahimgunduz34
ibrahimgunduz34@gmail.com
http://www.ibrahimgunduz.net/
"... the design of a software project is
documented primarily by its source
code."
Robert C. Martin
“Biz
döküman
yazmıyoruz,
iş yapıyoruz”
KÖTÜ TASARIM
ÇÜRÜR!!!
ÇÜRÜYEN
TASARIM
KOKAR!!!
Esnemezlik
(Rigidity)
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ı
Kırılganlık
(Fragility)
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ı
Taşınamamazlık
(Immobility)
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ı
Akışkanlık Direnci
(Viscosity)
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.
Gereksiz Tekrar
(Needless Repetition)
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
Gereksiz Karmaşa
(Needless Complexity)
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.
“Any fool can write code that a computer can understand.
Good programmers can write code that humans can
understand.”
Martin Fowler
S.O.L.I.D.
Prensipleri
SOLID Prensipleri
Nedir ?
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
“S”
Single Responsibility
Tekil Sorumluluk
Single Responsbility
Her sınıfın ve metodun tek bir sorumluluğu
olmalı.
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.');
}
}
}
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.');
}
}
}
“O”
Open-Closed
Açık / Kapalı
Open - Closed
Kaynak kodu genişlemeye açık, değişime kapalı
olmalıdır.
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
}
}
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);
}
}
“L”
Liskov Substitution
Liskov’un Yerine ұç
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.
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 {}
class SalaryCalculator
{
public function getTotalSalary()
{
$total = 0;
foreach(getEmployeers() as $employee) {
if($employee instanceof Intern) {
$total += 0;
} else {
$total += $employee->getSalary();
}
}
return $total;
}
}
class SalaryCalculator
{
public function getTotalSalary()
{
$total = 0;
foreach(getEmployeers() as $employee) {
$total += $employee->getSalary();
}
return $total;
}
}
“I”
Interface Segregation
Arayüz Ayırma
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ı.
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
{
/...
}
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
{
/...
}
“D”
Dependency Inversion
Bağımlılıkların Tersine
Çevirilmesi
Dependency Inversion
Somut sınıflarla olan bağımlılıklar arayüzler ve
soyut sınıflar kullanılarak kaldırılmalı.
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
}
}
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);
}
}
http://tr.linkedin.com/in/ibrahimgunduz
https://github.com/ibrahimgunduz34
https://twitter.com/ibrahimgunduz34
ibrahimgunduz34@gmail.com
http://www.ibrahimgunduz.net/
Teşekkürler
Ad

Recommended

Jquery Giriş
Jquery Giriş
Oğuzhan TAŞ Akademi
JavaScript sunumu
JavaScript sunumu
Osman Yuksel
Tasarım Desenleri ve PHP Implementasyonları
Tasarım Desenleri ve PHP Implementasyonları
ibrahimgunduz34
Git commit ve push’dan bir adım ötesi...
Git commit ve push’dan bir adım ötesi...
ibrahimgunduz34
Diyar kizilkaya 130908045 - sap
Diyar kizilkaya 130908045 - sap
diyar kızılkaya
Belediyeler v.2
Belediyeler v.2
Emin Divitci
TOBB Yazılım Sektörü Meclisi 2016: Yazılım Geleceğimizdir
TOBB Yazılım Sektörü Meclisi 2016: Yazılım Geleceğimizdir
Melek Bar Elmas
Yazilim için ortak ses ver (v1)
Yazilim için ortak ses ver (v1)
Melek Bar Elmas
Ytyp (fazlası için www.tipfakultesi.org )
Ytyp (fazlası için www.tipfakultesi.org )
www.tipfakultesi. org
Yeni medya trendleri
Yeni medya trendleri
Bogazici Gelisim
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
Tugba Ozen
Gazi Alataş
Gazi Alataş
Serkan Korhan
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
oğuzhan şeker
Medikal Sektördeki Dijital Gelişmeler
Medikal Sektördeki Dijital Gelişmeler
Userspots
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Vatanay Özbeyli
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
afyonluoglu
Cool marka Olma Sanatı
Cool marka Olma Sanatı
ismail Dağlı
Veri Kullanımı ve Programatik Reklamcılık- IAB
Veri Kullanımı ve Programatik Reklamcılık- IAB
Mutlu Dogus Yildirim
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Betul Kesimal
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
oğuzhan şeker
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
Mutlu Dogus Yildirim
İç Kontrol Sistemi
İç Kontrol Sistemi
İlayda Üçüncü
Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Muhittin Özer
Php open source_softwares_designs
Php open source_softwares_designs
Anıl Özselgin
Rails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları Geliştirimi
muarifer
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
ibrahimhizlioglu
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
Hakan ERDOGAN
Microservices Architecture
Microservices Architecture
Dilaver Demirel

More Related Content

Viewers also liked (16)

Yazilim için ortak ses ver (v1)
Yazilim için ortak ses ver (v1)
Melek Bar Elmas
Ytyp (fazlası için www.tipfakultesi.org )
Ytyp (fazlası için www.tipfakultesi.org )
www.tipfakultesi. org
Yeni medya trendleri
Yeni medya trendleri
Bogazici Gelisim
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
Tugba Ozen
Gazi Alataş
Gazi Alataş
Serkan Korhan
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
oğuzhan şeker
Medikal Sektördeki Dijital Gelişmeler
Medikal Sektördeki Dijital Gelişmeler
Userspots
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Vatanay Özbeyli
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
afyonluoglu
Cool marka Olma Sanatı
Cool marka Olma Sanatı
ismail Dağlı
Veri Kullanımı ve Programatik Reklamcılık- IAB
Veri Kullanımı ve Programatik Reklamcılık- IAB
Mutlu Dogus Yildirim
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Betul Kesimal
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
oğuzhan şeker
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
Mutlu Dogus Yildirim
İç Kontrol Sistemi
İç Kontrol Sistemi
İlayda Üçüncü
Yazilim için ortak ses ver (v1)
Yazilim için ortak ses ver (v1)
Melek Bar Elmas
Ytyp (fazlası için www.tipfakultesi.org )
Ytyp (fazlası için www.tipfakultesi.org )
www.tipfakultesi. org
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
İş Sağlığı ve Güvenliği'nde Devletin Görev ve Yetkileri
Tugba Ozen
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
ÇOKLU ORTAM TASARIMI Dersi - 6.hafta - Çoklu Ortam Uygulamalarinda Kullanici ...
oğuzhan şeker
Medikal Sektördeki Dijital Gelişmeler
Medikal Sektördeki Dijital Gelişmeler
Userspots
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Vatanay Özbeyli
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
Kamu Entegre Veri Merkezleri - Mustafa Afyonluoglu
afyonluoglu
Veri Kullanımı ve Programatik Reklamcılık- IAB
Veri Kullanımı ve Programatik Reklamcılık- IAB
Mutlu Dogus Yildirim
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Yazılım mühendisliğinde i̇nsan bilgisayar etkileşimi
Betul Kesimal
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
ÇOKLU ORTAM TASARIMI Dersi - 5.hafta - ÇOKLU ORTAM UYGULAMALARINDA GÖRSEL TAS...
oğuzhan şeker
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
IAB Turkiye Programatik Reklamcilik Egitim Sunumu
Mutlu Dogus Yildirim

Similar to Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi (20)

Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Muhittin Özer
Php open source_softwares_designs
Php open source_softwares_designs
Anıl Özselgin
Rails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları Geliştirimi
muarifer
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
ibrahimhizlioglu
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
Hakan ERDOGAN
Microservices Architecture
Microservices Architecture
Dilaver Demirel
Yazılım Prensipleri ve Code Review Check List
Yazılım Prensipleri ve Code Review Check List
Dilaver Demirel
Başarılı Projelerin Anahtarı: Çevik Yazılım Geliştirme Pratikleri
Başarılı Projelerin Anahtarı: Çevik Yazılım Geliştirme Pratikleri
Lemi Orhan Ergin
Ports and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecture
Mehmet KORKMAZ
E-ticarette Yazılım ve Altyapı
E-ticarette Yazılım ve Altyapı
Murat Kader
Eticaret akademi Yazılım ve IT süreçleri
Eticaret akademi Yazılım ve IT süreçleri
Murat Kader
Dekleratif Transaction Yönetimi
Dekleratif Transaction Yönetimi
Sistek Yazılım
Büyük Kamu Projelerinde PHP Kullanımı @ Phpİst 2013
Büyük Kamu Projelerinde PHP Kullanımı @ Phpİst 2013
Hüseyin Mert
Continuous Integration Bamboo ve Php Uygulaması
Continuous Integration Bamboo ve Php Uygulaması
Mustafa Ileri
İTÜ İşletme Fakültesi - E-ticarette Yazılım ve Altyapı
İTÜ İşletme Fakültesi - E-ticarette Yazılım ve Altyapı
Murat Kader
12factor apps
12factor apps
Dilaver Demirel
[OWASP-TR Uygulama Güvenliği Günü 2016] Muhammet Dilmaç - Ruby on Rails Web F...
[OWASP-TR Uygulama Güvenliği Günü 2016] Muhammet Dilmaç - Ruby on Rails Web F...
OWASP Turkiye
Web development
Web development
Seydi Alkan
005 Alternatif Yazilim Surecleri [99 ݺߣs]
005 Alternatif Yazilim Surecleri [99 ݺߣs]
Erol Bozkurt
Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Sonraki Yazılımcıya Anlatır Gibi Kod Yazmak
Muhittin Özer
Php open source_softwares_designs
Php open source_softwares_designs
Anıl Özselgin
Rails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları Geliştirimi
muarifer
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
Özgür Web Teknolojileri Günleri 2010 - İbrahim Hızlıoğlu // CodeIgniter Sunumu
ibrahimhizlioglu
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
E-ticarette Bilgi Teknolojileri - Bilgi Üniversitesi E-ticaret Akademi 2012.0...
Hakan ERDOGAN
Yazılım Prensipleri ve Code Review Check List
Yazılım Prensipleri ve Code Review Check List
Dilaver Demirel
Başarılı Projelerin Anahtarı: Çevik Yazılım Geliştirme Pratikleri
Başarılı Projelerin Anahtarı: Çevik Yazılım Geliştirme Pratikleri
Lemi Orhan Ergin
Ports and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecture
Mehmet KORKMAZ
E-ticarette Yazılım ve Altyapı
E-ticarette Yazılım ve Altyapı
Murat Kader
Eticaret akademi Yazılım ve IT süreçleri
Eticaret akademi Yazılım ve IT süreçleri
Murat Kader
Dekleratif Transaction Yönetimi
Dekleratif Transaction Yönetimi
Sistek Yazılım
Büyük Kamu Projelerinde PHP Kullanımı @ Phpİst 2013
Büyük Kamu Projelerinde PHP Kullanımı @ Phpİst 2013
Hüseyin Mert
Continuous Integration Bamboo ve Php Uygulaması
Continuous Integration Bamboo ve Php Uygulaması
Mustafa Ileri
İTÜ İşletme Fakültesi - E-ticarette Yazılım ve Altyapı
İTÜ İşletme Fakültesi - E-ticarette Yazılım ve Altyapı
Murat Kader
[OWASP-TR Uygulama Güvenliği Günü 2016] Muhammet Dilmaç - Ruby on Rails Web F...
[OWASP-TR Uygulama Güvenliği Günü 2016] Muhammet Dilmaç - Ruby on Rails Web F...
OWASP Turkiye
005 Alternatif Yazilim Surecleri [99 ݺߣs]
005 Alternatif Yazilim Surecleri [99 ݺߣs]
Erol Bozkurt
Ad

Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi

  • 1. Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi İbrahim Gündüz Temmuz 2015 @ PHPKonf
  • 3. "... the design of a software project is documented primarily by its source code." Robert C. Martin
  • 8. 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ı
  • 10. 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ı
  • 12. 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ı
  • 14. 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.
  • 16. 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
  • 18. 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.
  • 19. “Any fool can write code that a computer can understand. Good programmers can write code that humans can understand.” Martin Fowler
  • 21. SOLID Prensipleri Nedir ? 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
  • 23. Single Responsbility Her sınıfın ve metodun tek bir sorumluluğu olmalı.
  • 24. 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.'); } } }
  • 25. 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.'); } } }
  • 27. Open - Closed Kaynak kodu genişlemeye açık, değişime kapalı olmalıdır.
  • 28. 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 } }
  • 29. 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); } }
  • 31. 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.
  • 32. 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 {}
  • 33. class SalaryCalculator { public function getTotalSalary() { $total = 0; foreach(getEmployeers() as $employee) { if($employee instanceof Intern) { $total += 0; } else { $total += $employee->getSalary(); } } return $total; } }
  • 34. class SalaryCalculator { public function getTotalSalary() { $total = 0; foreach(getEmployeers() as $employee) { $total += $employee->getSalary(); } return $total; } }
  • 36. 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ı.
  • 37. 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 { /... }
  • 38. 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 { /... }
  • 40. Dependency Inversion Somut sınıflarla olan bağımlılıklar arayüzler ve soyut sınıflar kullanılarak kaldırılmalı.
  • 41. 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 } }
  • 42. 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); } }