2013-01-05 24 views
19

Önceki question'umdan Rails'in her istek için bir denetleyici örneği oluşturduğunu anladım. Bu konu projenin Ben tasarımı ile ilgilidir çünküRaylar neden her istek için bir kontrol cihazı oluşturur?

Sorum şu, üzerinde çalışıyorum:

yapar Raylar her gelen isteği işleme

class SomeController < ApplicationController; end 

yeni bir örneğini oluşturur Neden

? Neden sadece singleton nesnesi yaratmıyorsunuz ve buna istek iletmiyorsunuz? Bu, talep için nesnelerin tahsis edilmesi ve temizlenmesi konusunda kaynakları boşa harcamadığımızdan daha verimli görünüyor?

+1

İyi soru, bu konuda DHH sormalısınız :) Ama asıl nokta başka kesinlikle bir ortam izole etmek olduğunu düşünüyorum. Aksi halde, sistem dağıtım mantığı için daha fazla işlem gücü harcamak zorundadır. imho –

+3

Başka bir isteğin verilerinin üzerine gelme riski olmadığında kod hakkında akıl yürütmek daha kolaydır. –

+0

Hiç sürpriz değil, ama Grails'in de aynı şeyi yaptığı anlaşılıyor. –

cevap

32

yeni kontrolör örneği başlatılırken havai önemsiz olduğunu ve hiçbir yanlışlıkla iki tamamen ilgisiz istekleri arasında devlet orada paylaşılır gelir. İşlemci zamanındaki herhangi bir "tasarruf", yıkıcı hatalar üretme potansiyeli ile dengelenecektir.

kontrolörleri istek özgü durumunu saklamak için olduğunu unutmayın. Denetleyicileri yeniden kullanmak, her eylemin başlangıcında ayarladığınız her @variable sıfırlamasını gerektirir. Aksi takdirde, @is_admin = true gibi bir şey ayarlanıp, hiçbir zaman temizlenemedi. Gerçekte sunacağınız daha az ihmal edilen hatalar, geliştirici zamanına göre çok daha incelikli ve drenaj olacaktır.

Sen hiç kalmadığını optimizasyonlar görüyoruz. Bir şey durumunu korumalı ve istekleri arasında sıfırlamalı ya da yanlışlıkla paylaşılan durumun bu kabusu var. istek arasında kontrolör örneklerini devam ederse, sadece/muhafaza cevap olasılıkla hala her istek için bazı devlet-yönetici sınıfa taze örneğini oluşturmaya olacak bazı alt düzeyine ininceye kadar devlet sıfırlama işi zorluyoruz. Bilgisayarlar böylece bu konuda endişe aslında bir darboğaz olduğunu biliyorum asla kadar tahsis ve kaynakları serbest bırakarak ençok iyi. Bu durumda, her istek için yeni bir kontrolörün başlatılması doğru seçimdir.

Raylar söz konusu olduğunda, @variable = value'u kullanabilmek, kod açıklığı ve kullanılabilirlik puan noktasından büyük bir kazançtır ve bu, istek tamamlandığında bir denetleyicinin her bir örneğini atmayı gerektirir.

+2

Pekala, '@ foo' nun her zaman temizlenmesinin gerekmediği, kontrolörlerin Java servletleri gibi paylaşılmış bir duruma sahip olmaması gerektiği çok fazla değil. Değerleri, Java'daki gibi farklı bir mekanizma (yerliler, istek, vb.) Kullanarak görüntü katmanına geçirirsiniz. Denetleyiciler yalnızca isteğe özel durumu * depolamak içindir, çünkü * istek başına anında oluşturulurlar - denetleyici kavramına özgü değildir; diğer çerçeveler bunu farklı şekilde yapar. Biliyorum, bunu sadece açıklığa kavuşturmak. –

+0

@DaveNewton Evet, buna katılmayı düşündüm, ancak soru performansla ilgili olduğu için, “bir şeylerin istekler arasındaki durumu sıfırlaması gerekir”. Jüt, kontrolör örneklerini koruyarak kazanç * performans * bilmez. Sadece tahsis/tahliye yerini değiştiriyorsun. – meagar

+0

Anlaşıldı ve istek başına daha çok tercih ediyorum: daha az düşünmek. –

İlgili konular