문제

이 질문에는 이미 답변이 있습니다.

여기에 내용이 있습니다 MSDN은 다음과 같이 말해야 합니다. 정적 클래스를 사용하는 경우:

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}

특정 객체와 관련이없는 메소드에 대한 정적 클래스를 구성 단위로 사용하십시오.또한 정적 클래스는 메소드를 호출하기 위해 객체를 만들 필요가 없기 때문에 구현을 더 간단하고 빠르게 만들 수 있습니다.시스템 네임 스페이스에서 수학 클래스의 방법과 같은 의미있는 방식으로 클래스 내부의 메소드를 구성하는 것이 유용합니다.

나에게 있어서 그 예는 정적 클래스에 대해 가능한 많은 사용 시나리오를 다루지 않는 것 같습니다.과거에는 상태 비저장 관련 함수 모음에 대해 정적 클래스를 사용했지만 그게 전부입니다.그렇다면 어떤 상황에서 클래스를 정적으로 선언해야 합니까(하지 말아야 합니까)?

도움이 되었습니까?

해결책

나는 이전 스택 오버플로 답변에서 정적 클래스에 대한 내 생각을 썼습니다.단일 메소드를 사용한 클래스 - 최선의 접근 방식은 무엇입니까?

나는 정적 메서드로 가득 찬 유틸리티 클래스를 좋아했습니다.그들은 중복성과 유지 관리 문제를 야기할 수 있는 도우미 메서드를 크게 통합했습니다.사용하기 매우 쉽고, 인스턴스화도 없고, 폐기도 필요 없으며 그냥 실행하고 잊어버리면 됩니다.나는 이것이 서비스 지향 아키텍처를 만들기 위한 나의 첫 번째 무의식적인 시도라고 생각합니다. 많은 무상태 서비스는 단지 자신의 역할만 수행했을 뿐 다른 것은 아무것도 없습니다.그러나 시스템이 성장함에 따라 드래곤이 등장합니다.

다형성

즐겁게 윙윙거리는 UtilityClass.SomeMethod 메서드가 있다고 가정해 보겠습니다.갑자기 기능을 약간 변경해야 합니다.대부분의 기능은 동일하지만 그럼에도 불구하고 몇 가지 부분을 변경해야 합니다.정적 메서드가 아니었다면 파생 클래스를 만들고 필요에 따라 메서드 내용을 변경할 수 있었습니다.정적 메서드이므로 그렇게 할 수 없습니다.물론, 이전 메서드 앞이나 뒤에 기능을 추가해야 한다면 새 클래스를 만들고 그 안에서 이전 클래스를 호출할 수 있습니다. 하지만 그건 역겹습니다.

인터페이스 문제

논리적인 이유로 인터페이스를 통해 정적 메서드를 정의할 수 없습니다.그리고 정적 메서드를 재정의할 수 없기 때문에 정적 클래스는 인터페이스를 통해 전달해야 할 때 쓸모가 없습니다.이로 인해 정적 클래스를 전략 패턴의 일부로 사용할 수 없게 됩니다.우리는 다음과 같이 몇 가지 문제를 패치할 수도 있습니다. 인터페이스 대신 대리자 전달.

테스트

이는 기본적으로 위에서 언급한 인터페이스 문제와 밀접하게 연관되어 있습니다.구현을 상호 교환하는 능력이 매우 제한되어 있으므로 프로덕션 코드를 테스트 코드로 바꾸는 데에도 어려움이 있습니다.다시 말하지만, 이를 마무리할 수 있지만 실제 객체 대신 래퍼를 허용하려면 코드의 많은 부분을 변경해야 합니다.

블롭을 육성합니다.

정적 메서드는 일반적으로 유틸리티 메서드로 사용되며 유틸리티 메서드는 일반적으로 서로 다른 목적을 가지므로 일관되지 않은 기능으로 가득 찬 큰 클래스가 빨리 끝나게 됩니다. 이상적으로는 각 클래스가 시스템 내에서 단일 목적을 가져야 합니다.목적이 잘 정의되어 있는 한 수업을 5배로 늘리는 것이 좋습니다.

