문제

정적 클래스는 나쁜 연습으로 간주됩니까? 나는 며칠 전에 이것에 관한 기사를 읽었습니다 (찾을 수 없음, 죄송합니다)은 기본적으로 정적 클래스 (특히 '도우미'수업)가있는 것이 일반적으로 나쁜 코드의 징후라고 말했습니다. 이것이 맞습니까? 그렇다면 어떤 이유로니까?

도움이 되었습니까?

해결책

정적 계급의 남용은 나쁜 관행으로 간주 될 수 있습니다. 그러나 어떤 언어 기능도 남용 할 수 있습니다.

정적 메소드 만있는 비 정적 클래스와 정적 클래스를 구분하지 않습니다. 정적 클래스가 컴파일러가 개발자의 의도를 시행 할 수 있다는 점을 제외하고는 효과적으로 동일한 것입니다 (이 클래스를 인스턴스화하지 않고 기능에 액세스하기위한 편리한 구문. ).

당신이 말했듯이, "헬퍼"클래스의 확산은 당신을 곤경에 빠뜨릴 수 있습니다 (설계, 유지 가능성, 가독성, 발견 가능성, 기타 능력 ...). 여기에 논쟁이 없습니다. 그러나 "도우미"클래스가 절대 적절한? 나는 그것을 의심한다.

실제로, 정적 클래스의 책임있는 사용은 코드에 큰 이점을 얻을 수 있습니다.

  • 그만큼 Enumerable 정적 클래스는 대부분의 사람들이 사랑에 빠진 연장 방법을 제공합니다. 특정 유형의 인스턴스와 관련이없는 논리적 인 기능 / 비즈니스 로직 세트입니다.
  • 환경/상황에서 제공하는 서비스 : 예 : 로깅, 구성 (때로는)
  • 다른 사람들 (지금은 생각할 수없는 것 :))

따라서 일반적으로 나쁜 연습이 아닙니다. 현명하게 사용하십시오 ...

다른 팁

"정적 클래스의 사용이 잘못되었습니다"(기사가 잘못되었습니다) 또는 "정적 클래스가 종종 잘못 쓰여진 코드에서 발견됩니다"(이 경우 정적 클래스 자체가 나쁘다는 말은 아니지만, 그들은 그 의미가 아닙니다. 때때로 잘못 사용됩니다)

정적 함수는 객체를 사용하거나 '이'포인터를 메소드 호출로 전달할 필요가 없기 때문에 정적이 아닌 것보다 효율적입니다.

글로벌 변수를 보유하기 위해 정적 클래스를 사용하는 것은 다른 문제입니다.이 경우 근본적인 규칙은 "정적이 나쁘다"는 것이 아니라 "글로벌이 나쁘다"는 것입니다.

일반적인 주장은 정적 클래스에서 변이 가능한 상태를 유지하고 기본적으로 그것들을 글로벌 변수로 사용하는 것에 대한 것이라고 생각합니다. 정적 클래스에서 정적 헬퍼 방법에는 아무런 문제가 없습니다.

그리고 글로벌 변수가 왜 나쁜지에 관해서는 여기와 Google 사이에서 50 만 페이지와 블로그 게시물을 찾을 수 있다고 확신합니다.

아니, 정말 맞지 않습니다.

객체의 인스턴스에만 해당되지 않고 상태가 필요하지 않은 많은 기능이 있습니다. 예를 들어 '수학'기능을 고려하십시오.

거의 모든 언어에는 다음과 같은 것이 있습니다.

y = Math.round(x);

따라서 '라운드'기능은 정적입니다. 당신이 미쳤다면 (c#)와 같은 것을 논쟁 할 수 있습니다.

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

그러나 IMHO, 당신은 그렇게하는 것이 조금 이상 할 것입니다.

확실히 너무 많은 정적 함수가 무언가 잘못되었다는 징후 인 시간이 있지만, 이유에서는 '나쁜'것이 아닙니다.

다음은 정적 메소드가 코드 테스트 가능성을 해칠 수있는 이유와 정적 클래스의 나쁜 부분이 구성 요소 간의 모든 종류의 놀라운 커플 링 및 상호 작용을 소개하는 이유에 대한 일부 Google 테스트 블로그 게시물에 대한 링크입니다.

OO에 대해 생각하는 방법

싱글 톤

정적 메토드-죽음에서 테스트 가능성

모든 방법이 정적 인 유틸리티 클래스가있는 곳에 필요합니다. 이 경우 클래스를 정적으로 만드는 경우 의도를 명확하게 나타냅니다. 그리고 적어도 C#에서는 정적 클래스 내에 비 정적 메소드를 가질 수 없습니다.

나는 정적 유틸리티 클래스를 내 코드에서 항상 자주 호출하지만 주입하기위한 고통이 될 수있는 방법을 사용합니다. 예는 다음과 같은 간단한 로깅 클래스입니다.

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

이제는 결코 이러한 클래스와 방법이 전 세계적으로 어떤 종류의 글로벌 상태를 저장하지는 않습니다. 왜냐하면 그것은 큰 동시 문제로 이어질 수 있으며 일반적으로 디자인이 좋지 않습니다.

따라서 정적 클래스를 피하지 마십시오. 정적 클래스가 일종의 글로벌 상태를 유지하는 것을 피하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top