게임 개발에서“친구”수업 사용


9

일반적으로 C ++ 게임 개발 속도는 캡슐화보다 중요합니다. 따라서 공개적으로 접근해서는 안되는 수많은 공개 클래스 멤버가 있습니다.

나는 대부분의 경우 아주 소수의 클래스 만 다른 클래스의 내부 작업을 개인 데이터를 수정하거나 읽을 때까지 알아야 할 필요가있는 것으로 보입니다.

이 개인 데이터에 대한 공개 게터 / 세터를 만들면 실제로 수정해서는 안되는 것들이 노출됩니다.

친구 클래스를 사용하는 것이 타협입니까? 또는 내가 보지 못하는 친구 수업에 단점이 있습니까?

답변:


8

친구 수업에는 두 가지 주요 단점이 있습니다.

  1. 친구에게 노출 할 항목을 선택하여 선택할 수 없습니다. 전부 아니면 아무것도 아니야 중요하지 않은 세터를 강제로 사용하려는 경우 문제가 될 수 있습니다.
  2. 두 클래스는 이제 친구가 친구에 대해 알고 있다는 의미에서 다소 결합됩니다.

즉, 친구 클래스를 사용하면 캡슐화를 확실히 향상시킬 수 있습니다. 특히 대안이 공개 게터 / 세터 인 경우 더욱 그렇습니다.

또한 SO에 관한 관련 질문 : https : //.com/questions/521754/when-to-use-friend-class-in-c


5

캡슐화는 좋지만 문제의 분리는 더 좋습니다.

다른 클래스의 "일부 개인 부분"에 액세스하는 클래스는 코드가 처음에 제대로 설계되지 않았 음을 나타낼 수 있습니다.

당신이 "아쉬, 여기에 친구 수업을해야 해요"자리에서 당신을 발견 할 때마다, 당신이 스스로 물어봐야 할 질문은 "내가 이것을 올바르게하고 있습니까, 아니면 더 깨끗한 방법이 있습니까?"입니다. (일명 "이것이 나중에 엉덩이에 물 릴까요?").

"친근 함"에 대해 확신이 있으시면 망설이지 말고 그대로 두십시오.


친구 수업을 사용하면 한 수업을 다른 수업과 밀접하게 결합시키는 방법을 이해합니다. 게터 / 세터로 무언가를 감싸는 것이 잠재적으로 더 나쁜 해결책이기 때문에 특히 문제를 완화시키는 디자인 패턴이 있는지 궁금합니다.
David Young

1
흥미로운 예는 C ++의 팩토리 패턴은 개인 생성자를 사용하기 때문에 "friend"가 필요하다는 것입니다.
David Young

2

또 다른 옵션은 PIMPL idiom 을 사용하는 것입니다 . 여기서 구조 구현의 일부는 다른 유형에 대한 포인터입니다. 클래스의 대부분의 사용자는 일반 헤더 파일 만 포함하며 구현은 불투명 포인터입니다. 개인 데이터에 액세스해야하는 클래스는 다른 유형을 정의하는 헤더를 포함하고 제공하는 인터페이스를 사용할 수 있습니다.

이것은 친구와 같은 기능을 원하는 C 프로그래머에게 공통적 인 패턴입니다. 제 생각에는 캡슐화 (관심 분리를 구현하는 데 유용하지만 종종 오용되는 OO 관련 기술)보다는 우려 분리 (일반적으로 재사용 가능한 직교 코드로 이어지는 일반적으로 좋은 설계 원칙) 에 대한 생각에 더 가깝습니다. 일을 너무 복잡하게 만듭니다).

그것은 친구보다 친구를 전혀 친구와 연결시키지 않는다는 장점이 있습니다. 어떤 사람들은 수업에 "친구"가 될 수 있기 때문에 이것이 단점이라고 주장 할 수도 있습니다. 나는 당신이 여전히 머리글을 포함하여 관계를 명시 적으로 만들고 있기 때문에 이것이 부당한 두려움이라고 생각합니다. 당신이 그것을 두려워한다면, 당신은 현명한 건축 결정을 내릴 수있는 (또는 동료의) 능력을 두려워합니다. 그러나 나중에 결정을 내릴 수 없다면 왜 friend지금 자신을 신뢰하고 있습니까?

런타임 비용의 단점이 있습니다. 포인터에 데이터를 저장하면 캐시 일관성이 떨어지고 할당 횟수가 많아지며 정리할 소멸자가 필요합니다.


흥미로운 +1,이 개념은 Java 배경에서 비롯된 것을 들어 보지 못했습니다.
David Young
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.