GOF Singleton Pattern'e uygun alternatifler var mı?


91

Kabul edelim. Singleton Pattern, çitin her iki tarafında ordu programcıları ile oldukça tartışmalı bir konudur . Singleton'ın yüceltilmiş bir küresel değişkenden başka bir şey olmadığını düşünenler ve kalıplara göre yemin edip onu sürekli kullanan başkaları var. Ancak Singleton Tartışmasının sorumun merkezinde yer almasını istemiyorum . Herkes bir halat çekebilir ve onunla savaşabilir ve umursadığım her şey için kimin kazandığını görebilir . Söylemeye çalıştığım, tek bir doğru cevabın olduğuna inanmıyorum ve kasıtlı olarak ateşli partizan çekişmelerini denemiyorum. Soruyu sorduğumda sadece tekil alternatiflerle ilgileniyorum :

GOF Singleton Pattern'e özel alternatifleri var mı?

Örneğin, geçmişte tekil kalıbı kullandığımda çoğu kez, sadece bir veya birkaç değişkenin durumunu / değerlerini korumakla ilgileniyorum. Değişkenlerin durumu / değerleri, bununla birlikte, tekli model kullanmak yerine statik değişkenler kullanılarak sınıfın her bir somutlaştırılması arasında korunabilir .

Başka hangi fikrin var?

DÜZENLEME: Bunun "singleton nasıl doğru kullanılacağı" hakkında başka bir gönderi olmasını gerçekten istemiyorum. Yine, bundan kaçınmanın yollarını arıyorum. Eğlenmek için, tamam mı? Sanırım en iyi film fragman sesinizde tamamen akademik bir soru soruyorum, "Tektonun olmadığı paralel bir evrende ne yapabiliriz?"


Ne? Ne iyi ne de kötü, ama onu nasıl değiştirebilirim? Bunun iyi olduğunu söyleyenler için - katılmayın. Kötü olduğunu söyleyenler, onsuz nasıl yaşayabileceğimi bana göstererek bunu kanıtlayın. Bana tartışmalı geliyor.
S.Lott

@CodingWithoutComents: yazının tamamını okudum. "Tekilliler iyi ise cevap verme" hissine bu şekilde sahip oldum.
S.Lott

2
Peki, böyle olduysa özür dilerim. Kutuplaşmayı önlemek için önemli adımlar attığımı sanıyordum. Soruyu, hem Singletons sevenler hem de nefret
edenler

Singletons kullanırsam, bunların etrafında nasıl çalışacağım konusunda olası bir katkım olmaz. Bana kutuplaşıyor gibi geliyor.
S.Lott

9
Her gün Singleton kullanıyorum ama bu, işleri yapmanın daha iyi bir yolu olabileceğini düşünmemi engelliyor mu? Tasarım Modelleri sadece 14 yıldır var. Bunları İncil gerçeği olarak kabul ediyor muyum? Kutunun dışında düşünmeyi bırakacak mıyız? CS disiplinini ilerletmeye çalışmıyor muyuz?
CodingWithoutComments

Yanıtlar:


77

" Nefret Ettiğim Örüntüler " de Alex Miller şunlardan alıntı yapıyor:

"Tek bir cevap cevap gibi göründüğünde, genellikle şunu yapmanın daha akıllıca olduğunu düşünüyorum:

  1. Bir arayüz ve tekliğinizin varsayılan uygulamasını oluşturun
  2. Sisteminizin "tepesinde" varsayılan uygulamanızın tek bir örneğini oluşturun. Bu, bir Spring yapılandırmasında veya kodda olabilir veya sisteminize bağlı olarak çeşitli şekillerde tanımlanabilir.
  3. Tek örneği ihtiyaç duyan her bileşene geçirin (bağımlılık ekleme)

2
Bunun 5 yaşında olduğunu biliyorum, ama bunu biraz daha açabilir misin? Sanırım bir singleton oluşturmanın doğru yolunun bir arayüzle olduğu öğretildi. Yaptığım şeyin 'iyi' olması ve bana söylendiği kadar korkunç olmamasıyla ilgilenirim.
Pureferret

97

Tekilleri geçici olarak çözmenin doğru yolunu anlamak için, Singletons'da neyin yanlış olduğunu (ve genel olarak küresel durumu) anlamanız gerekir:

Singletonlar bağımlılıkları gizler.

Bu neden önemlidir?

