두 컨트롤러간에 공유해야하는 로직이 있다면 어디에 보관해야합니까?


10

두 개의 개별 컨트롤러에 필요한 단일 목적 함수 세트가 있습니다. 지금은 코드가 중복되어 제거하고 싶습니다. 이 코드는 컨트롤러의 일부이며 내 서비스 계층에 속하지 않습니다. 어디에 두시겠습니까?


CakePHP는 컴포넌트라고 부릅니다 : book.cakephp.org/2.0/en/controllers/components.html 어쩌면 그것은 영감입니다.
Luc Franken

답변:


12

당신은 어떤 종류의 논리를 공유하고 있는지 말하지 않았습니다. 요컨대,이 컨트롤러 논리 또는 도우미 기능입니까? 객체 지향 언어에서 이것을 처리하는 두 가지 방법은 상속과 구성입니다. 두 제어기간에 공유 조치가있는 경우 상속이 의미가 있습니다. 구성은 나머지 시간에 의미가 있습니다. 상속을 사용하는 예는 분배기 아래의 원래 답변에 있습니다.

프레임 워크에 따라 유틸리티 클래스 나 도우미 클래스를 갖는 것은 드문 일이 아닙니다. 예를 들어, Java 및 C # 웹 프레임 워크에서 유틸리티 용 패키지 / 네임 스페이스가있을 수 있습니다. Ruby on Rails에서는 Helper컨트롤러와 뷰 사이의 논리를 공유 하는 클래스를 활용할 수 있습니다 . 기본적으로 다음과 같습니다.

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

또는 인스턴스화하는 클래스로 만들 수 있습니다. 위 정적 클래스 패턴의 핵심은 함수를 순수한 함수로 만드는 것입니다. 즉, 작업을 수행해야하는 상태를 전달하고 함수는 시스템의 다른 정적 상태를 참조하지 않습니다.

두 경우 모두 다음과 같이 각 컨트롤러에서 액세스 할 수 있습니다.

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

원래 답변

귀하의 플랫폼이 무엇인지 말하지 않았습니다. 답변에 영향을 줄 수 있습니다. 가정 은 객체 지향 언어이다, 가장 일반적인 방법은 두 컨트롤러 확장하는 기본 클래스를 만드는 것입니다. 예를 들어 Ruby on Rails에는 다음이있을 수 있습니다.

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

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

아이디어를 다른 언어로도 번역 할 수 있습니다. ASP.NET MVC, Apache Wicket, Grails 또는 다른 객체 지향 웹 프레임 워크에서도 동일한 접근 방식이 적용됩니다. 언어가 객체 지향적이 아닌 경우 실제로는 프레임 워크가 최상의 접근 방식 으로 설계되는 방식에 따라 다릅니다 .


3
대안은 별도의 클래스에서 로직을 캡슐화 한 다음 해당 클래스를 인스턴스화하고 두 컨트롤러에서 로직을 호출하는 것입니다.
Kramii

5
그렇습니다 나는 항상 상속보다 구성을 선호합니다
Reno

1
상속 계층을 추가하는 대신 Kramii의 제안을 따르십시오. 그러나 그의 실제 질문은 솔루션에서 그 수업이 어디로 가는지에 대한 것입니다.
아무도

1
기능과 프레임 워크가 무엇인지에 달려 있습니다. 레일에서는 Helper 클래스에 속할 수 있습니다. ASP.NET 또는 Java에서는 해당 유형의 함수에 대한 유틸리티 클래스가있을 수 있습니다. 실제로 컨트롤러에 얼마나 가까이 있어야하는지에 달려 있습니다.
Berin Loritsch

컨트롤러 로직입니다. 나는 단지 두 곳에서 필요합니다. 내가 가진 것은 논리를 한 위치에 배치하는 데 사용하는 확장 클래스입니다.
Erin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.