Php Static Değer Hep Aynı
-
YeniHarman bunu yazdıozgunlu bunu yazdıhocam OOP' nin ne faydası oluyor o zaman bu PHP' ye.
Tamam bir sürü bişeye düzene sokuyoruz da 100% fit de olmuyor bu olay.
Yani bir java mantığıyla ilerleyemiyorum php de. Class' larım var tamam ama beni nelerden kurtarıyor tam da böyle rahat değilim.
Bana göre sadece maintanence ve readability' i bir derece artıyor.
Procedural yaklaşınca da çok birşey kaybetmiyormuşum gibi geliyor (her ne kadar bırakmış olsam da).
Yani biraz mükemmelliyetçi bir yapım, birşeyi 10 kere düşünüp 1 kere yazma taraftarıyım, en iyisini yakalamaya çalışıyorum ama konu php' ye gelince, her konusunda ayrı bir tartışma ile karşılaşıyorum.
Bahsettiğimiz sıkıntı doğruda php'nin oop yeteneklerinden kaynaklanmıyor. Tamam, php $'sidir, ->'dir, getter setter olayıdır, arrayların pass by value olmasıdır gibi bir sürü rezilliği var ama değil işte:)
İşte o mükemmeliyetçilik sıkıntılı bir durum. Bir işin kalitesi şöyle anlaşılır:
1. İşini yapıyor mu?
2. İşini yaparken sıkıntı çıkarıyor mu?
Bir yazılım (diğer her şey gibi) oluşturulma amacını hatasız yerine getiriyorsa iyidir, getirmiyorsa değildir. Nasıl, neyle, ne zaman yazıldığı önemli değil. Gidip üç satır kodu illa sınıf içine kapsüllemenin, a->b->c->d...->n hiyerarşisi kullanmanın saçma olduğu açık.
Deneyimle çözülebileceğine inanıyorum bu durumun. Daha iyi mimari tasarımı, daha iyi soyutlama gibi önemli şeyler sorunla karşılaşıp çözünce oluyor.
Geliştirilebilirliği sağlamak bence en önemlisi, o yüzden bu kadar yoruyoruz. Yoksa yaz gitsin, her türlü çalışır :)
-
yorumları okumadım ama söylediğini yapabilmen için sınıfı da statik yapman lazım. her defasında new instance oluşucak yaptığın şekilde
-
Geliştirilebilirliği sağlamak bence en önemlisi, o yüzden bu kadar yoruyoruz. Yoksa yaz gitsin, her türlü çalışır :)
Katıl(a)mıyorum:) O tüm x deseni ile yazılmış tüm kodlar, aradaki y sınıfının kurala uymaması ile çöp olabilir ya da f kişisinin yazdığı kodlar dökümantasyonsuzsa projeyi baştan yazman çok daha kolay olabilir gibi...
Aşağı yukarı mantık (o süslü cümleler, sayfalarca bak factory şuna benzer örnekleri yerine) aşağıdaki şekilde olursa problem çıkmaz:
1. Sadece kendi işini yapacak fonksiyonları yaz. Örneğin bir çıktı dosyası oluşturacak fonksiyonun görevi önce dosyanın varlığını kontrol etmek, varsa silmek ve yeniden oluşturmak olmasın. Doğrudan oluştursun. Oradaki dosyanın varlığını denetleme görevi başka bir fonksiyonun.
2. Fonksiyonları tek başlarına bir uygulama gibi düşün. Yapacağı işle ilgili parametreleri kendisi oluşturmasın, dışarıdan alsın. Örneğin A fonksiyonu z dosyasına yazmakla görevli diyelim. Yazacağı şeyleri dışarıdan almalı, kendisi oturup dosyanın encoding'ini belirlememeli.
3. Gizleyebildiğin her şeyi gizle. OOP destekli bir dil kullanıyorsan sınıflarla, yoksa yapıların içine gizle ki yanlışlıkla bozmayasın, haddini aşıp saçma bir yerde kullanmayasın.
4. Arayüzler oluştur. Bir işi arayüzlerle tanımla ve bu arayüzün dışındaki (o işi yapmaya yarayan fakat doğrudan erişilmemesi gereken) her şeye yokmuş gibi davran.
5. Bir şeyi değiştirmek istemiyorsan const yap, elleme. Yapamıyorsan değerini kopyalayarak kullan.
6. Sadece bir işi yapmakla görevli (işi önceden fonksiyonlara bölmüştük) sınıflar oluştur. Günlükleme sınıfı, XML to SQL sınıfı gibi. Günlükleme sınıfını sadece bir şeyin günlüklenmesi gerektiğinde çağırırsın. Günlük dosyasının konumunu verirsin, oluşturur. Günlüğe yazılacak şeyleri verirsin, yazar. Bu kadar. Günlükleme sınıfı tutup o günlüklerden istatistik çıkarmasın (günde ortalama şu kadar hata üretildi gibi). Günlükten istatistik çıkarmak başka bir sınıfın görevi olmalı.
7. Benzer işi yapan sınıfları da toplayıp modül oluştur. Sabit parametreler modül ile birlikte tanımlansın.
8. Her fonksiyonun düzgün çalıştığından emin ol. Birim testleri bunun için var.
9. Dökümantasyon yaz. Hiyerarşiyi kağıda çiz. Neyin ne yapacağı, hangi parametreler ışığında ne gibi sonuçlar üreteceğini not düş.
10. Proje yönetim sistemi kullan. Versiyonlama yap.
11. Bana dua et:)
-
YeniHarman bunu yazdı
Geliştirilebilirliği sağlamak bence en önemlisi, o yüzden bu kadar yoruyoruz. Yoksa yaz gitsin, her türlü çalışır :)
Katıl(a)mıyorum:) O tüm x deseni ile yazılmış tüm kodlar, aradaki y sınıfının kurala uymaması ile çöp olabilir ya da f kişisinin yazdığı kodlar dökümantasyonsuzsa projeyi baştan yazman çok daha kolay olabilir gibi...
Aşağı yukarı mantık (o süslü cümleler, sayfalarca bak factory şuna benzer örnekleri yerine) aşağıdaki şekilde olursa problem çıkmaz:
1. Sadece kendi işini yapacak fonksiyonları yaz. Örneğin bir çıktı dosyası oluşturacak fonksiyonun görevi önce dosyanın varlığını kontrol etmek, varsa silmek ve yeniden oluşturmak olmasın. Doğrudan oluştursun. Oradaki dosyanın varlığını denetleme görevi başka bir fonksiyonun.
2. Fonksiyonları tek başlarına bir uygulama gibi düşün. Yapacağı işle ilgili parametreleri kendisi oluşturmasın, dışarıdan alsın. Örneğin A fonksiyonu z dosyasına yazmakla görevli diyelim. Yazacağı şeyleri dışarıdan almalı, kendisi oturup dosyanın encoding'ini belirlememeli.
3. Gizleyebildiğin her şeyi gizle. OOP destekli bir dil kullanıyorsan sınıflarla, yoksa yapıların içine gizle ki yanlışlıkla bozmayasın, haddini aşıp saçma bir yerde kullanmayasın.
4. Arayüzler oluştur. Bir işi arayüzlerle tanımla ve bu arayüzün dışındaki (o işi yapmaya yarayan fakat doğrudan erişilmemesi gereken) her şeye yokmuş gibi davran.
5. Bir şeyi değiştirmek istemiyorsan const yap, elleme. Yapamıyorsan değerini kopyalayarak kullan.
6. Sadece bir işi yapmakla görevli (işi önceden fonksiyonlara bölmüştük) sınıflar oluştur. Günlükleme sınıfı, XML to SQL sınıfı gibi. Günlükleme sınıfını sadece bir şeyin günlüklenmesi gerektiğinde çağırırsın. Günlük dosyasının konumunu verirsin, oluşturur. Günlüğe yazılacak şeyleri verirsin, yazar. Bu kadar. Günlükleme sınıfı tutup o günlüklerden istatistik çıkarmasın (günde ortalama şu kadar hata üretildi gibi). Günlükten istatistik çıkarmak başka bir sınıfın görevi olmalı.
7. Benzer işi yapan sınıfları da toplayıp modül oluştur. Sabit parametreler modül ile birlikte tanımlansın.
8. Her fonksiyonun düzgün çalıştığından emin ol. Birim testleri bunun için var.
9. Dökümantasyon yaz. Hiyerarşiyi kağıda çiz. Neyin ne yapacağı, hangi parametreler ışığında ne gibi sonuçlar üreteceğini not düş.
10. Proje yönetim sistemi kullan. Versiyonlama yap.
11. Bana dua et:)
9 ve 10' u yapmıyordum, diğerlerini yapıyordum. Ama konunun buralara gelmesine seviniyorum.
Farkındalığım arttı iyice, kenara not olarak asayım bunu da. Teşekkür ederim hocam, 11. maddeyi yapıyordum bu arada.
Sevgiler :))
-
Baştan sona tüm mesajları tekrar okurum sonra mesajım bulunsun :) Bilgiler için teşekkürler.
-
Sınıf statiklerini çok severim. Ve espirisi üretilen tüm objelerin aynı değeri işleyebilmesine dayanıyor ve her istekte yeniden oluşturuluyorlar. Yoksa server'ı çalıştırdım statik değer verdim bu server kapanasıya kadar bellekte kalacak diye birşey yok. Eğer birden fazla isteğin o işleyeceği değer söz konusu ise onu bir şekilde diske yazmamız gerekiyor. Ya da bizim istediğimiz bilgileri ramde tutacak bir program edinmemiz gerekiyor.
Mesela statikler ile ilgili bir veritabanı sınıfını yazayım:
class VT { public static $baglanti = null; public $son_sorgu = null; public $son_sonuc = null; public static baglan() { self::$baglanti = new PDO(mysql:host=............ } public function sorgu() { if(self::$baglanti == null) { self::baglan(); } $this->son_sonuc = self::$baglanti->prepare(....... } }Bu sınıfı incelediğimizde, "$vt1 = new VT(); $vt2 = new VT(); $vt3 = new VT();" şeklinde üç ayrı obje olsa bile hepsi aynı bağlantıyı kullanacaklar. Böylece tek istekte birden fazla bağlantı oluşturulmasını engelleyeceğiz. Varsayılan bağlantı tipinde bağlanacaklar.