매개변수 크리프

우선, 작고 귀엽고 순진한 정적 메서드는 단일 매개 변수를 사용할 수 있습니다.기능이 향상됨에 따라 몇 가지 새로운 매개변수가 추가됩니다.곧 선택적인 추가 매개변수가 추가되므로 메소드의 오버로드를 생성합니다(또는 이를 지원하는 언어로 기본값을 추가하기만 하면 됩니다).머지않아 10개의 매개변수를 사용하는 메서드가 생겼습니다.실제로는 처음 3개만 필수이며 매개변수 4~7은 선택사항입니다.하지만 매개변수 6을 지정하면 7~9도 채워야 하는데...이 정적 메서드가 수행하는 작업을 수행한다는 단일 목적으로 클래스를 만들었다면 생성자에서 필수 매개 변수를 가져오고 사용자가 속성을 통해 선택적 값을 설정하거나 메서드에서 여러 상호 의존적 값을 설정할 수 있도록 하여 이 문제를 해결할 수 있습니다. 동시.또한 메소드가 이 정도로 복잡해지면 어쨌든 자체 클래스에 있어야 할 가능성이 높습니다.

소비자에게 아무 이유 없이 클래스 인스턴스를 생성하도록 요구

가장 일반적인 주장 중 하나는 다음과 같습니다.왜 우리 클래스의 소비자가 이 단일 메소드를 호출하기 위한 인스턴스를 생성하도록 요구하면서 이후에는 인스턴스를 사용하지 않습니까?클래스의 인스턴스를 생성하는 것은 대부분의 언어에서 매우 저렴한 작업이므로 속도는 문제가 되지 않습니다.소비자에게 추가 코드 줄을 추가하는 것은 향후 훨씬 더 유지 관리하기 쉬운 솔루션의 기반을 마련하는 데 있어 비용이 적게 듭니다.마지막으로, 인스턴스 생성을 피하려면 쉽게 재사용할 수 있는 클래스의 싱글톤 래퍼를 생성하면 됩니다. 하지만 이렇게 하면 클래스가 상태 비저장이라는 요구 사항이 적용됩니다.상태 비저장이 아닌 경우에도 장기적으로 모든 이점을 제공하면서 모든 것을 처리하는 정적 래퍼 메서드를 만들 수 있습니다.마지막으로 인스턴스화를 싱글톤인 것처럼 숨기는 클래스를 만들 수도 있습니다.MyWrapper.Instance는 방금 반환하는 속성입니다. new MyClass();

오직 Sith만이 절대적인 것을 다룹니다.

물론, 정적 메서드를 싫어하는 데에는 예외가 있습니다.팽창 위험이 없는 진정한 유틸리티 클래스는 정적 메서드(예: System.Convert)의 훌륭한 사례입니다.프로젝트가 향후 유지 관리에 대한 요구 사항이 없는 일회성인 경우 전체 아키텍처는 실제로 그다지 중요하지 않습니다. 정적이든 비정적이든 별로 중요하지 않습니다. 그러나 개발 속도는 중요합니다.

표준, 표준, 표준!

인스턴스 메서드를 사용해도 정적 메서드를 사용하는 것이 금지되지 않으며 그 반대도 마찬가지입니다.차별화 뒤에 추론이 있고 표준화되어 있는 한.다양한 구현 방법으로 퍼져 있는 비즈니스 계층을 살펴보는 것보다 더 나쁜 것은 없습니다.

다른 팁

클래스 정적 또는 비 정적을 만들지 여부를 결정할 때 어떤 정보를 나타내려고하는지 살펴 봐야합니다. 이것은 더 많은 것을 수반합니다.상향식'먼저 대표하는 데이터에 집중하는 프로그래밍 스타일. 당신이 바위처럼 실제 대상을 쓰는 클래스입니까? 이러한 것들은 물리적이며 색상, 무게와 같은 물리적 속성을 가지고있어 속성이 다른 여러 객체를 인스턴스화하고 싶을 수 있습니다. 나는 동시에 검은 의자와 빨간 의자를 원할 수 있습니다. 두 개의 구성이 동시에 필요한 경우 각 객체가 고유하고 동시에 존재할 수 있도록 객체로 인스턴스화하고 싶다는 것을 즉시 알 수 있습니다.

다른 한편으로, 정적 함수는 실제 객체 나 쉽게 표현할 수있는 객체에 속하지 않는 행동에 더 많이 빌려주는 경향이 있습니다. C#의 전임자는 C ++ 및 C이며 클래스에 존재하지 않는 글로벌 기능 만 정의 할 수 있습니다. 이것은 더 많은 것을 빌려줍니다.위에서 아래로'프로그래밍. '개체'가 작업을 수행하는 것이 합리적이지 않은 경우 이러한 경우에는 정적 메소드를 사용할 수 있습니다. 클래스를 사용하도록하면 관련 기능을 쉽게 그룹화 할 수 있으므로보다 유지 관리 가능한 코드를 작성하는 데 도움이됩니다.

대부분의 클래스는 정적 또는 비 정적으로 표현 될 수 있지만 의심 스럽을 때 OOP 뿌리로 돌아가서 자신이 대표하는 것을 생각하려고 노력하십시오. 이것은 액션을 수행하는 객체 (속도를 높이고, 느리게하고, 회전 할 수있는 자동차) 또는 더 추상적 인 것 (출력 표시와 같은)입니다.

내면의 OOP와 연락을 취하면 결코 잘못 될 수 없습니다!

C# 3.0의 경우 확장 방법은 최상위 정적 클래스에서만 존재할 수 있습니다.

코드 분석 도구를 사용하는 경우 (예 : fxcop), 방법을 표시하는 것이 좋습니다. static 해당 메소드가 인스턴스 데이터에 액세스하지 않으면 이론적 근거는 성능 이득이 있다는 것입니다. MSDN : CA1822- 마크 멤버를 정적으로 표시하십시오.

그것은 규칙보다 가이드 라인에 가깝습니다.

나는 공장에 정적 클래스를 사용하는 경향이 있습니다. 예를 들어, 이것은 내 프로젝트 중 하나의 로깅 클래스입니다.

public static class Log
{
   private static readonly ILoggerFactory _loggerFactory =
      IoC.Resolve<ILoggerFactory>();

   public static ILogger For<T>(T instance)
   {
      return For(typeof(T));
   }

   public static ILogger For(Type type)
   {
      return _loggerFactory.GetLoggerFor(type);
   }
}

IOC가 정적 액세서로 호출된다는 것을 알았을 수도 있습니다. 대부분 나에게 수업에서 정적 메소드를 호출 할 수 있다면, 그게 당신이 할 수있는 전부입니다.

정적 클래스는 매우 유용하며 라이브러리와 같은 장소가 있습니다.

내가 제공 할 수있는 가장 좋은 예는 수학 기능 라이브러리를 포함하는 시스템 네임 스페이스 정적 클래스 인 .NET Math 클래스입니다.

그것은 다른 어떤 것과 유사하고, 작업에 적합한 도구를 사용하며, 아무것도 남용 할 수 없다면.

정적 클래스를 틀린 것으로 비워 주거나, 사용하지 말고, "하나만있을 수 있습니다"라고 말하는 것은 그들을 사용하는 것만 큼 잘못된 것입니다.

C#.net에는 수학 클래스와 마찬가지로 사용되는 여러 정적 클래스가 포함되어 있습니다.

따라서 올바른 구현이 주어지면 엄청나게 유용합니다.