Çünkü bağımlılıkları gizlerseniz, birleştirme miktarının izini kaybetme eğiliminde olursunuz.

Bunu tartışabilirsin

void purchaseLaptop(String creditCardNumber, int price){
  CreditCardProcessor.getInstance().debit(creditCardNumber, amount);
  Cart.getInstance().addLaptop();
}

daha basit

void purchaseLaptop(CreditCardProcessor creditCardProcessor, Cart cart, 
                    String creditCardNumber, int price){
  creditCardProcessor.debit(creditCardNumber, amount);
  cart.addLaptop();
}

ancak en azından ikinci API, yöntemin ortak çalışanlarının tam olarak ne olduğunu netleştirir.

Bu nedenle, Singletons'a geçici çözüm bulmanın yolu, statik değişkenler veya hizmet konumlandırıcıları kullanmak değil, Singleton sınıflarını, anlamlı oldukları ve bunlara ihtiyaç duyan bileşenlere ve yöntemlere enjekte edilen kapsamda somutlaştırılan örneklere dönüştürmektir. Bunun üstesinden gelmek için bir IoC çerçevesi kullanabilirsiniz veya bunu manuel olarak yapabilirsiniz, ancak önemli olan küresel durumunuzdan kurtulmak ve bağımlılıkları ve işbirliklerini açık hale getirmektir.


+1 Sorunun kökenini tartışmak için, sadece bunun nasıl çözüleceğini değil.
Phil

9
Tam teşekküllü, çok katmanlı bir uygulamada, ikinci yöntem genellikle büyük miktarda gereksiz kod oluşturur. Orta katmanların kodunu daha düşük katmanlara taşımak için mantıkla kirleterek, bu düzeyde normalde gereksiz olan nesneleri, olması gerekmeyen bağımlılıklar oluşturmuyor muyuz? Bir gezinme yığınındaki 4. katman, dosya yükleme gibi bir arka plan eylemi başlatır. Şimdi, tamamlandığında kullanıcıyı uyarmak istediğinizi varsayalım, ancak o zamana kadar, kullanıcı, yalnızca başlatan görünümle ortak olan katman 1'i paylaşan uygulamanın tamamen farklı bir bölümünde olabilir. Bir sürü gereksiz kod ...
Hari Honor

1
@RasmusFaber Bir Singleton kalıbı bağımlılıkları gizlemez. Bağımlılıkları gizleme konusundaki şikayetiniz, kalıptan ayrı bir endişedir. Modelin bu hatayı yapmayı kolaylaştırdığı doğrudur, ancak IoC ve Singleton modelini uyum içinde birlikte yürütmek çok mümkündür. Örneğin, örneklerinin özel yaşam döngüsü yönetimine ihtiyaç duyan bir 3. taraf kitaplığı oluşturabilirim ve kitaplığımı kullanan herkes, singleton'um "gökyüzü kancası" yerine klasik Bağımlılık Ekleme kullanarak sınıflarına yine de tekli tonumun bir örneğini "geçirmelidir" her noktadan.
Martin Bliss

@HariKaramSingh, bunu çözmek için abone olma / yayınlama modelini veya sistem çapında olay veri yolunu (tek bir kişi değil, tüm ilgili taraflar arasında paylaşılmalıdır) kullanabilirsiniz.
Victor Sorokin

4
Aynı zamanda pub / sub veya gözlemci kalıpları da "eşleşme izini kaybetmek" kadar kötü olabilir, çünkü hata ayıklamaya büyük ölçüde bağlı olan bir çerçeve aracılığıyla adım atmak zorunda kalan herkesin onaylayacağı gibi. En azından singleton ile, çağrılan yöntem adı çağrılan kodla aynı yerdedir :) Kişisel olarak, tüm bu stratejilerin bir yeri olduğunu ve hiçbirinin körü körüne uygulanamayacağını düşünüyorum. Özensiz kodlayıcılar herhangi bir kalıptan spagetti üretecek ve sorumlu kodlayıcılar, zarif kodlar oluşturmak için ideolojik sınırlamalarla kendilerini aşırı derecede zorlamak zorunda kalmayacaklar.
Hari Honor

14

Karşılaştığım en iyi çözüm, sınıflarınızın örneklerini oluşturmak için fabrika modelini kullanmaktır. Deseni kullanarak temin edebilirsiniz onu kullanan nesneler arasında paylaşılan bir sınıfın yalnızca bir örneğinin olduğundan .

