Mam zestaw funkcji jednego celu, których potrzebuję w dwóch osobnych kontrolerach. W tej chwili mam tylko zduplikowany kod i chcę się go pozbyć. Ten kod jest częścią kontrolera i nie należy do mojej warstwy usług. Gdzie byś to położył?
mvc
code-smell
Erin
źródło
źródło
Odpowiedzi:
Nie powiedziałeś, jaką logikę udostępniasz. Krótko mówiąc, czy ta logika kontrolera czy funkcja pomocnika? Dwie metody radzenia sobie z tym w języku obiektowym to dziedziczenie i kompozycja. Dziedziczenie ma sens, jeśli między dwoma kontrolerami jest akcja wspólna. Kompozycja ma sens przez resztę czasu. Przykład zastosowania dziedziczenia znajduje się w mojej oryginalnej odpowiedzi poniżej dzielnika.
Często zdarza się, że klasa użyteczności lub klasa pomocnicza jest zależna od twojego frameworka. Na przykład w strukturach sieciowych Java i C # możesz mieć pakiet / przestrzeń nazw dla narzędzi. W Ruby on Rails możesz korzystać z
Helper
klasy dzielącej logikę między kontrolerami i widokami. Zasadniczo wyglądałoby to tak:Alternatywnie możesz uczynić z niej klasę, którą tworzysz. Kluczem do powyższego wzorca klasy statycznej jest uczynienie funkcji czystymi funkcjami. Innymi słowy, przekazujesz w dowolnym stanie, który musi wykonać, a funkcja nie odwołuje się do żadnego innego stanu statycznego w systemie.
W obu przypadkach uzyskasz dostęp do każdego z kontrolerów w następujący sposób:
Oryginalna odpowiedź
Nie powiedziałeś, jaka była Twoja platforma, ponieważ może to wpłynąć na odpowiedź. Zakładając , że jest to język zorientowany obiektowo, najczęstszym podejściem jest utworzenie klasy podstawowej, którą rozszerzają oba kontrolery. Na przykład w Ruby on Rails możesz mieć:
Możesz przetłumaczyć ten pomysł na inne języki. To samo podejście będzie działać w przypadku ASP.NET MVC, Apache Wicket, Grails lub niemal każdej innej zorientowanej obiektowo struktury sieciowej. Jeśli twój język nie jest zorientowany obiektowo, to tak naprawdę zależy to od tego, w jaki sposób zaprojektowano framework, aby uzyskać najlepsze podejście.
źródło