SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
Refactoring, Spagetti Koddan
Nasıl Kurtulurum?
Anıl Özselgin
Spagetti Kodun Özellikleri
● Global değişkenler içerir.
● Herhangi bir fonksiyon içinde bulunmayan kodlar vardır.
● Tutarlı bir kod stili yoktur. Boşluklar, girintiler,
isimlendirmeler farklılık gösterir.
● Fonksiyonlar çok uzundur ve bir çok iş yaparlar.
● Kod organizasyonu yoktur.
Yanlış Bilinenler
● Spagetti kod, prosedürel değildir. Prosedürel
programlamada, prosedürler -yani fonksiyonlar- ile
organizasyon sağlanır.
● Spagetti kod hızlı değildir. Değişkenler çok geniş bir
alanda tanımlı oldukları için çöp toplayıcı (garbage
collector) tarafından toplanamazlar. Hafıza (memory)
şişer.
● Başlangıçta hızlı yazılım geliştirilir, sonra sizi çıkan
hatalardan (bug) dolayı yavaşlatır.
Refactoring Nedir?
● Bir bilgisayar programının çıktılarını ve işlevlerini
değiştirmeden iç yapısının yeniden düzenlenerek
geliştirilmesidir.
● Ufak adımlarla kodda değişiklik yapılır. Her değişiklikten
sonra sistemin düzgün çalıştığı test edilir.
Refactoring Örneği
● Refactor edeceğimiz kod: e-ticaret sitesi yorum sayfası
● İlgili iki tablo bulunuyor: urunler ve yorumlar
● Tek bir dosya içerisinde ilgili bütün işlemler yapılıyor.
● İlk önce fonksiyonlara böleceğiz.
● Sonra fonksiyonları sınıflara taşıyacağız.
● Veri katmanı, iş katmanı ve görsel katmanı ayıracağız.
Yorum Sayfası
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="bootstrap.min.css" rel="stylesheet">
<title>Ürün Yorumları</title>
</head>
<body>
<div class="container">
<?php
mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error());
mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error());
mysql_query("SET NAMES UTF8");
$urun_id = $_GET['id'];
$result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id"");
$row = mysql_fetch_row($result);
echo "<h1>{$row[0]}</h1>";
?>
<table class="table table-striped">
<tr><th>No</th><th>Başlık</th><th>Yorum</th></tr>
<?php
$result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler
WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id"");
while($arr = mysql_fetch_array($result))
{
echo "<tr><td>{$arr['id']}</td><td>{$arr['baslik']}</td><td>{$arr['icerik']}</td></tr>";
}
?>
</table>
</div>
</body>
</html>
Fonksiyonlara Taşıma
2. Version
Eski kod:
mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error());
mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error());
mysql_query("SET NAMES UTF8");
Yeni kod:
function veritabani_ayarlarini_yap(){
mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error());
mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error());
mysql_query("SET NAMES UTF8");
}
veritabani_ayarlarini_yap();
Fonksiyonlara Taşıma
3. Version
Eski kod:
$result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id"");
$row = mysql_fetch_row($result);
echo "<h1>{$row[0]}</h1>";
Yeni kod:
function urun_adi_al($urun_id){
$result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id"");
$row = mysql_fetch_row($result);
return $row[0];
}
$urun_adi = urun_adi_al($urun_id);
echo "<h1>$urun_adi</h1>";
Fonksiyonlara Taşıma
4. Version
Eski kod:
$result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler
WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id"");
while($arr = mysql_fetch_array($result))
{
echo "<tr><td>{$arr['id']}</td><td>{$arr['baslik']}</td><td>{$arr['icerik']}</td></tr>";
}
Yeni kod:
function yorumlari_getir($urun_id){
$result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler
WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id"");
$yorumlar = array();
while($yorum = mysql_fetch_array($result)){
$yorumlar[] = $yorum;
}
return $yorumlar;
}
Fonksiyon Taşıma
5. Version
Eski kod:
$urun_id = $_GET['id'];
$urun_adi = urun_adi_al($urun_id);
echo "<h1>$urun_adi</h1>";
Yeni kod:
//sayfayi olusturan ana fonksiyon
function yorumlar_sayfasi(){
global $degerler;
veritabani_ayarlarini_yap();
$urun_id = $_GET['id'];
$degerler["urun_adi"] = urun_adi_al($urun_id);
$degerler["yorumlar"] = yorumlari_getir($urun_id);
}
yorumlar_sayfasi();
Html Kodlarını Ayırmak
● Html içerisindeki yoğun php kullanımını kaldırdık şu
anda.
● Html içerisindeki php kodları sadece basit kontroller ve
döngüleri için bulunuyor artık.
Html Kodlarını Ayırmak
6. Version
● Bir sonraki aşamada html kodlarını yorumlar_template.
php dosyasının içine alıyoruz.
Sınıfa Taşıma
7. Version
● yorumlar.php dosyamızdaki kodlarımızı
yorumlar_sayfasi sınıfı oluşturup içine taşıyoruz
Front Controller Pattern'i
8. Version
● index.php dosyası oluşturuyoruz
● baslatici sınıfını index.php içine koyuyoruz. artık bütün gelen
istekler buradan sayfalara dağıtılacak.
● ayarlar sınıfını oluşturup veritabani_ayarlarini_yap metodunu
buraya taşıyoruz.
● index.php?sayfa=yorumlar&id=1 şeklinde istek yapılmalı artık
Veri Katmanını Ayırmak
9. Version
● urunler sınıfı oluşturup urun_adi_al metodunu taşıyoruz.
● yorumlar sınıfı oluşturup yorumlari_getir metodunu
taşıyoruz.
Uygulamanın Son Hali
Sonra...
● Veri katmanından verileri array olarak aldık. Urun ve
Yorum objeleri olusturup, bunlari array icinde donmemiz
gerekir.
● Yorumlar sayfası direk olarak veri katmanına ulaşıyor.
Araya servis katmanı koymak gerekiyor.
● veritabanı refactoring yapılabilir. urunler tablosundaki id
kolonu urun_id, yorumlar tablosundaki id kolonu
yorum_id yapılmalı.
Sorular?

