Nasıl yazıyoruz

Murat Gazioğlu
Aug 28, 2017 · 3 min read

Herkesin bildiği üzere PHP yazılım dünyasının üvey evladı gibi. Bunun pekçok nedeni var ancak bana kalırsa en önemli problem standartlarının olmaması. Herkes kafasına göre yazdığı için inanılmaz bir kod karmaşası var.
Biz iş yerinde nasıl yazıyoruz biraz bundan bahsetmek istedim.
Aslında biz Java, C# ve PHP dilleri ile projeler geliştirdiğimiz için bu üç dilde de mümkün olduğunca ortak bir yazım uygulamaya çalışıyoruz.

Bize göre;

  • Projelerde kullanılan tüm classlar ve fonksiyonlar sadece kendi işini yapmalıdır. Örnek vermek gerekirse bir model objesi sadece veriyi saklar, kendi propertyleri ile ilgili işleri yapar, bunun dışında birşey yapmaz. Daha evvel başka projelerin kodlarında şuna benzer birşeyler görmüştüm:
$calisan = new Calisan();
$calisan->name = “Mustafa”;
$calisan->surname = “Sağlık”;
$calisan->tcKimlikNo = “12345678911”;
$calisan->save();

Gördüğünüz gibi calisan classinin yeni bir örneği new ile türetiliyor, propertyleri set ediliyor ve sonra obje kendini dbye kaydediyor. Bu kabul edilebilir bir durum değil, Calisan classi bir model, bir model kendini kaydedemez yada kaydetmemeli.

  • Bir iş ile ilgili ‘bir’ method yazmaya çalışılmalı. Örneğin:
getProductList();
getProductListForAdmin();
getActiveProductList();

Görüldüğü gibi aslında hepsi ürün listesi dönüyor. Bunu farklı farklı methodlarla yazmak hele hele ayrı ayrı konumlarda yazmak projenin bakımı esnasında ciddi sorun çıkartır, tek bir methodun bakımı her zaman çok daha kolaydır.

  • Mümkün olduğunca bir standart yakalamaya çalışılmalı. Bu standartlar mümkünse sektöre uygun olmalı, herkesin get dedigi birşeye başka bir isim verilmemeli.
  • Değişkenler: Deve sırtı yazılmalı ve kendini tanıtan isimlendirme tercih edilmeli. Kısa olsun diye uğraşılmamalı, değişken adı mutlaka kendini anlatmalıdır, örneğin;
$kdvMatrahindanKalanBakiyeYuzdesi = 0.25;

Uç bir örnek ama anladınız siz. Bu $kmkby şeklinde yazılmamalı. Değişkenlere sevgilimizin adını vermemeliyiz :), sonra düzeltirim şimdilik böyle olsun dememeliyiz.

  • Class, fonksiyon ve method isimleri yine deve sırtı yazılmalı, class isimleri büyük harfle başlamalı, isimlendirme ilgili obje yada methodu açıklar nitelikte olmalıdır. Örneğin;
<?php
class Depo {
private $id;
private $depoAdi;
public function setDepoAdi($depoAdi) {
$this->depoAdi = $depoAdi;
}
}
function getNewDepo() {
$depo = new Depo();
$depo->setDepoAdi(“Bornova Deposu”);
return $depo;
}
?>
  • interfaceler I takısı ile ve büyük harfle başlamalı, IBaseController gibi.
  • Veritabanı, tablo ve alan isimlendirmelerinde deve sırtı kullanılmamalı, boşluk yerine alt tire kullanılmalıdır (tbl_member, user_name vb.)
  • View dosyalarında mümkün olduğunca mantıksal işler yapmamaya çalışılmalı. Viewlerin görevi ekrana basmaktır. Tabi bu her zaman başarılamayabiliyor ancak elden geldiği kadar zorlamak lazım. Örneğin:
<p>
<?php
if($employee->type == ‘M’) {
echo “Müdür”;
} else {
echo “Çalışan”;
}
?>
</p>

Yukarıdaki -bizce- hatalı bir kullanımdır, $employee objesinde type propertysi set edilirken bu label çözümlenip objenin başka bir propertysine set edilebilir, örneğin constructorda set edildiğini düşünelim;

<?php
class Employee {


public function Employee($row) {


$this->type = $row->employee;
$this->typeLabel = getvLabel("employee.calisan");
if($this->type == ‘M’) {
$this->typeLabel = getvLabel("employee.mudur");
}

}
?>
  • Controllerlarda sadece mantıksal işlemler, return, yönlendirmeler ve exit kullanılmalıdır. Hatta çok elzem olmadıkça exit bile kullanılmamalıdır. Controller methodları veriyi oluşturmamalı, çağırmalıdır. Database verileri DAO objelerinden gelmeli, mantıksal işlemler yapıp sonuç üreten kodlar yine aynı controllerın private methodlarında yazılmalıdır.
  • Çalışan dosyalarda global space mümkün olduğunca kirletilmemelidir. Örneğin;
<?php
include(“core/veranda.php”);
$veranda = new Veranda();
if($controller->name == ‘HomeController’) {
$pageTitle = “Hoşgeldiniz…”;
} else {
$pageTitle = $controller->view->getPageTitle();
}



?>

Yukarıdaki kod örneğinde if bloğu global space ‘i kirletmektedir. Bu işlemin bir fonksiyonda yapılması daha uygundur.

  • Bir kod en az iki kere aynı şekilde tekrarlanıyorsa bu kodu bir fonksiyon içine almak mantıklı olacaktır. Örneğin;

if($user->isActive == YES) {
$activeLabel = getvLabel(“common.active”);
} else {
$activeLabel = getvLabel(“common.passive”);
}

Yukarıdaki kod blogu birden fazla yerde aynı şekilde geçiyorsa bunu bir fonksiyon içine almak sanki daha uygun gibi:


function getActiveLabel($isActive) {
if($isActive == YES) {
$activeLabel = getvLabel(“common.active”);
} else {
$activeLabel = getvLabel(“common.passive”);
}
}
$activeLabel = isActive($user->isActive);
  • Static method kullanımından kaçılmalıdır. Statik methodlar RAM ‘de ayrı bir yerde saklanır, ne kadar statik method o kadar RAM demek.
  • Birden fazla dil desteği verilmeyecekse bile labellar resource dosyalarından okunmalıdır.
  • Yorumlar gerçekten yorum olmalıdır, örneğin;
<?php
class User {


// set User role set
public function setUserRoleSet($roleSet) {


}

?>

Yukarıdaki bir yorum değildir. Başkaları tarafından okunduğunda anlaşılmayacağını düşüneceğiniz noktalarda açıklayıcı yorumlar yazın. Aslında class, değişken ve fonksiyon isimleri bir nevi küçük commenttir. Bunları düzgün yazarsak çok fazla comment yazmaya ihtiyacımız olmuyor.

Genel olarak aklıma gelenleri yazdım. Belki bu listeye daha pek çok şey eklenebilir, yorumlarla destek verilirse yazı güncellenecektir.

Umarım birilerine yararlı olabilir.

Selamlar.

)

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade