2012-01-02 25 views
8

düzgün bir şekilde kullanarak, bir istemcinin sorguladığını aramak zorunda olan bir sunucu çalıştırıyorum. İstemci sorgusunu kayıt için diske yazmak istiyorum, ancak aramam gerekenden daha fazla yavaşlatmak istemiyorum. (Arama zaten darboğazdır ...)Tekil tasarım desenini

Yani, istemci bir arama yaptığında, istemcinin iş parçacığı istemcinin iş parçacığı, tek bir iş parçacığı için bir ileti gönderir, bu istemci iş parçacığı sırasında disk yazma işlemek müşterinin isteklerini ele almaya devam ediyor. Bu şekilde, diskteki dosyalar senkronizasyon sorunlarına yol açmaz ve istemcilerin deneyimini yavaşlatmaz.

Burada kavramsal bir sorum var: bu davada uygun olan tekton mu? Son programlamamda singleton tasarım desenini biraz fazla kullanıyorum ve amaçlanan kullanım için kullandığımdan emin olmak istiyorum.

Her türlü geri bildiriminiz büyük beğeni topluyor.

+3

Genel mimarinizi görmeden bu soruyu yanıtlamak zor. Tekil paterninde dezavantajlar var (ünite testi zorluklarına neden oluyor, vb.), Ilgili olup olmadıklarını belirlemek size kalmış ... –

+1

Hızlı yanıt için teşekkürler Oli; Birim test zorluklarını okudum ama genel anlamlarını anlamadım. Neden böyle bir öneme sahip küresel durumdan kaçınıyor? Örneğin, bir programın yazdığı diskte sadece bir dosya varsa, farklı bölümler tarafından aynı anda erişilemediğinden emin olmak istemez mi? – Sal

+0

Küresel durumun varlığı, bağımlılıkları enjekte etmeyi zorlaştırabilir (bu, [deneme testi] nin temelidir (http://en.wikipedia.org/wiki/Mock_object)). Daha fazla bilgi için bu konuşmayı izleyin: http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html. –

cevap

7

singleton pattern kesinlikle aşırı kullanımlıdır ve difficulties (standart olarak birim testidir) ile birlikte gelir, ancak tasarımdaki her şey gibi, özel senaryonuz için artıları ve eksileri tartmanız gerekir. Singleton modelinin kullanımları var. Tekil davranışı elde etmenize olanak tanıyan seçenekler vardır; bu, bazı sorunlardan bazılarını hafifletirken,

Interception (genellikle yönelimli programlama olarak adlandırılır, ancak tam olarak aynı şey olmadığına dair bir tartışma gördüm. .. şu anda okuduğum makaleyi bulamıyorum) kesinlikle bir seçenek. Yapım enjeksiyonunun herhangi bir kombinasyonunu, decorator modelini, soyut bir fabrikayı ve inversion of control container'u kullanabilirsiniz. Java IoC kaplarımda değilim, ancak otomatik kesişim sağlayan bazı .Net kapları var (Spring.Net'in yaptıklarıma inanıyorum, bu yüzden Spring (Java) 'ın bu yerleşik özelliği var). Bu, çoklu katmanlarda (güvenlik, günlüğe kaydetme vb.) Belirli eylem türlerini gerçekleştirmeniz gereken her tür kesişen sorun için çok kullanışlıdır. Ayrıca, IoC kapsayıcıların çoğu, ömür boyu yönetimi kontrol etmenize olanak tanır; böylece, tekli kalıbı manuel olarak uygulamak zorunda kalmadan, logger'ınızı bir singleton olarak değerlendirebilirsiniz.

Özetle. Tek bir senaryonun senaryonuza uyması durumunda (açıklamanızdan anlaşılabilir gibi görünüyorsa), bunun için gidin. Sadece artıları ve eksileri tarttığından emin ol. Farklı bir yaklaşım denemek ve ikisini karşılaştırmak isteyebilirsiniz.