Weitere ähnliche Inhalte

Ähnlich wie Php refactoring

Django Introduction
Django IntroductionDjango Introduction
Django Introduction
Fatih Erikli
 
9.hafta cüneyt tomruk
9.hafta cüneyt tomruk9.hafta cüneyt tomruk
9.hafta cüneyt tomruk
oktaygokgol
 
Stored procedure
Stored procedureStored procedure
Stored procedure
oktaygokgol
 

Ähnlich wie Php refactoring (20)

WAF atlatma yontemleri, Hacktrick14, Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14,  Suleyman OzarslanWAF atlatma yontemleri, Hacktrick14,  Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14, Suleyman Ozarslan
 
VERİTABANI SIZMA TESTLERİ
VERİTABANI SIZMA TESTLERİVERİTABANI SIZMA TESTLERİ
VERİTABANI SIZMA TESTLERİ
 
Recep proje 5
Recep proje 5Recep proje 5
Recep proje 5
 
Javascript Performance Optimisation
Javascript Performance OptimisationJavascript Performance Optimisation
Javascript Performance Optimisation
 
Django Introduction
Django IntroductionDjango Introduction
Django Introduction
 
İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13
 
Pig ve Hive ile Hadoop üzerinde Veri Analizi
Pig ve Hive ile Hadoop üzerinde Veri AnaliziPig ve Hive ile Hadoop üzerinde Veri Analizi
Pig ve Hive ile Hadoop üzerinde Veri Analizi
 
9.hafta cüneyt tomruk
9.hafta cüneyt tomruk9.hafta cüneyt tomruk
9.hafta cüneyt tomruk
 
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
 
Web İçin Teknoloji Geliştirmek
Web İçin Teknoloji GeliştirmekWeb İçin Teknoloji Geliştirmek
Web İçin Teknoloji Geliştirmek
 
Visual Studio Developer Tools
Visual Studio Developer ToolsVisual Studio Developer Tools
Visual Studio Developer Tools
 
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
 
Stored procedure
Stored procedureStored procedure
Stored procedure
 
Java EE Struts
Java EE StrutsJava EE Struts
Java EE Struts
 
Extjs 4 education
Extjs 4 educationExtjs 4 education
Extjs 4 education
 
İleri Seviye T-SQL Programlama - Chapter 09
İleri Seviye T-SQL Programlama - Chapter 09İleri Seviye T-SQL Programlama - Chapter 09
İleri Seviye T-SQL Programlama - Chapter 09
 
Dspace Migration and Dspace Piwik Integration
Dspace Migration and Dspace Piwik IntegrationDspace Migration and Dspace Piwik Integration
Dspace Migration and Dspace Piwik Integration
 
Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi
Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 PrensibiKaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi
Kaya Gibi Sağlam Yazılım Projelerine İmza Atmanın 5 Prensibi
 
Java 9 Project Jigsaw
Java 9 Project JigsawJava 9 Project Jigsaw
Java 9 Project Jigsaw
 
Ports and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecturePorts and Adapters: Separating concerns in your architecture
Ports and Adapters: Separating concerns in your architecture
 