Yönetmenin karmaşık olacağını düşünmüştüm, ancak bu blog yazısını okuduktan sonra "Tüm Bekarlar Nereye Gitti?"çok doğal görünüyor. Ve bir kenara, birim testlerinizi izole etmenize çok yardımcı olur.

Özetle ne yapmanız gerekiyor? Bir nesne diğerine bağımlı olduğunda, onun bir örneğini yalnızca kurucusu aracılığıyla alır (sınıfınızda yeni anahtar sözcük yoktur).

class NeedyClass {

    private ExSingletonClass exSingleton;

    public NeedyClass(ExSingletonClass exSingleton){
        this.exSingleton = exSingleton;
    }

    // Here goes some code that uses the exSingleton object
}

Ve sonra fabrika.

class FactoryOfNeedy {

    private ExSingletonClass exSingleton;

    public FactoryOfNeedy() {
        this.exSingleton = new ExSingletonClass();
    }

    public NeedyClass buildNeedy() {
        return new NeedyClass(this.exSingleton);
    }
}

Fabrikanızı yalnızca bir kez somutlaştıracağınız için, tek bir exSingleton somutlaştırması olacaktır. BuildNeedy'yi her çağırdığınızda, NeedyClass'ın yeni örneği exSingleton ile paketlenir.

Umarım bu yardımcı olur. Lütfen hataları belirtin.


5
Fabrikanızın yalnızca özel bir kurucuya ihtiyaç duyduğunuzda somutlaştırıldığından emin olmak ve buildNeedy yöntemini statik bir yöntem olarak tanımlamak için.
Julien Grenier

16
Julien haklı, bu düzeltmenin temel bir kusuru var, bu da dolaylı olarak yalnızca bir fabrikayı somutlaştırabileceğinizi söylüyorsunuz. Sadece bir fabrikanın somutlaştırıldığından emin olmak için gerekli önlemleri alırsanız (ne de Julien'in söylediği gibi) bir singleton elde edersiniz! Gerçekte, bu yaklaşım sadece tekil üzerine gereksiz bir soyutlama katmanı ekler.
Bob Somers

Yalnızca bir Örneğe sahip olmanın başka bir yolu vardır. Fabrikanızı yalnızca bir kez somutlaştırabilirsiniz. Derleyici tarafından bunu uygulamaya gerek yoktur. Bu aynı zamanda farklı bir örnek istediğiniz birim testlerine de yardımcı olur .
frast

Bu, tekillerle yanlış bir şekilde çözülen soruna şimdiye kadar gördüğüm en iyi çözüm - her yöntem çağrısını karıştırmadan bağımlılıklar eklemek (ve dolayısıyla arayüzü yeniden tasarlamak ve bağımlılıklarını yeniden düzenlemek). "Singleton" ın yalnızca bir örneğinin olmasının önemli olmadığı durumum için küçük bir değişiklik mükemmeldir, ancak varsayılan olarak herkesin aynı örneği paylaşması önemlidir (değişiklik şu şekildedir: bir fabrika kullanmak yerine statik ortak örneği harici olarak ayarlamak ve bu örneği oluşturma sırasında kullanmak için yöntemler).
meustrus

Yani temelde bu yaklaşımın avantajı, potansiyel olarak bir sürü nesne (ki bunun için Tekil tonları kullanmamayı seçiyorsunuz) yerine yalnızca bir nesne örneğinin (fabrika) etrafında karıştırmanız gerektiğidir.
Hari Honor

9

Spring veya başka herhangi bir IoC-Container bunda oldukça iyi bir iş çıkarır. Sınıflar uygulamanın dışında oluşturulup yönetildiğinden, konteyner basit sınıfları tekil yapabilir ve gerektiğinde bunları enjekte edebilir.


Yukarıda belirtilen konularla ilgili herhangi bir bağlantınız var mı?
CodingWithoutComments

Bu çerçeveler java'ya özgü görünüyor - başka dile özgü seçenekler var mı? Veya dilden bağımsız?
CodingWithoutComments

.NET için: Castle Windsor castleproject.org/container/index.html Microsoft Unity msdn.microsoft.com/en-us/library/cc468366.aspx Unity aslında bir bağımlılık ekleme çerçevesidir, ancak muhtemelen bu konu için çalışacaktır.
Erik van Brakel

1
neden bunun için çok fazla oy yok? IOC, Singleton'dan kaçınmak için mükemmel bir çözümdür.
Sandeep Jindal

@CodingWithoutComments PHP'nin Symfony Service Container'a sahip olduğunu biliyorum. Yakut heriflerin bağımlılık aşılamanın başka yolları da var. İlgilendiğiniz belirli bir dil var mı?
Bevelopper

9

Herhangi bir kalıptan kaçınmak için yolunuzdan çekilmenize gerek yok. Bir desenin kullanımı ya bir tasarım kararı ya da doğal bir uyumdur (sadece yerine oturur). Bir sistem tasarlarken, bir desen kullanma veya kullanmama seçeneğiniz vardır. Ancak, nihayetinde bir tasarım seçimi olan hiçbir şeyden kaçınmak için yolunuzdan çıkmamalısınız.

Singleton Modelinden kaçınmıyorum. Ya uygun ve kullanıyorum ya da uygun değil ve kullanmıyorum. Bunun bu kadar basit olduğuna inanıyorum.

Singleton'ın uygunluğu (veya eksikliği) duruma bağlıdır. Bu, verilmesi gereken bir tasarım kararıdır ve bu kararın sonuçları anlaşılmalıdır (ve belgelenmelidir).


Ben de aynı şeyi söyleyecektim ama bu onun sorusuna tam olarak cevap vermiyor :)
Swati

