PHP'de singletona kimin ihtiyacı var?
Tek tektonlara yapılan itirazların neredeyse hepsinin teknik açıdan geldiğine dikkat edin - ama aynı zamanda kendi kapsamlarında ÇOK sınırlıdır. Özellikle PHP için. İlk olarak, singletonları kullanmanın bazı nedenlerini listeleyeceğim ve sonra singletons kullanımıyla ilgili itirazları analiz edeceğim. İlk olarak, onlara ihtiyaç duyan insanlar:
- Birçok farklı ortamda kullanılacak büyük bir çerçeve / kod tabanını kodlayan kişilerin, istemcilerden / patronlardan çok farklı, değişen, hatta kaprisli talepleri yerine getirme gereği ile önceden var olan farklı çerçeveler / kod tabanlarıyla çalışması gerekecektir. / yönetim / birim liderleri yapar.
Bakın, tekil desen kendiliğinden kapsayıcı. Tamamlandığında, bir singleton sınıfı, dahil ettiğiniz herhangi bir kod boyunca katıdır ve yöntemlerini ve değişkenlerini nasıl oluşturduğunuz gibi davranır. Ve verilen bir istekte her zaman aynı nesnedir. İki farklı nesne olmak için iki kez oluşturulamadığından, tek bir nesnenin koddaki herhangi bir noktada ne olduğunu bilirsiniz - singleton iki, üç farklı, eski, hatta spagetti kod tabanına yerleştirilse bile. Bu nedenle, geliştirme amaçları açısından kolaylaştırır - bu projede çalışan birçok kişi olsa bile, herhangi bir kod tabanında bir noktada başlatılmış bir singleton gördüğünüzde, bunun ne olduğunu, ne yaptığını, nasıl olduğunu biliyorsunuz geleneksel sınıf olsaydı, o nesnenin ilk nerede yaratıldığını takip etmeniz gerekirdi, koddaki o noktaya kadar hangi yöntemler çağrıldı ve özel durumu. Ancak, orada bir singleton bırakın ve kodlama sırasında uygun hata ayıklama ve bilgi yöntemlerini ve izlemeyi bıraktıysanız, tam olarak ne olduğunu biliyorsunuzdur. Bu nedenle, daha önce farklı felsefelerle yapılmış olan veya hiç temasa sahip olmadığınız kişiler tarafından yapılan kodu entegre etme zorunluluğu ile farklı kod tabanlarıyla çalışmak zorunda olan kişilerin işini kolaylaştırır. (yani, satıcı-proje-şirket-ne olursa olsun artık, hiçbir destek yok). farklı kodlarla çalışmak zorunda olan insanlar için, daha önce farklı felsefelerle yapılan ya da hiç temasa sahip olmadığınız kişiler tarafından yapılan kodun bütünleştirilmesi zorunluluğunu kolaylaştırır. (yani, satıcı-proje-şirket-ne olursa olsun artık, hiçbir destek yok). farklı kodlarla çalışmak zorunda olan insanlar için, daha önce farklı felsefelerle yapılan ya da hiç temasa sahip olmadığınız kişiler tarafından yapılan kodun bütünleştirilmesi zorunluluğunu kolaylaştırır. (yani, satıcı-proje-şirket-ne olursa olsun artık, hiçbir destek yok).
- Üçüncü taraf API'ları , hizmetleri ve web siteleriyle çalışması gereken kişiler .
Daha yakından bakarsanız, bu önceki durumdan çok farklı değildir - üçüncü taraf API'ları, hizmetleri, web siteleri, üzerinde hiçbir kontrolünüz olmadığı harici, yalıtılmış kod tabanları gibidir. Her şey olabilir. Böylece, tek bir oturum / kullanıcı sınıfıyla, OpenID , Facebook , Twitter ve daha birçok üçüncü taraf sağlayıcıdan HERHANGİ bir oturum / yetkilendirme uygulamasını yönetebilirsiniz - ve bunları aynı anda SAME singleton nesnesinden yapabilirsiniz - kolayca erişilebilir, bilinen bir durumda, hangi kodu taktığınız herhangi bir noktada. Kendi web sitenizde / uygulamanızda SAME kullanıcısı için birden fazla farklı üçüncü taraf API / hizmetine birden fazla oturum oluşturabilir ve bunlarla ne yapmak isterseniz yapabilirsiniz.
Tabii ki, tüm bunlar normal sınıflar ve nesneler kullanarak geleneksel yöntemlerle ton olabilir - buradaki yakalama, singleton daha düzenli, daha düzenli ve bu nedenle bu tür durumlarda geleneksel sınıf / nesne kullanımına kıyasla yönetilebilir / test edilebilir daha kolaydır.
- Hızlı gelişim yapması gereken insanlar
Tek tektonların küresel benzeri davranışı, tek tek koleksiyonlar içeren bir çerçeveye sahip bir çerçeveyle her türlü kodu oluşturmayı kolaylaştırır, çünkü tek tek sınıflarınızı iyi yapılandırdığınızda, yerleşik, olgun ve set yöntemleri kolayca kullanılabilir ve her yerde, her zaman, tutarlı bir şekilde kullanılabilir. Sınıflarınızı olgunlaştırmak biraz zaman alır, ancak bundan sonra kaya gibi sağlam ve tutarlı ve kullanışlıdır. Tek birtonda ne istersen yapıyorsun birçok yönteme sahip olabilirsin ve bu, nesnenin bellek ayak izini artırabilse de, hızlı geliştirme için gereken zamandan çok daha fazla tasarruf getiriyor - belirli bir örnekte kullanmadığın bir yöntem bir uygulama başka bir entegre uygulamada kullanılabilir ve sadece istemci / patron / proje yöneticisinin birkaç değişiklikle sorduğu yeni bir özelliği tokatlayabilirsiniz.
Kaptın bu işi. Şimdi, yararlı olan bir şeye karşı tektonlara ve kutsal haçlı seferine itirazlara geçelim :
- En çok itiraz, testi zorlaştırmasıdır.
Ve gerçekten, bir ölçüye göre, uygun önlemleri alarak ve hata ayıklama rutinlerini tek bir hata ayıklayacağınızın farkına vararak tek tek tonlarınıza kodlayarak kolayca azaltılabilse bile. Ama bakın, bu, orada olan HERHANGİ diğer kodlama felsefesi / yöntemi / modelinden çok farklı değil - sadece, tek tonlar nispeten yeni ve yaygın değil, bu nedenle mevcut test yöntemleri onlarla karşılaştırılabilir olarak sona eriyor. Ancak bu, programlama dillerinin herhangi bir yönünden farklı değildir - farklı stiller farklı yaklaşımlar gerektirir.
Bu itirazın düzleştiği bir nokta, geliştirilen uygulamaların 'test etme' nedeni olmadığı ve testin uygulama geliştirmeye giden tek aşama / süreç olmadığı gerçeğini göz ardı etmektedir. Uygulamalar üretim kullanımı için geliştirilmiştir. Ve 'tek tektonlara ihtiyaç duyan' bölümünde açıkladığım gibi, tek tektonlar, bir kodun birçok farklı kod tabanı / uygulama / üçüncü taraf hizmetiyle İLE ve İÇERİĞİ yapmak zorunda olmanın karmaşıklığından BÜYÜK bir anlaşma kesebilir. Test sırasında kaybedilebilecek zaman, geliştirme ve devreye almada kazanılan zamandır. Bu, özellikle üçüncü taraf kimlik doğrulama / uygulama / entegrasyon çağında yararlıdır - Facebook, Twitter, OpenID, daha fazlası ve bir sonraki adımın kim olduğunu bilebilir.
Anlaşılabilir olmasına rağmen - programcılar kariyerlerine bağlı olarak çok farklı koşullarda çalışırlar. Ve farklı büyüklüklerde, tanımlanmış departmanları olan, rahat bir şekilde farklı, tanımlanmış yazılım / uygulamalar eğilimi gösteren ve bütçe kesintilerinin / işten çıkarmanın yaklaşan kıyameti olmadan çalışan insanlar için ve bununla birlikte, ucuz / hızlı / güvenilir bir moda, singletonlar çok gerekli görünmeyebilir. Ve ZATEN sahip oldukları şey için sıkıntı / engel bile olabilir.
Ancak, 'çevik' gelişimin kirli hendeklerinde çalışması gereken, müşteri / yönetici / projelerinden birçok farklı talep (bazen mantıksız) uygulamak zorunda olanlar için, singletonlar daha önce açıklanan nedenlerden dolayı tasarruflu bir lütuftur.
- Başka bir itiraz, bellek ayak izinin daha yüksek olması
Her istemciden gelen her istek için yeni bir singleton bulunacağı için bu PHP için bir itiraz olabilir. Kötü yapılandırılmış ve kullanılmış tek tonlarda, herhangi bir noktada uygulama tarafından çok sayıda kullanıcıya hizmet veriliyorsa, uygulamanın bellek alanı daha yüksek olabilir.
Yine de bu, şeyleri kodlarken uygulayabileceğiniz HERHANGİ bir yaklaşım için geçerlidir. Sorulması gereken sorular, bu tektonlar tarafından tutulan ve işlenen yöntemler, veriler gereksiz midir? Çünkü, uygulamanın aldığı isteklerin birçoğunda gerekliyse, tekilton kullanmasanız bile, bu yöntemler ve veriler kodunuz aracılığıyla bir şekilde veya başka bir şekilde uygulamanızda mevcut olacaktır. Yani, kod işleme içine 1/3 geleneksel bir sınıf nesnesi başlattığınızda ve bunu 3/4 içine imha ettiğinizde, ne kadar bellek tasarrufu yapacağınız sorusu haline gelir.
Bakın, bu yolla konulduğunda, soru oldukça önemsiz hale gelir - gereksiz yöntemler, kodunuzdaki nesnelerde HERHANGİ bir şekilde tutulan veriler olmamalıdır - tekliton kullanmanızdan bağımsız olarak. Yani, tektonlara yapılan bu itiraz gerçekten komik olur, kullandığınız sınıflardan yaratılan nesnelerde gereksiz yöntemler, veriler olacağını varsayar.
- 'Birden çok veritabanı bağlantısını sürdürmeyi imkansız / zorlaştırıyor' gibi bazı geçersiz itirazlar
Herkesin birden fazla veritabanı bağlantısı, birden çok veritabanı seçimi, birden çok veritabanı sorgusu, belirli bir singletondaki birden çok sonuç kümesini tek bir değişkente tuttuğu sürece, bu itirazı anlamaya başlayamıyorum ihtiyaç vardır. Bu, dizilerde tutmak kadar basit olabilir, ancak bunu gerçekleştirmek için kullanmak istediğiniz herhangi bir yöntemi icat edebilirsiniz. Ancak en basit durumu, değişkenlerin ve dizilerin belirli bir singletonda kullanımını inceleyelim:
Aşağıdakilerin belirli bir veritabanı singletonunun içinde olduğunu düşünün:
$ this -> connections = dizi (); (yanlış sözdizimi, sadece resmi vermek için böyle yazdım - değişkenin doğru beyanı genel $ connections = array (); ve kullanımı $ this-> connections ['connectionkey'] doğal olarak)
Bu şekilde bir dizide herhangi bir zamanda birden çok bağlantı kurabilir ve saklayabilirsiniz. Aynı şey sorgular, sonuç kümeleri vb. İçin de geçerlidir.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['partikül bağlantı']);
Bu, yalnızca seçili bir bağlantıyla seçilen bir veritabanına sorgu yapabilir ve yalnızca
$ this -> sonuç
'queryname' anahtarıyla dizi. Tabii ki, sorgu yönteminizin bunun için kodlanmış olması gerekir - ki bu önemsizdir.
Bu, neredeyse sonsuz sayıda (elbette kaynak sınırlarının izin verdiği ölçüde) farklı veritabanı bağlantılarını ve sonuç kümelerini ihtiyacınız olduğu kadar korumanızı sağlar. Ve herhangi bir kod tabanında bu singleton sınıfının örneklendiği herhangi bir noktada HERHANGİ bir kod parçası için kullanılabilirler.
DERSİN doğal olarak, sonuç kümelerini ve bağlantıları gerekli olmadığında serbest bırakmanız gerekir - ancak bu söylenmeden gider ve bu, singletonlara veya diğer herhangi bir kodlama yöntemine / stiline / kavramına özgü değildir.
Bu noktada, üçüncü taraf uygulamalara veya hizmetlere aynı tektonda birden çok bağlantıyı / durumu nasıl koruyabileceğinizi görebilirsiniz. Çok farklı değil.
Uzun lafın kısası, sonunda, singleton kalıpları, programlanacak başka bir yöntem / stil / felsefe ve doğru yerde, doğru şekilde kullanıldıklarında HERHANGİ kadar faydalıdırlar. Bu hiçbir şeyden farklı değil.
Tektonların dayatıldığı makalelerin çoğunda, 'küresellerin' kötülük olduğunu da görebilirsiniz.
Kabul edelim - Düzgün kullanılmayan, kötüye kullanılan, kötüye kullanılan her şey kötüdür. Bu herhangi bir dil, herhangi bir kodlama konsepti ve herhangi bir yöntemle sınırlı değildir. Birinin 'X kötüdür' gibi battaniye ifadeleri çıkardığını gördüğünüzde, bu makaleden kaçın. Şansı, sınırlı bir bakış açısının ürünüdür - bakış açısı belirli bir şeydeki yılların deneyiminin sonucu olsa bile - genellikle belirli bir tarzda / yöntemde - tipik entelektüel muhafazakârlıkta çok fazla çalışmanın sonucu olarak ortaya çıkar.
Bunun için 'küreseller kötülükten' iframe'ler kötüdür 'gibi sonsuz örnekler verilebilir. Yaklaşık 10 yıl önce, herhangi bir uygulamada iframe kullanımını önermek bile sapkınlıktı. Sonra Facebook, her yerde iframe geliyor ve neler olduğuna bakın - iframe'ler artık o kadar kötü değil.
Hala inatla 'kötü' olduklarında ısrar eden insanlar var - ve bazen de iyi bir nedenden ötürü - ama gördüğünüz gibi, bu ihtiyacı dolduran ve iyi çalışan iframe'lerin doldurulması gerekiyor ve bu nedenle tüm dünya devam ediyor.
Bir programcı / kodlayıcı / yazılım mühendisinin en önemli varlığı özgür, açık ve esnek bir zihindir.