Php refactoring

  • 1. Refactoring, Spagetti Koddan Nasıl Kurtulurum? Anıl Özselgin
  • 2. Spagetti Kodun Özellikleri ● Global değişkenler içerir. ● Herhangi bir fonksiyon içinde bulunmayan kodlar vardır. ● Tutarlı bir kod stili yoktur. Boşluklar, girintiler, isimlendirmeler farklılık gösterir. ● Fonksiyonlar çok uzundur ve bir çok iş yaparlar. ● Kod organizasyonu yoktur.
  • 3. Yanlış Bilinenler ● Spagetti kod, prosedürel değildir. Prosedürel programlamada, prosedürler -yani fonksiyonlar- ile organizasyon sağlanır. ● Spagetti kod hızlı değildir. Değişkenler çok geniş bir alanda tanımlı oldukları için çöp toplayıcı (garbage collector) tarafından toplanamazlar. Hafıza (memory) şişer. ● Başlangıçta hızlı yazılım geliştirilir, sonra sizi çıkan hatalardan (bug) dolayı yavaşlatır.
  • 4. Refactoring Nedir? ● Bir bilgisayar programının çıktılarını ve işlevlerini değiştirmeden iç yapısının yeniden düzenlenerek geliştirilmesidir. ● Ufak adımlarla kodda değişiklik yapılır. Her değişiklikten sonra sistemin düzgün çalıştığı test edilir.
  • 5. Refactoring Örneği ● Refactor edeceğimiz kod: e-ticaret sitesi yorum sayfası ● İlgili iki tablo bulunuyor: urunler ve yorumlar ● Tek bir dosya içerisinde ilgili bütün işlemler yapılıyor. ● İlk önce fonksiyonlara böleceğiz. ● Sonra fonksiyonları sınıflara taşıyacağız. ● Veri katmanı, iş katmanı ve görsel katmanı ayıracağız.
  • 7. <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link href="bootstrap.min.css" rel="stylesheet"> <title>Ürün Yorumları</title> </head> <body> <div class="container"> <?php mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error()); mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error()); mysql_query("SET NAMES UTF8"); $urun_id = $_GET['id']; $result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id""); $row = mysql_fetch_row($result); echo "<h1>{$row[0]}</h1>"; ?> <table class="table table-striped"> <tr><th>No</th><th>Başlık</th><th>Yorum</th></tr> <?php $result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id""); while($arr = mysql_fetch_array($result)) { echo "<tr><td>{$arr['id']}</td><td>{$arr['baslik']}</td><td>{$arr['icerik']}</td></tr>"; } ?> </table> </div> </body> </html>
  • 8. Fonksiyonlara Taşıma 2. Version Eski kod: mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error()); mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error()); mysql_query("SET NAMES UTF8"); Yeni kod: function veritabani_ayarlarini_yap(){ mysql_connect("localhost", "root", "") or die ("Veritabanına bağlanırken bir hata oluştu!" . mysql_error()); mysql_select_db("site") or die("Veritanında bir hata oluştu!" . mysql_error()); mysql_query("SET NAMES UTF8"); } veritabani_ayarlarini_yap();
  • 9. Fonksiyonlara Taşıma 3. Version Eski kod: $result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id""); $row = mysql_fetch_row($result); echo "<h1>{$row[0]}</h1>"; Yeni kod: function urun_adi_al($urun_id){ $result = mysql_query("SELECT ad FROM urunler WHERE urunler.id="$urun_id""); $row = mysql_fetch_row($result); return $row[0]; } $urun_adi = urun_adi_al($urun_id); echo "<h1>$urun_adi</h1>";
  • 10. Fonksiyonlara Taşıma 4. Version Eski kod: $result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id""); while($arr = mysql_fetch_array($result)) { echo "<tr><td>{$arr['id']}</td><td>{$arr['baslik']}</td><td>{$arr['icerik']}</td></tr>"; } Yeni kod: function yorumlari_getir($urun_id){ $result = mysql_query("SELECT yorumlar.*, urunler.ad FROM yorumlar, urunler WHERE yorumlar.urun = urunler.id AND urunler.id="$urun_id""); $yorumlar = array(); while($yorum = mysql_fetch_array($result)){ $yorumlar[] = $yorum; } return $yorumlar; }
  • 11. Fonksiyon Taşıma 5. Version Eski kod: $urun_id = $_GET['id']; $urun_adi = urun_adi_al($urun_id); echo "<h1>$urun_adi</h1>"; Yeni kod: //sayfayi olusturan ana fonksiyon function yorumlar_sayfasi(){ global $degerler; veritabani_ayarlarini_yap(); $urun_id = $_GET['id']; $degerler["urun_adi"] = urun_adi_al($urun_id); $degerler["yorumlar"] = yorumlari_getir($urun_id); } yorumlar_sayfasi();
  • 12. Html Kodlarını Ayırmak ● Html içerisindeki yoğun php kullanımını kaldırdık şu anda. ● Html içerisindeki php kodları sadece basit kontroller ve döngüleri için bulunuyor artık.
  • 13. Html Kodlarını Ayırmak 6. Version ● Bir sonraki aşamada html kodlarını yorumlar_template. php dosyasının içine alıyoruz.
  • 14. Sınıfa Taşıma 7. Version ● yorumlar.php dosyamızdaki kodlarımızı yorumlar_sayfasi sınıfı oluşturup içine taşıyoruz
  • 15. Front Controller Pattern'i 8. Version ● index.php dosyası oluşturuyoruz ● baslatici sınıfını index.php içine koyuyoruz. artık bütün gelen istekler buradan sayfalara dağıtılacak. ● ayarlar sınıfını oluşturup veritabani_ayarlarini_yap metodunu buraya taşıyoruz. ● index.php?sayfa=yorumlar&id=1 şeklinde istek yapılmalı artık
  • 16. Veri Katmanını Ayırmak 9. Version ● urunler sınıfı oluşturup urun_adi_al metodunu taşıyoruz. ● yorumlar sınıfı oluşturup yorumlari_getir metodunu taşıyoruz.
  • 18. Sonra... ● Veri katmanından verileri array olarak aldık. Urun ve Yorum objeleri olusturup, bunlari array icinde donmemiz gerekir. ● Yorumlar sayfası direk olarak veri katmanına ulaşıyor. Araya servis katmanı koymak gerekiyor. ● veritabanı refactoring yapılabilir. urunler tablosundaki id kolonu urun_id, yorumlar tablosundaki id kolonu yorum_id yapılmalı.