정적을 너무 많이 사용하는 것이 나쁜가요, 좋은가요?

StackOverflow https://stackoverflow.com/questions/30998

  •  09-06-2019
  •  | 
  •  

문제

저는 C#처럼 C++에서 정적 함수를 사용하여 분류하는 것을 좋아합니다.

Console::WriteLine("hello")

이게 좋은 걸까요, 나쁜 걸까요?함수가 자주 사용된다면 문제가 되지 않을 것 같지만, 그렇지 않다면 메모리에 부담을 주나요?

는 어때 static const?

도움이 되었습니까?

해결책

<인용구>

하지만 좋은지 나쁜지

첫 번째로 떠오르는 형용사는 '불필요'입니다.C ++에는 무료 함수와 네임 스페이스가 있는데 왜 클래스에서 정적 함수로 만들어야합니까?

C # 및 Java의 인스턴스화 할 수없는 클래스에서 정적 메서드를 사용하는 것은 해결 방법 입니다. 이러한 언어에는 자유 함수 (즉, 일부가 아닌 네임 스페이스에 직접 상주하는 함수)가 없기 때문입니다.수업의).C ++에는 그러한 결함이 없습니다.네임 스페이스를 사용하십시오.

다른 팁

나는 정적을 사용하는 것을 좋아합니다. 기능.이는 특히 모듈로 구성할 때 의미가 있습니다(static class C#에서).

하지만, 순간 이러한 함수에는 일종의 외부(컴파일 타임 const가 아닌) 데이터가 필요하며, 해당 함수는 인스턴스 메서드로 만들어져 해당 데이터와 함께 클래스에 캡슐화되어야 합니다.

간단히 말해서:정적 함수는 괜찮지만 정적 데이터는 좋지 않습니다.

정적 함수가 네임스페이스로 대체될 수 있다고 말하는 사람들은 틀렸습니다. 간단한 예는 다음과 같습니다.

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

보시다시피, 공개 정적 함수 f1 또 다른 정적이지만 비공개 함수를 호출합니다. f2.

이는 단순한 함수 모음이 아니라 자체적으로 캡슐화된 메서드가 포함된 스마트 컬렉션입니다.네임스페이스는 이 기능을 제공하지 않습니다.

많은 사람들이 "싱글톤" 패턴이 일반적인 관행이기 때문에 사용하지만, 대부분의 경우 여러 정적 메서드와 단 하나의 정적 데이터 멤버가 있는 클래스가 필요합니다.이 경우 싱글톤이 전혀 필요하지 않습니다.메소드를 호출하는 것도 instance() 정적 함수/멤버에 직접 액세스하는 것보다 느립니다.

네임 스페이스를 사용하여 함수 모음 만들기 : 라코 디스

메모리의 경우 함수는 함수 외부, 정적 멤버 함수 또는 네임 스페이스에서 동일한 양을 사용합니다.즉, 코드 자체 외에는 메모리가 없습니다.

정적 데이터가 나쁜 이유 중 하나는 C ++가 다른 변환 단위에서 정적 개체의 초기화 순서를 보장하지 않기 때문입니다.실제로 이것은 한 객체가 다른 번역 단위에서 다른 객체에 의존 할 때 문제를 일으킬 수 있습니다.Scott Meyers는 그의 저서 More Effective C ++의 Item 26에서 이에 대해 설명합니다.

여기서 Frank의 의견에 동의합니다. 정적 (전역) 함수에는 문제가 없습니다 (물론 조직화되어 있다면) .. 문제는 사람들이 "오,이 부분에서 범위를 만들 것입니다.데이터가 조금 더 넓어졌습니다. ".. 미끄러운 슬로프 :)

진정한 관점에서 .. 기능적 프로그래밍 ;)

정적 함수의 문제점은 캡슐화를 깨는 디자인으로 이어질 수 있다는 것입니다.예를 들어 다음과 같은 글을 작성하는 경우 : 라코 디스

... 그러면 디자인을 재고해야 할 수도 있습니다.정적 함수는 종종 클래스의 API를 복잡하게 만들고 일반적으로 일을 더 복잡하게 만드는 setter와 getter를 사용해야합니다.제 예에서는 Hamburger의 getter를 제거하고 getTotal () 클래스를 Hamburger 자체로 이동하는 것이 더 나을 수 있습니다.

저는 정적 함수로 구성된 클래스를 만드는 경향이 있지만 일부는이를 수행하는 "올바른 방법"이 일반적으로 대신 네임 스페이스를 사용하는 것이라고 말합니다.(C ++에 네임 스페이스가 있기 전에 습관을 개발했습니다.)

BTW, 정적 데이터와 함수로만 구성된 클래스가있는 경우 생성자를 비공개로 선언해야하므로 아무도 인스턴스화하려고하지 않습니다.(이것은 일부 사람들이 클래스보다는 네임 스페이스를 사용한다고 주장하는 이유 중 하나입니다.)

조직의 경우 이미 언급 한 네임 스페이스를 사용합니다.

글로벌 데이터의 경우 singleton 패턴을 사용합니다.정적 객체의 알 수없는 초기화 순서.즉, 객체를 싱글 톤으로 사용하면 사용시 초기화가 보장됩니다.

또한 정적 함수가 상태 비 저장인지 확인하여 스레드로부터 안전합니다.

보통 친구 시스템과 연계해서 만 통계를 사용합니다.

예를 들어 개인 데이터에 대한 작업을 포함하여 많은 (인라인 된) 내부 도우미 함수를 사용하여 항목을 계산하는 클래스가 있습니다.

물론 이것은 클래스 인터페이스의 기능 수를 증가시킵니다. 이를 없애기 위해 원래 클래스 .cpp 파일에 도우미 클래스를 선언하고 (따라서 외부에서는 볼 수 없음) 원래 클래스의 친구로 만든 다음 이전 도우미 함수를 정적 (인라인) 멤버로 이동합니다.도우미 클래스의 함수, 이전 매개 변수와 함께 참조 당 이전 클래스를 전달합니다.

이는 인터페이스를 얇게 유지하고 많은 무료 친구 기능 목록이 필요하지 않습니다. 인라이닝도 잘 작동하므로 정적에 완전히 반대하지는 않습니다. (가능한 한 피하지만 이렇게 사용하는 것이 좋습니다.)

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