2012-02-06 2 views
1

Front Controller 역할을하는 Java 서블릿을 작성하고 있습니다. 기능을 수행하려면 도메인 명령 패턴을 사용하고 있습니다. 현재 모든 명령을 초기화하고 명령의 이름 (문자열)을 키로, 개체를 값으로 맵에 저장하고 있습니다. 서블릿이 요청을 수신 할 때마다, 나는 같은 URL에서 명령 쿼리를 전달하여지도에서 명령을받을 :서블릿 및 명령 패턴, 런타임과 비교하여 컴파일 하시겠습니까?

// at init 
Hashmap<String, DomainCommand> commands = new Hashmap<String, DomainCommand>(); 
commands.put("someCommand", new SomeCommand()); 

// at request 
String command = request.getParameter("command"); 
DomainCommand c = commands.get(command); 
c.execute(); 

이 잘 작동하고 내 DomainCommands 더 클래스는 스레드간에 공유 할 수 속성을하지 갖고 있기 때문에 내가 원하는 것을 . 이에 대한 대안으로 리플렉션을 사용하여 다음과 같이 객체를 생성 할 수 있습니다.

String command = request.getParameter("command"); 
DomainCommand c = Class.forName(command).newInstance(); // assuming in same (default) package 
c.execute(); 

두 가지 모두 작동합니다. 어떤 성능/메모리 절약의 관점에서 더 나은 무엇입니까?

답변

3

성능

유일한 비용이 HashMap (미미)에 액세스한다 Map을 사용. 반면에 반사는 시간이 많이 걸리고 안전하지 않을 수 있습니다. 사용자가 가짜 command을 넘지 않아야하므로 임의의 코드를 실행할 수 있습니다.

메모리

그들은 따라서 대부분의 시간에 대한 가비지 컬렉션의 대상이되지 않는, 잠시 후 오래된 세대에 끝날 것입니다 시작시 를 작성. 요청 당 생성 될 가능성이 가장 높은 나머지는 즉시 가비지 수집됩니다. 따라서 전반적으로 두 번째 접근법은 mor GC 실행을 요구한다는 점을 제외하고는 메모리 공간이 비슷합니다.

전체적으로 명령 맵이 훨씬 더 나은 접근 방법입니다. BTW, Spring이나 Guice 같은 DI 프레임 워크 (Struts/Spring MVC 같은 웹 프레임 워크)는 똑같은 작업을 수행합니다.

+0

학교 프로젝트이므로 대부분의 기능을 직접 구현해야하지만 내 질문에 대한 답변을 주셔서 감사합니다. –

1

HashMap에 명령을 저장하는 첫 번째 방법이 더 좋습니다. 두 번째 방법의 문제점은 명령을 실행할 때마다 명령 클래스를로드해야한다는 것입니다.

사실 프레임 워크는 Struts와 유사합니다. 컨트롤러와 서블릿을 컨트롤러로 사용하여 커맨드 패턴을 정확하게 지정하고 개별 액션 클래스를 명령으로 사용합니다.

1

성능 측면에서 언급 한 첫 번째 접근 방식은 확실히 빠릅니다.

다음 옵션은 어떻습니까?

  1. 이 명령 콩을 저장하고 JNDI에 (요청에서) 이름으로 명령 콩에 대한 조회를 할 명령 Visitor 패턴을 사용하여
  2. (JNDI에서 명령을 검색하는 서비스를) 모든 명령 빈이 컨테이너 시작에서 초기화되고 명령 조회가 응용 프로그램 컨텍스트에서 수행되는 IoC 프레임 워크 (Spring)

성능면에서 나는 3 번째 옵션을 선호합니다.

0

두 옵션을 병합하는 것은 어떻습니까?

Struts는 똑같은 기능을합니다.Servlet에 의해 요청 된 모든 명령을 캐시하는 Map을 포함합니다. 명령이 존재하지 않으면 생성 한 옵션 2처럼 명령의 newInstance()을 작성합니다.

이점은 프로세스를보다 신속하게 실행할 수 있다는 점입니다. 캐시에서 명령을 검색하고 그렇지 않으면 새 명령을 &으로 만들고 캐시에 저장합니다. 옵션 2보다 확실히 빠릅니다.

1

성능/메모리 절약 측면에서 구체적으로 답변을 요청했는데 다른 답변이 해당 답변에 해당합니다. 나는이 점에서 Map 접근법이 아마도 더 나을 것이라는 것에 동의한다.

그러나이 점을 염려하기 전에이 점도 고려해야합니다. 나는 서블릿에 대한 하나의 호출에 대한 네트워크 오버 헤드가 짧은 문자열의 단일 HashMap 조회를 훨씬 능가한다고 가정하고있다.

더 큰 관심사는 명확성과 유지 보수성입니다. 뿐만 아니라 이러한 점에서, 나는지도 방식이 훨씬 우수한 것을 말할 것 같은 것이 :

  • 구현에 API (명령 매개 변수의 유효한 값)를 묶어하지 않습니다 (클래스 이름)
  • 어떤 클래스를 명령으로 사용할지, 어떤 클래스를 사용하지 않을지를 명확하게 만듭니다 (나중에 변경하려는 경우 매우 중요 함)
  • API를보다 유연하게 사용할 수 있습니다 (예 : 명령 매개 변수를 대문자와 소문자를 구별하지 않는지, 같은 클래스에 복수의 커멘드가 매핑되고있는 경우)

Zen of Python : "Explicit is implicit than"을 인용하십시오.