2011-01-12 8 views
4

솔루션을 코딩 할 때마다 정적 클래스를 많이 사용하거나 전혀 사용하지 않는 경향이 있습니다. 예를 들어, 최근 프로젝트에서는 여러 문자열을 사용하여 클래스를 보내야했지만 정적이 아닌 유일한 방법은이 데이터 보유 클래스였습니다. 그 밖의 모든 것 (다른 처리 책임을 지닌 꽤 무거운 3 개의 클래스)은 정적이었습니다.정적 수업을 언제 시작해야합니까?

나는 "프로세스 X, 출력 Y"사례에 대해 정적 클래스를 사용하지 말아야 할시기에 대해 필자가 묻는 것은 어떤 입력이라고 생각합니다. 그들이 일하는 동안 항상 그것들을 사용하는 것이 좋습니까? 아니면 제가 확장 성, 플러그인 지원 등과 관련하여 발을 쏘고 있습니까?

여기에 질문하는 것이 좋습니다. 나는 정적 클래스가 "더 나은"것인지 아닌지에 관한 논쟁을 요구하지 않고있다. 단지 그들을 사용하지 말아야 할 때만 입력한다.

+1

가장 먼저 떠오르는 점은 데이터에 필요한 조작이 무엇이든간에 "데이터 보유 클래스"를 만들 수 없다는 것입니다. 이렇게하면 여분의 정적 클래스가 필요하지 않게되고 불필요한 결합을 줄일 수 있습니다. –

+2

이것은 광범위하게 여기에서 이미 다루었습니다. [정적 제네릭 클래스 사용?] (http://stackoverflow.com/questions/2685046/uses-for-static-generic-classes) & [Extension 메서드 대 정적 유틸리티 클래스] (http://stackoverflow.com/questions/4646328/extensions-methods-vs-static-utility-class) – slugster

+1

VS 2008의 코드 분석 도구는 항상 메소드/클래스를 정적으로 유지해야합니다. 인스턴스 데이터가 없거나 사용하지 마십시오. 이 좋은 습관인가? – Polyfun

답변

2

아직도 두 가지 질문이 약간 동일합니다. 정적 클래스에 대한 주요 관심사는 상속 및 액세스 가능성입니다.

정적 클래스 (최악의 경우 공용)를 사용하면 모든 사람이 프로세스와 기능에 액세스 할 수 있습니다. 대부분의 시간은 당신이 원하는 것이 아닙니다. 어떤 객체는 함수에 쉽게 접근 할 수 있고 수정도 쉽습니다. 따라서 의존성 주입을 사용하는 것이 좋습니다. (수정하려는 객체를 매개 변수에 전달하십시오.이 경우에는 process-object입니다.)

다른 사람들이 귀하의 process-object을 조작하지 못하게하려면 어떤 종류의 싱글 톤 패턴 (또는 심지어 싱글 톤 패턴)을 사용하지 않으시겠습니까? 무언가를 수정해야한다면 함수의 매개 변수에 객체를 전달할 수 있습니다. 그런 다음 process-object을 보유한 관리자를 한 명만 가질 수 있습니다. 다른 사람들은 대상에 도달해서는 안됩니다.

정적 클래스도 상속하기 어렵습니다. 정적 메서드를 재정의하는 것은 약간 이상하게 보입니다. 따라서 프로세스가 유일한 프로세스가 아니며 좀 더 구체적인 프로세스가 생성 될 것이라는 확신이 들면 정적 클래스도 피해야합니다.

1

정적 클래스는 일반적으로 작은 데이터 컨테이너 및 일반 메서드에 사용됩니다. 필요하지 않으면 큰 데이터를 포함해서는 안됩니다. 이러한 클래스는 확장 할 수 없습니다.

4

코드의 대부분은 내가 쓰기 :

그래서 난 그냥 거의 모든 것을 객체를 사용하여 테스트 할 수/의존성 주입/IOC의

  • 를 사용하고 mockable 할 필요가있다.

    난 여전히 같은 것들에 대한 정적을 사용합니까 :

    • 확장 방법
    • 상수
    • 도우미/유틸리티 방법 (사전 확장 방법)
    • 운영자 방법
  • 1

    하나의 방법 만있는 경우 정적으로 메소드를 사용하는 것이 좋습니다.이 경우 클래스의 인스턴스를 만드는 것이 거의 의미가 없습니다.

    필드가 다소 작동하도록하려면 정적 속성을 가질 수 있습니다 (예 : global variable). 이것은 일치하는 디자인 패턴입니다. Singleton pattern

    전체 애플리케이션에서 소비해야하는 추적 상태에 정적 속성을 사용합니다. 내 작업 객체에 관련된 나머지 모두를위한

    는 정적 광범위하게 사용 콘크리트로 응용 프로그램을 퍼 팅처럼 만들기

    1

    (분명히 약간의 예외를 제외하고) 갈 수있는 방법입니다. 매우 일반적인 유틸리티/도우미 방법과 같은 매우 특별한 상황을 제외하고는 피해야합니다. 멋진 목록은 djeeg의 이전 답변에 게시되었습니다.

    1

    설명하는 것처럼 정적 클래스를 사용할 경우 가장 큰 문제는 종속성이 고정되어 있다는 것입니다. 클래스 A가 클래스 B의 피처를 사용해야하는 경우이를 명시 적으로 알아야하므로 밀접하게 결합됩니다.

    항상 문제가되는 것은 아니지만 코드가 커짐에 따라 새로운 요구 사항을 수용하기 위해 프로그램의 동작을 변경하는 것이 더 어려워 질 수 있습니다. 예를 들어, 프로그램의 동작을 구성 가능하게하려면 코드에서 명시 적 if/switch가 필요하므로 어렵습니다. 그렇지 않으면 클래스를 인터페이스 및 스왑 구현에 의존하게 만들 수 있습니다.

    간단히 말하자면, 발생할 가능성이있는 문제를 해결하기위한 좋은 해결책으로 잘 알려진 디자인 패턴을 사용하지 못하게하는 것입니다.

    1

    나는 보통 클래스에서 정적 메서드를 사용하지 않도록합니다. 전 세계적으로 일부 데이터에 액세스해야한다면 적어도 클래스를 단일 클래스로 래핑합니다. 큰 프로젝트의 경우 Inversion of Control 컨테이너를 사용하여 "글로벌"인스턴스를 인스턴스화하고 싱글 톤 방식으로 주입하는 것이 좋습니다.

    관련 문제