İki denetleyici arasında paylaşılması gereken bir mantığınız varsa, nerede tutuyorsunuz?


10

İki ayrı denetleyicide ihtiyacım olan bir dizi tek amaçlı işlevim var. Şu anda sadece yinelenen kod var ve ondan kurtulmak istiyorum. Bu kod denetleyicinin bir parçasıdır ve hizmet katmanıma ait değil. Nereye koymak istiyorsunuz?


CakePHP onları Bileşenler olarak adlandırıyor: book.cakephp.org/2.0/en/controllers/components.html belki bu biraz ilham kaynağı.
Luc Franken

Yanıtlar:


12

Ne tür bir mantık paylaştığınızı söylemediniz. Kısacası, bu kontrolör mantığı mı yoksa bir yardımcı fonksiyon mu? Bununla nesne yönelimli bir dille başa çıkmanın iki yöntemi kalıtım ve kompozisyondur. Kalıtım, iki denetleyici arasında paylaşılan bir eylem olup olmadığı mantıklıdır. Kompozisyon zamanın geri kalanını anlamlandırır. Kalıtım kullanma örneği bölücünün altındaki orijinal yanıtımda yatıyor.

Çerçevenize bağlı olarak bir yardımcı sınıf veya yardımcı sınıf olması nadir değildir. Örneğin, Java ve C # web çerçevelerinde yardımcı programlar için bir paket / ad alanınız olabilir. Ruby on Rails'te Helperkontrolörler ve görünümler arasında mantığı paylaşan sınıftan faydalanıyor olabilirsiniz . Temel olarak, şöyle görünecektir:

// NOTE: group similar functions
static class LoginUtility
{
    static bool IsLoggedIn(Request request) { /* ... */ }
}

Alternatif olarak, bunu başlattığınız bir sınıf haline getirebilirsiniz. Yukarıdaki statik sınıf modelinin anahtarı, işlevlerinizi saf işlevler haline getirmektir. Başka bir deyişle, işini yapması gereken herhangi bir duruma geçersiniz ve işlev sistemdeki diğer statik durumlara başvurmaz.

Her iki durumda da, denetleyicilerinizin her birinde şu şekilde erişirsiniz:

void MyAction()
{
    if (LoginUtiltiy.IsLoggedIn(Request))
    {
        // Do something ...
    }
}

Orijinal Yanıt

Platformunuzun ne olduğunu söylemediniz, çünkü bu cevabı etkileyebilir. Nesneye yönelik bir dil olduğu varsayılarak , en yaygın yaklaşım her iki denetleyicinin de genişlettiği bir temel sınıf oluşturmaktır. Örneğin, Ruby on Rails'da sahip olabileceğiniz:

class BaseController < ApplicationController
    def my_special_function
        # ...
    end
end

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

Fikri başka dillere de çevirebilirsiniz. Aynı yaklaşım ASP.NET MVC, Apache Wicket, Grails veya herhangi bir nesne yönelimli web çerçevesi için de işe yarayacaktır. Diliniz nesne yönelimli değilse, çerçevenin en iyi yaklaşım için nasıl tasarlandığına gerçekten bağlıdır .


3
Alternatif, mantığı ayrı bir sınıfta kapsüllemek, daha sonra bu sınıfı başlatmak ve her iki denetleyiciden de mantığı çağırmaktır.
Kramii

5
Evet her zaman miras yerine kompozisyonu tercih ederim
Reno

1
Ek bir miras katmanı eklemek yerine Kramii'nin önerisini yapın. Ama bence asıl sorusu bu sınıfın çözümde nereye gittiğiydi.
Kimse

1
İşlev ve çerçevenin ne olduğuna bağlıdır. Raylarda, Helper sınıfına ait olabilir. ASP.NET veya Java'da, bu tür işlevler için bir yardımcı program sınıfınız olabilir. Gerçekten, denetleyiciye ne kadar yakın yaşaması gerektiğine bağlı.
Berin Loritsch

Kontrolör mantığı. Sadece iki yerde ihtiyacım var. Şimdi ne var bir yerde mantığı koymak için kullandığım bir uzantı sınıfı.
Erin
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.