2011-09-14 6 views
6

현재이 프레임 워크는 빠른 개발을 약속하기 때문에 플레이 프레임 워크에서 흥미 롭습니다.많은 정적 기능을 사용하는 부작용이 있습니까?

코드를 볼 때 너무 많은 정적 코드가 있습니다. 심지어 컨트롤러가 정적 함수로 선언되었습니다. 따라서 정적 함수 내에서 호출 된 모든 코드는 정적 인 정적이어야합니다.

제 질문은이 접근법이 맞습니까? 많은 정적 함수를 사용하여 부작용이 있습니까?

+0

정적 메서드는 인수로 전달되는 정적 메서드가 아닌 정적 메서드 또는 정적 필드 또는 개체에서 호출 할 수 있습니다. 인스턴스없이 동일한 클래스의 비 정적 메서드를 호출 할 수 없습니다. –

+0

@Peter : 좀 더 자세하게 설명해 주시겠습니까 – indrap

답변

7

개체 지향 언어의 정적 메서드에 대한 몇 가지 사실 : 모든 정적 메서드를 사용하도록 선택하면 문제를 설명하려고 노력하겠습니다.

모든 정적 함수를 사용하는 것은 객체 지향 언어에서 관용적이지 않을 수 있습니다. 하위 클래스의 정적 함수를 재정의 할 수 없습니다. 따라서 재정의를 통해 런타임 다형성을 수행 할 수있는 능력을 잃게됩니다.

모든 변수는 자동으로 (모든 메소드가 정적이므로) 클래스 변수가되므로 본질적으로 인스턴스와 연결된 상태가 없습니다.

정적 방법은 모의하기가 어렵습니다. PowerMock과 같은 프레임 워크가 필요할 수도 있습니다. 따라서 테스트가 어려워집니다.

클래스가 있고 인스턴스가 없으므로 변경할 수없는 클래스를 만들 수 없으므로 디자인이 약간 복잡해집니다. 따라서 스레드 안전 클래스를 설계하는 것은 어려워집니다.

+0

테스트를 위해 Play Framework에서 JUNIT4와 Selenium을 사용하십시오.나는 단위 테스팅과 리그 레션 테스팅을 만드는 데 충분하다고 생각한다. – indrap

+0

"쓰레드 안전 클래스를 설계하는 것은 어렵다"라고 코멘트를 기반으로하면, 엔터프라이즈 애플리케이션에서 플레이 프레임 워크를 사용하는 것이 좋지 않을까요? – indrap

+0

내가 분명히하자. 불변의 클래스를 설계하는 것은 동기화를 도입 할 필요없이 스레드로부터 안전한 클래스를 설계하는 방법입니다. 물론 객체에 대한 상태 변경이 필요할 때 클래스의 새 인스턴스를 만들어야합니다. 예를 들어, String 클래스를 보자. 그러나 메소드가 모두 정적이고 클래스 변수가 모두 클래스 변수 인 경우 인스턴스가 없기 때문에 변경 불가능한 클래스는 문제가되지 않습니다. 정적 메서드 만 가진 클래스는 스레드로부터 안전하지 못하다는 말은하지 않았습니다. – Aneesh

-3

예 너무 많은 정적 함수 나 변수를 사용하면 부작용이 있습니다. 불필요한 정적 선언은 피해야합니다.

정적 멤버는 클래스가 JRE에로드되면 항상 메모리 공간을 생성하기 때문에. 클래스의 객체를 만들지 않더라도 메모리를 차지합니다.

+0

컨트롤러는 정적 클래스를 사용하므로 내부의 컨트롤러를 호출 한 모든 함수 나 클래스는 정적이어야합니다.이 경우에는 정적 사용이 필요합니다. – indrap

+3

이 답변이 잘못되었습니다. 정적 메서드는 인스턴스 메서드보다 더 많거나 적은 공간을 사용합니다. 그리고 클래스의 인스턴스가 만들어 지는지 여부는 아무런 차이가 없습니다. –

+0

OP는 static _fields_가 아닌 static _functions_에 대해 질문합니다. 정적 필드는 클래스가로드되는 즉시 공간을 할당하지만 인스턴스 필드는 인스턴스가 만들어 질 때까지 할당되지 않습니다 (그러나 정적 필드에 할당 된 메모리는 한 번만 할당되지만 인스턴스 필드는 _every_ 인스턴스에 대해 추가 메모리를 할당합니다). @stephenc 노트와 마찬가지로, 메서드에는 아무런 차이가 없습니다. – Chadwick

1

내 의견에 대해 자세히 설명합니다.

정적 메서드는 인스턴스가 있으면 정적 메서드를 호출 할 수 있습니다.

class A { 
    public void nonStaticMethod() { } 

    public static void staticMethod(String text) { 
     // calls non-static method on text 
     text.length(); 
     // calls non-static method on new Object 
     new Object().hashCode(); 
     // calls non static method on a instance of A 
     new A().nonStaticMethod(); 
    } 
} 
+1

나는 당신을 지적합니다, 고마워요. google guice를 사용하여 객체 인스턴스를 만든 다음 컨트롤러에 정적이 아닌 함수를 사용할 수 있습니다. – indrap

17

이 질문은 이전에 비슷한 방식으로 질문되었습니다. 간단한 대답은 Play가 합리적인 곳에서 정적을 사용한다는 것입니다.

HTTP 모델은 OO 모델이 아닙니다. HTTP 요청 자체는 상태 비 저장이므로 정적 메서드를 사용하면 클라이언트 코드의 기능 요청으로 컨트롤러에 액세스 할 수 있습니다.

한편 모델 클래스는 순수 OO이며 결과적으로 정적 무거움이 아닙니다. findAll이나 findById와 같은 유틸리티 메소드의 일부는 정적이지만 이것들은 다시 statefull이 아니며 클래스의 유틸리티 메소드입니다. 나는 어쨌든 이것을 표준 OO 모델에서 기대할 것이다.

따라서 Play에서 기대하는 방식으로 일할 때 위험이 있다고 생각하지 않습니다. 그것은 이상하게 보일 수 있습니다. 왜냐하면 그것은 표준에 도전하기 때문입니다. 그러나 그것은 건전한 이유 때문에 그렇게합니다.

+4

이것은 Play Framework에만 적용되는 정답입니다. – Ryan

+1

Play Framework 요리 책 15 페이지에서 작성자가이 문제를 매우 잘 처리 한 것을 보여줍니다 (play.classloading. enhancers.ControllerEnhancer) – indrap

+1

실제로 그랬습니다. Guillaume은 매우 현명한 사람이고 Play 팀은 Play 구조를 매우 잘 디자인했습니다. – Codemwnci

관련 문제