2
Lütfen uygun olup olmadığını cevabınızda belirtiniz. Pretty Please.
CodingWithoutComments

Soruyu cevaplıyor. Singleton Pattern'i kullanmaktan kaçınmak için tekniklerim yok çünkü bundan kaçınmak için yolumdan çıkmıyorum ve herhangi bir geliştiricinin yapması gerektiğini düşünmüyorum.
Thomas Owens

Uygun olup olmadığını genelleştirebileceğinizi sanmıyorum. Hepsi projeye özeldir ve büyük ölçüde söz konusu sistemin tasarımına bağlıdır. Böyle kararlar için "başparmak kuralları" kullanmıyorum.
Thomas Owens

Hmm. Bunun neden reddedildiğini anlamıyorum. Soruyu cevapladım - Singleton Modelini kullanmaktan kaçınmak için teknikleriniz nelerdir? - tekniklerim olmadığını söyleyerek, çünkü kalıptan kaçınmak için yolumdan çıkmıyorum. Olumsuz oy verenler gerekçelerini detaylandırabilirler mi?
Thomas Owens

5

Monostate (Robert C. Martin's Agile Software Development'da açıklanmıştır), singleton'a bir alternatiftir. Bu modelde sınıfın verileri statiktir ancak alıcılar / ayarlayıcılar statik değildir.

Örneğin:

public class MonoStateExample
{
    private static int x;

    public int getX()
    {
        return x;
    }

    public void setX(int xVal)
    {
        x = xVal;
    }
}

public class MonoDriver
{
    public static void main(String args[])
    {
        MonoStateExample m1 = new MonoStateExample();
        m1.setX(10);

        MonoStateExample m2 = new MonoStateExample();
        if(m1.getX() == m2.getX())
        {
            //singleton behavior
        }
    }
}

Monostate, singleton'a benzer davranışa sahiptir, ancak bunu, programcının bir singleton kullanıldığının farkında olmadığı bir şekilde yapar.


Bu daha fazla oyu hak ediyor; Buraya Google'dan bir MonoState tazeleme aramak için geldim!
mahemoff

@Mark Bana öyle geliyor ki bu tasarımın iş parçacığı güvenliği açısından kilitlenmesi çok zor. MonoStateExample'daki her statik değişken için bir örnek kilidi mi oluşturmalıyım yoksa tüm özelliklerin yararlandığı bir kilit oluşturmalı mıyım? Her ikisinin de bir Singleton modelinde kolayca çözülebilen ciddi sonuçları vardır.
Martin Bliss

Bu örnek, Singleton modeline bir alternatiftir, ancak Singleton modelinin sorunlarını çözmez.
Sandeep Jindal

4

Singleton bir zaman durumlar vardır çünkü modelinin mevcut tek bir nesne hizmetleri kümesi sağlamak için gereklidir .

Durum bu olsa bile, global bir statik alan / özellik kullanarak tekil oluşturma yaklaşımını hala düşünüyorum. , örneği temsil uygunsuz olarak düşünüyorum. Uygun değildir çünkü kodda statik alan ile nesne arasında bir bağımlılık yaratır, nesnenin sağladığı hizmetler değil.

