2010-01-18 7 views
6

일부 파일을 처리하는 일부 기능이 필요하다고 말하면서 2 가지 옵션을 고려했습니다.함수 클래스 또는 함수 네임 스페이스를 사용해야합니까?

1) 사용자가이처럼 사용할 수 SavedDataHandler 같은 클래스를 만듭니다 ....

// Note that SavedDataHandler has no members. It just has functions that operate on a 
// resource (the file) 
SavedDataHandler gameSave; 
gameSave.SaveData(arg1, arg2); // to save data 
gameSave.DeleteSave(); // Delete the save 
... 

2) 사용자가

처럼 전화 것이라고 기능

namespace SavedDataHandler { 
    SaveData(...) { ... } 
    DeleteSave(...) { ... } 
    ... 
} 

의 공간 만들기

SavedDataHandler::SaveData(arg1, arg 2); 
SavedDataHandler::DeleteSave(); 

무엇이 좋을까요?

P. 필자는 Scott Meyer의 비회원 비회원 기능을 회원 기능에 선호하는 것에 대해 생각하고있을 때 이것을 생각했습니다. 필자는 클래스 (class)를 돕기위한 함수 (private 멤버 함수)를 가지고 있으며 클래스 비공개에 대해 작동하지 않기 때문에 비회원으로 쉽게 만들 수있는 함수가있는 곳으로 결정을 내 렸습니다.

그러나이 기능은 해당 클래스에서만 사용됩니다. 물론이 프로그램은 다른 클래스가 필요로하는 지점으로 진화 할 수 있지만 이러한 비 멤버 함수를위한 장소를 찾기가 어렵습니다. 일반적인 목적으로 많은 기능을 사용하는 것은 쉽지만 단일 비회원 기능을 특정 장소로 ​​구성하기가 어려우며 구성원으로 남겨두면 일을 깨끗하게 유지할 수 있습니다. 이 문제와 관련하여 조언이 있으십니까?

답변

4

나는 다음과 같은 단순화 된 패턴과 경향

  • 경우는 하나 개의 클래스에서 사용하고, 그 상태를 유지 익명의 네임 스페이스에 구현 파일에 넣어 것으로 보인다.
  • 하나 이상의 클래스에서 사용 중이며 클래스의 내부 상태에 대한 액세스가 필요하지 않은 경우 네임 스페이스에 넣으십시오.
  • 클래스 내부 상태에 대한 액세스가 필요한 경우 물론 멤버 함수로 만듭니다.

그러나 의견이 다를 수 있으며 결국 고용주의 안내선이 최종 결정일 것입니다.

편집 :

... 물론이 아니 간단하지만 스콧 마이어스 already covered 세부 사항을 언급 한 바와 같이. 그런 다음 나중에 다시 사용하기로 결정한 경우,을 꺼내 너무 열심히 안 -
는 익명 네임 스페이스 도우미 기능을 넣을 경우, 이미 대부분 클래스에서 분리되어 : 조직 문제에 관해서는

공통 네임 스페이스에서.
이 시점에서 당신은 또한 잘 맞는 조직에 대해보다 잘 파악해야합니다. 때로는 사전에 어려울 수 있습니다.

+0

더 많거나 적게 동일한 추론을 사용합니다. –

+0

ddj에 대한 Scott Meyers 기사에 링크 해 주셔서 감사합니다! – Pete

0

게임 데이터가 포함 된 클래스의 save 메소드를 직접 보유하고 데이터가 저장되는 미디어를 나타내는 헬퍼 객체를 전달하고 delete 메소드를 미디어 클래스 자체에 포함시키는 것이 좋습니다.

+0

이것은 Scott Meyer가 주장한 것입니다. http://www.ddj.com/cpp/184401197 –

1

내 주관적인 대답은 정적 메서드가 포함 된 클래스보다 네임 스페이스를 사용하는 것입니다.

내 근거는 단순히이 코드 블록의 목적을 알 수있는 선언을 보는 것입니다.

클래스 인 경우 인스턴스 메소드가 없어도됩니다. 네임 스페이스 인 경우 모든 함수가 독립형임을 알 수 있습니다.

이러한 개념은 C#을 배울 때 나와 함께합니다. C#에서는 독립 서 기능을 사용할 수 없습니다.

internal static class SavedDataHandler 
{ 
    // Because this is a static class, the compiler will not let you create an instance method 

    internal static void ThisIsAStaticFunction() // This is fine 
    { 
    } 

    internal void ThisIsAnInstanceFunction() // Compiler error! 
    { 
    } 
} 

C++ 정적 클래스의 개념을 가지고 있지 않기 때문에, 네임 스페이스가 될 것이다가는 방법 : 그러나, 당신은 정적 클래스을 가질 수 있습니다.

0

질문 자체에 답해야한다면 다음과 같습니다. 문제가되지 않습니다. 이 경우 함수의 네임 스페이스와 정적 함수를 사용하는 클래스의 차이점은 단지 통사론이라고 말할 수 있습니다.

그러나 "SavedGame"개체를 모델링하려는 것 같습니다. 이 함수들이 상태가없는 다른 핸들러를 가져야하는 이유가 있습니까?

0

이 질문은 프로그램의 다른 부분에서 건강에 좋지 않은 디자인에서 비롯된 것 같습니다. 핸들러에 전달하는 arg1 및 arg2의 디자인을 살펴볼 것입니다. 추상화가없는 부분 일 것입니다.

관련 문제