우리는 여러 비즈니스 관련 시간대 기능을 포함하는 정적 시간대 클래스를 가지고 있으며, 수학 클래스와 매우 유사한 클래스의 여러 인스턴스를 만들 필요가 없습니다. .

재사용 단위로 클래스가 아닌 함수를 사용하고 싶을 때 정적 클래스를 사용하기 시작했습니다. 이전에는 정적 계급의 악에 관한 것이 었습니다. 그러나 학습 에프# 새로운 빛으로 그들을 보게 만들었습니다.

이것 란 무엇을 의미합니까? 글쎄, 슈퍼를 할 때 마른 코드, 나는 한 메드 클래스로 끝납니다. 이 방법을 정적 클래스로 끌어 당긴 다음 대의원을 사용하여 종속성에 주입 할 수 있습니다. 이것은 또한 내와 잘 어울립니다 의존성 주입 (di) 선택 자동 컨테이너.

물론 정적 방법에 대한 직접적인 의존성은 여전히 대개 악 (비정규 용도가 있습니다).

주어진 유형의 객체가 특정 컨텍스트에서 사용할 수 있도록 "추가 기능"을 정의하는 수단으로 정적 클래스를 사용합니다. 일반적으로 그들은 유틸리티 클래스로 판명됩니다.

그 외에는 "정적 클래스를 특정 객체와 관련이없는 메소드의 구성 단위로 사용합니다"라고 생각합니다. 의도 된 사용법을 잘 설명하십시오.

이것은 OOP가 시작된 이후의 또 다른 오래되었지만 매우 뜨거운 질문입니다. 정적 클래스를 사용하는 데 많은 이유가 있으며, 물론 대부분의 답변으로 다루었습니다.

나는이 클래스가 시스템에서 독특 할 때 클래스 정적을 만들고 프로그램에 어떤 인스턴스를 갖는 것이 합리적이지 않을 때, 나는 이것에 2 센트를 추가 할 것이다. 그러나 나는 큰 클래스를 위해이 사용을 예약합니다. 나는 MSDN 예제와 같은 작은 수업을 "정적"과 같은 작은 수업을 "정적"이라고 선언하지는 않습니다.

나는 또한 그 정적에 주목하고 싶습니다 행동 양식 그리고 정적 클래스 고려해야 할 두 가지가 있습니다. 허용 된 답변에 언급 된 주요 단점은 정적입니다. 행동 양식. 공전 클래스 일반 클래스 (속성 및 매개 변수와 관련된 경우)와 동일한 유연성을 제공하며, 이에 사용 된 모든 방법은 클래스의 존재 목적과 관련이 있어야합니다.

내 의견으로는, 정적 클래스 후보의 좋은 예는 "파일 프로세싱"클래스이며, 이는 프로그램의 다양한 객체가 복잡한 필수 프로세싱 작업을 수행 할 수있는 모든 방법과 속성을 포함하는 모든 방법과 속성을 포함합니다. 이 클래스의 인스턴스가 하나 이상인 경우에는 거의 의미가 없으며 정적으로 사용하면 프로그램의 모든 것이 쉽게 이용할 수 있습니다.

나는 도우미 방법에만 정적 클래스를 사용하지만 C# 3.0의 출현으로 오히려 확장 방법을 사용하고 싶습니다.

싱글 톤 "디자인 패턴"을 거의 사용하지 않는 것과 같은 이유로 정적 클래스 방법을 거의 사용하지 않습니다.

기반 MSDN:

  1. 정적 클래스의 인스턴스를 만들 수 없습니다
  2. 클래스가 정적으로 선언 된 경우 회원 변수는 해당 클래스의 정적이어야합니다.
  3. 봉인 된 [상속받을 수 없음
  4. 인스턴스 생성자를 포함 할 수 없습니다
  5. 메모리 관리

예 : 수학 계산 (수학 값)이 변경되지 않습니다 [정의 된 값에 대한 표준 계산

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