Bu nedenle, klasik, tekli desen yerine, servis verilen konteynerlerde servis 'beğen' modelini kullanmanızı öneririm , burada tekliğinizi statik bir alan üzerinden kullanmak yerine, gerekli servis türünü talep eden bir yöntem aracılığıyla ona bir referans elde edersiniz.

*pseudocode* currentContainer.GetServiceByObjectType(singletonType)
//Under the covers the object might be a singleton, but this is hidden to the consumer.

tek global yerine

*pseudocode* singletonType.Instance

Bu şekilde, bir nesnenin türünü tekilden başka bir şeye değiştirmek istediğinizde, bunu yapmak için kolay zamanınız olacak. Ayrıca ek bir avantaj olarak, her yönteme nesne örneklerinin ayrılmasını sağlamak zorunda değilsiniz.

Ayrıca Kontrolün Tersine Çevrilmesi konusuna bakın tekilleri doğrudan tüketiciye maruz bırakarak, nesne tarafından sağlanan nesne hizmetleri değil, tüketici ile nesne örneği arasında bir bağımlılık yaratırsınız.

Benim fikrim, mümkün olduğunda tekli modelin kullanımını gizlemek , çünkü ondan kaçınmak her zaman mümkün değildir veya arzu edilmez.


Servis verilen konteynerler örneğinizi tam olarak takip etmiyorum. Bağlanabileceğiniz çevrimiçi bir kaynağınız var mı?
CodingWithoutComments

"Kale Projesi - Windsor Konteyneri" castleproject.org/container/index.html sayfasına bir göz atın . Ne yazık ki bu konuyla ilgili soyut yayınlar bulmak çok zor.
Pop Catalin

2

Tek bir veri nesnesini temsil etmek için bir Singleton kullanıyorsanız, bunun yerine bir veri nesnesini bir yöntem parametresi olarak iletebilirsiniz.

(Yine de, bunun bir Singleton kullanmanın ilk etapta yanlış yolu olduğunu iddia ediyorum)


1

Sorununuz durumu korumak istiyorsanız, bir MumbleManager sınıfı istiyorsunuz. Bir sistemle çalışmaya başlamadan önce, müşteriniz, Mumble'ın sistemin adı olduğu bir MumbleManager oluşturur. Devlet bununla korunur. Muhtemelen MumbleManager'ınız durumunuzu tutan bir eşya çantası içerecektir.

Bu tarz bir stil çok C'ye benziyor ve çok nesne gibi değil - sisteminizi tanımlayan nesnelerin hepsinin aynı MumbleManager'a bir referansı olduğunu göreceksiniz.


Singleton lehine veya aleyhine savunmadan, bu çözümün bir anti-model olduğunu söylemeliyim. MumbleManager, Tek Sorumluluğu ihlal ederek her türden farklı bilgiyi içeren bir "Tanrı sınıfı" haline gelir. Tüm uygulama bakımları için bir Singleton da olabilir.
Martin Bliss

0

Düz bir nesne ve fabrika nesnesi kullanın. Fabrika, örneği ve düz nesne ayrıntılarını yalnızca yapılandırma bilgileri (örneğin içerir) ve davranışla denetlemekten sorumludur.


1
Bir fabrika genellikle tekil olmaz mı? Fabrika kalıplarının genellikle bu şekilde uygulandığını görüyorum.
Thomas Owens

0

Aslında Singelton'lardan kaçınmak için sıfırdan tasarlarsanız, statik değişkenler kullanarak Singleton kullanmama konusunda çalışmak zorunda kalmayabilirsiniz. Statik değişkenler kullanırken, aynı zamanda aşağı yukarı bir Singleton oluşturuyorsunuz, tek fark, farklı nesne örnekleri yaratmanızdır, ancak dahili olarak hepsi bir Singleton kullanıyormuş gibi davranır.

Bir Singleton kullandığınız veya şu anda bir Singleton'un kullanıldığı ve onu kullanmaktan kaçınmaya çalıştığınız ayrıntılı bir örnek verebilir misiniz? Bu, insanların durumu bir Singleton olmadan nasıl idare edebilecekleri konusunda daha süslü bir çözüm bulmalarına yardımcı olabilir.

