2012-03-16 6 views
40

Ben bir singleton olarak hareket etme modülü bazlı requireJS faydalanmak için aşağıdaki deseni kullanmayı planlıyor. Classa sınıfları ClassB, classC ve ana dönüş modülünden sınıfın tipi geri kalanı ise, türü 'Classa' bir örneğini döndürür lütfen unutmayın. Bunların hepsi MooTools sınıfına dayanan sınıflardır.requireJS modülünü tekil olarak kullanmak kötü bir uygulamadır mı?

Buradaki fikir, dünya çapında tekil olarak classA'u kullanmaktır, yöntemler yalnızca dolgulardır. Kullanılabilir kabul edilebilir bir modelse herhangi bir düşünce var mı?

bu daha sonraki bir aşamada beni ısırmaya geri gelecek mi? Henüz proje üzerinde r.js'yi çalıştırmayı denemedim, bu yüzden biraz endişeliyim ve bazı tavsiyeleri arayın. çok önceden

// classA.js 
    define([], function() { 
     var classA = new Class({ 

      initialize: function (regionId) { 
       // perform some Initialization. 
       this.data = null; 
      }, 

      doSomething: function(param) { 
       // some thing. 
       this.data = param; 
      } 
     }; 

     return new classA(); 
    }); 

    // classB.js 
    define(["classA"], function(classA) { 
     var classB = new Class({ 

      initialize: function (regionId) { 
       // perform some Initialization. 
      }, 

      doSomethingElse: function() { 
       // some thing. 
       classA.doSomething("Go back to Work Now!"); 
      } 
     }; 

     return classB; 
    }); 


    // classC.js 
    define(["classA"], function(classA) { 
     var classB = new Class({ 

      initialize: function (regionId) { 
       // perform some Initialization. 
      }, 

      doSomethingElse: function() { 
       // some thing. 
       classA.doSomething("Time to Play!"); 
      } 
     }; 

     return classC; 
    }); 


    // main.js 
    define(["classA", "classB", "classC"], function(classA, classB, classC) { 
     var main = new Class({ 

      initialize: function (regionId) { 
       // perform some Initialization. 
       this.b = new classB(); 
       this.c = new classC(); 
      }, 

      doEverything: function() { 
       // some thing. 
       this.b.doSomethingElse(); 
       classA.doSomething("Nap Time!"); 
      } 
     }; 

     return main; 
    }); 

Teşekkür ...

+1

Aynı konuya dokunarak başka bir yazı daha buldum - [link] [http://stackoverflow.com/questions/7708194/dependency-injection-with-requirejs] – Karthik

cevap

37

Hayır, require.js ile singletons kullanılmasına karşı bir sebep düşünemiyorum.

Kişisel modül tanım singleton Excel'e. o da new önlemek mümkün olabilir bir tekil olduğundan bunu yapmak yolu, gayet iyi. Ben yüklemek ve bunu ihraç edecek modülüne

define(function (require) { 
    var singleton = function() { 
     return { 
      ... 
     }; 
    }; 
    return singleton(); 
}); 

ilk require gibi bir şey kullanın. Tektonunuzu gerektiren diğer bir modül, daha önce ihraç edilmiş olanı yeniden kullanacaktır.

+2

Cevabınız için teşekkürler. Yine de, “yeni” den kaçınmanın yararının ne olduğu konusunda net değilim. Ya da, Ben sormalıyım, yukarıdaki senaryoda "yeni" önlemek için neden daha iyi olur? Modül sadece bir kez yüklenir, böylece * yeni * sadece bir kez gerçekleştirilir !? Lütfen yorum yapabilir misiniz? – Karthik

+4

Bir singleton olduğu için, bir nesne değişmezi uygundur. Kuruculara, prototiplere ve ihtiyacınız olan her şeye ihtiyacın yok, eğer bu bir singleon değilse ... – ggozad

+0

Tamam, bu mantıklı. Teşekkürler! – Karthik

6

Bu daha sonra beni ısırmaya geri dönecek mi?

ben burada kabul cevabın desenli başladı, ama benim tek sayfalık JavaScript uygulaması bir ana iş parçacığı dönüşmesini, bir web worker o hesaplamalar bir sürü yapıyordu çünkü ve sayfa duyarlı değildi. Ben web işçinin içine modüllerin bazı ilerlerken

, tuhaf davranışlar vardı. Bunu anlamak için çok zaman harcadım, ama bazı gereksinimlerim modüllerinin (yani singletonlar) iki kez yüklenmekte olduğunu fark ettim.

Öğrendiklerim, ana iş parçacığında ve ayrıca modules that run in a web worker numaralı telefonlarda tek bir modül gerekiyorsa, tekil modülün web çalışanına ikinci kez yükleneceği (ve bu yüzden de tek bir satır olmadığı) olacağı öğrenildi. Bir kopya ana iş parçacığında, diğeri web çalışanında. Eğer singleton değişkenleri depolarsa, iki kopyasınız olur.

İşçi ve ana iş parçacığının ayrı adres alanları olduğu için her şey anlamlıdır (belki de bu yüzden bir downvote aldım?). Cevabını buraya gönderiyorum çünkü birisi requireJ'de herhangi bir uyarı olmadığı için aynı soruna girebilir. Çözüm (benim durumumda) ana ve web çalışanı iş parçacığı arasında modüller karıştırmamaktı. Bu, Java veya C# gibi ortamlarda mutlaka bir sorun olmayan büyük bir tasarım kısıtlaması olabilir.

+0

Bu takibi gönderdiğiniz için teşekkür ederiz. Bunu zamanın farkında olmadan anlamaya çalışmak biraz zaman alabilir. – rorsach