İ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?
İ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?
Yanıtlar:
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 Helper
kontrolö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 .