BTW, şahsen Singleton'larla sorunum yok ve diğer insanların Singleton'larla ilgili sorunlarını anlayamıyorum. Onlar hakkında kötü bir şey görmüyorum. Yani, onları kötüye kullanmıyorsanız. Yararlı her teknik kötüye kullanılabilir ve istismar edilirse olumsuz sonuçlara yol açar. Yaygın olarak kötüye kullanılan bir başka teknik kalıtımdır. Yine de kimse mirasın kötü bir şey olduğunu söylemez çünkü bazıları onu korkunç bir şekilde kötüye kullanır.


0

Şahsen benim için tekil gibi davranan bir şeyi uygulamanın çok daha mantıklı bir yolu tamamen statik sınıf (statik üyeler, statik yöntemler, statik özellikler) kullanmaktır. Çoğu zaman bu şekilde uygularım (kullanıcı açısından herhangi bir davranış farklılığı düşünemiyorum)


0

Bence singletonu denetlemek için en iyi yer, sınıf tasarım düzeyinde. Bu aşamada, sınıflar arasındaki etkileşimleri haritalandırabilmeli ve kesinlikle, kesinlikle bir şeyin bu sınıfın yalnızca 1 örneğinin uygulama yaşamının herhangi bir anında var olmasını gerektirip gerektirmediğini görmelisiniz.

Eğer durum buysa, o zaman bir singletonunuz var. Kodlama sırasında kolaylık sağlamak için tekli tonlar atıyorsanız, gerçekten tasarımınızı yeniden gözden geçirmeli ve söz konusu tekilleri kodlamayı bırakmalısınız :)

Ve evet, burada "kaçınma" yerine "polis" demek istediğim kelimedir. Tekli kaçınılması gereken bir şey değildir (aynı şekilde, goto ve global değişkenler de kaçınılması gereken bir şey değildir). Bunun yerine, kullanımını izlemeli ve istediğiniz şeyi etkili bir şekilde yapmak için en iyi yöntem olduğundan emin olmalısınız.


1
Workmad dediğini tamamen anlıyorum. Ve tamamen katılıyorum. Ancak, cevabınız hala sorumu tam olarak cevaplamıyor Bunun başka bir soru olmasını istemedim, "singleton'u kullanmak ne zaman uygundur?" Sadece singletona uygun alternatiflerle ilgileniyordum.
CodingWithoutComments

0

Singleton'ı çoğunlukla "yöntem kapsayıcı" olarak kullanıyorum, hiçbir durum olmadan. Bu yöntemleri birçok sınıfla paylaşmam gerekirse ve örnekleme ve başlatma yükünden kaçınmak istersem, bir bağlam / oturum oluşturur ve oradaki tüm sınıfları başlatırım; oturuma atıfta bulunan her şeyin ayrıca içerdiği "singleton" a erişimi vardır.


0

Yoğun bir şekilde nesne yönelimli bir ortamda (örneğin Java) programlamamış olduğum için, tartışmanın inceliklerini tam olarak bilmiyorum. Ancak PHP 4'te bir singleton uyguladım. Bunu, otomatik olarak başlatılan ve tamamlanmamış ve biraz bozuk bir çerçevede işlev çağrılarının yukarı ve aşağı aktarılması gerekmeyen bir 'kara kutu' veritabanı işleyicisi oluşturmanın bir yolu olarak yaptım.

Tekil kalıpların bazı bağlantılarını okuduktan sonra, onu aynı şekilde tekrar uygulayacağımdan tam olarak emin değilim. Gerçekten ihtiyaç duyulan şey, paylaşılan depolamaya sahip birden çok nesneydi (örneğin, gerçek veritabanı tanıtıcısı) ve bu benim çağrımın dönüştüğü şeydi.

Çoğu desen ve algoritma gibi, tek bir 'sırf havalı olduğu için' kullanmak The Wrong Thing To Do'dur. Bir singleton gibi görünen gerçek bir 'kara kutu' çağrısına ihtiyacım vardı. Ve IMO bu soruyu çözmenin yolu: kalıbın farkında olun, aynı zamanda daha geniş kapsamına ve hangi düzeyde benzersiz olması gerektiğine de bakın.


-1

Ne demek ondan kaçınma tekniklerim nelerdir?

Bundan "kaçınmak" için, bu, tekli modelin doğal olarak uygun olduğu birçok durum olduğunu ve dolayısıyla bu durumları yatıştırmak için bazı önlemler almam gerektiğini ima ediyor.

Ama yok. Tekil kalıbından kaçınmak zorunda değilim. Basitçe ortaya çıkmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.