2014-07-11 3 views
0

클래스 인터페이스 설계에 대한 모범 사례를 찾고 있습니다.다른 내부 함수를 호출하는 클래스 인터페이스 함수를 사용해야합니까?

이미지를로드하는 클래스 함수가 ​​있다고 가정하면 예외 검사가 수행되고 전달되면 맵 클래스에 추가됩니다.

public void SomeClass::Load(Type::Something ID //enum, std::string& fileName) 
{ 
    // Load file from string 
    // Do Exception checking 
    // Add to map 
    // Assert std::map.insert 
} 

2 기능 :

는 가장 한 기능을 가지고하는 것입니다

public void SomeClass::Load(Type::Something ID //enum, std::string& fileName) 
{ 
    // Load file from string 
    // Do Exception checking 
    // Call insert 
} 
private void SomeClass::Insert(Type::Something ID //enum, std::string& fileName) 
{ 
    // Map.insert 
    // assert check 
} 

개인 기능을

또는 3 함수를 호출 한 공공 기능 :

public void SomeClass::Load(Type::Something ID //enum, std::string& fileName) 
{ 
    // Call Load 
    // Call insert 
} 
private void SomeClass::LoadFromFile(Type::Something ID //enum, std::string& fileName) 
{ 
    // Load file from string 
    // Do Exception checking 
    // Call insert 
} 
private void SomeClass::Insert(Type::Something ID //enum, std::string& fileName) 
{ 
    // Map.insert 
    // assert check 
} 

한 가지 기능 그것은 공개적으로 2 개의 개인 기능을 호출합니다.

+1

귀하의 질문은 의견을 기반으로 생각합니다. 예를 들어,이 간단한 작업에서는 예외를 사용하지 않을 것입니다. 허버트 (Herbert)는 예외적 인 경우 (예 : 총알이 CPU에 영향을 미침)에 예외가 있다고 말했습니다. – 101010

+0

진짜 질문은 소프트웨어의 목표가 무엇인지, 또한 그러한 캡슐화 (예 : 보안 또는 데이터 구조 보호)의 이유입니다. – TheBetaProgrammer

답변

2

각각의 기능이 하나의 작업을 수행하도록 기능을 나눠 보는 것이 좋습니다. 때로는 사용자가 표시된 것처럼 일부 개인 멤버 함수를 도입하는 것을 의미합니다. 그러나 모든 함수와 마찬가지로 필요할 경우, 즉 클래스의 개인 데이터 멤버에 대한 액세스가 필요한 경우에만 멤버 함수로 만들어야합니다. 종종 이러한 함수를 클래스의 .cpp 파일에서만 선언 된 비 멤버로 작성할 수 있으므로 다른 번역 단위로는 내보낼 수 없습니다.

그러나 내가 구조화 한 방식이 적절한 지 여부는 확실하지 않습니다. 물론 SomeClass이 무엇을 나타내는지는 모르지만 실제로는 이미지로드는 MyClass의 상태에 달려 있습니다. 이 기능에서 예외를 처리해야하는지 궁금 할, 여담으로

Image image = Load(/* whatever */); 
myClass.Insert(image); 

: 그렇지 않다면, 아마도 Load 로딩 이미지가 아닌 멤버 함수해야 당신은 공공 Insert 함수에 결과를 전달해야합니다 . 예외에 대해 생각하는 좋은 방법은 함수가 호출 코드와의 계약을 이행 할 수없는 경우 예외를 throw하는 것입니다. 이 경우, SomeClass::Load의 계약은 이미지를로드 할 것을 약속합니다. 그렇게 할 수 없다면, 예외를 전파 (또는 다른 것에 랩)시켜야합니다. 실제로 계약을 처리하는 데 도움이되는 예외 만 처리하면 계약을 이행하는 데 도움이됩니다.

+0

죄송합니다. 아직 배우고 있습니다. 코드는 책에서 시작하여 1부터 시작하여 2로 이동합니다. 한 번에 여러 책을 읽었으므로 코드가 실제로하는 일 중 가장 좋을 것 같습니다. 당신은 부하와 같은 일반적인 기능을 가지고 있거나 무언가를 할 수 있습니다. 17 단계는 사적인 기능의 17 단계 각각에 대한 기능을 만들어야합니다. 아무도 외부의 액세스를 필요로하지 않으면 다른 사람들이 할 수있는 모든 public을 호출 할 수있는 18 번째 기능을 만듭니다. –

+0

@MK 코드의 모든 단일 함수는 논리적으로 구별되는 작업을 수행해야합니다. 즉, "와"가없는 한 문장으로 무엇을하는지 요약 할 수 있어야합니다. 함수의 몸체를 살펴보면 * this *, then * that *처럼 보일 것입니다. 그렇지 않다면하지 마십시오. 이것에 약간의 예술이 있습니다. –

0

정말 다릅니다. 여기에 "옳은"대답은 없습니다. 그것은 개인적 선호도와 물론 "코드의 양"에 크게 좌우됩니다.

"함수는 한 가지를 수행하고 잘 수행해야합니다"라는 원칙도 있습니다. 그러나 "하나의 것"은 실제로 사물을 보는 방법에 달려 있습니다. 함수가 내용을 읽고 파일의 구성 요소를지도에 삽입하여 파일을 "로드"하는 경우 해당 파일이 Load 함수 일 수 있습니다. 그러나지도에 삽입하는 코드의 다른 부분이있는 경우 별도의 Insert 함수를 포함하도록 함수를 분할하는 것이 좋습니다.

일반적으로 반복되는 코드가 좋지 않으므로 여러 위치에서 "동일하거나 유사한"코드가있는 경우 해당 코드를 함수로 만드는 것을 고려해야합니다.

"필요"하다고 생각되면 개인 회원 기능이 일반적으로 좋은 해결책입니다.

나는 가능한 한 항상 작은 기능을 선호합니다.

관련 문제