중첩 클래스가 과소 평가 되었습니까?


9

나는 다른 사람들이하지 않는 것을 알고 싶지는 않지만 중첩 된 클래스를 사용하여 점점 더 많은 디자인을 해결 해 왔기 때문에 거의 사용되지 않는 것처럼 보일 수 있다는 느낌이 들었습니다. 디자인 메커니즘.

이것은 나를 질문으로 인도합니다 : 나는 그들이 나를 물러 오면 다시 발견 할 이유가 있기 때문에 본질적으로 나쁜 길을 가고 있습니까, 아니면 중첩 클래스가 과소 평가 될 수 있습니까?

: 여기 그냥 그들을 사용하는 두 가지 예 https://gist.github.com/3975581이 (가) 둘째 날 노동자 보호 된 멤버에 대한 액세스 권한을 부여 할 수는 먼저 나를 함께 긴밀하게 releated를 계층 구조로 일을 계속 도움이 ... -


답변 / 통찰에 대한 감사의 말을 전하고 싶습니다. 답변을 선택하는 방법을 잘 모르겠으므로 제가받은 조언을 무시하고 다시 방문하는 동안 그대로 두겠습니다 ...
Aaron Anodide

답변:


6

나는 이것을 "드물게 사용 된 디자인 메커니즘"이라고 부르지 않을 것이다. 적어도 보편적으로는 아니다. 일부 기여자들이 중첩 클래스를 사용하는 것에 눈을 shop을 수도있는 상점이 있지만, 이것은 모호한 특징이 아니다.

중첩 된 클래스가 조립 가시성 및 람다의 도입으로 클래스의 존재가 크게 필요성을 감소하였으나 * , 그들은 유효한 디자인 선택 남아있다. 네임 스페이스 내에서 내부 클래스와 일부 겹치는 부분이 있지만 중첩 클래스 기능은 다른 클래스 내부에서 클래스를 완전히 숨길 수있는 고유 한 기능입니다.


* C #에서 사용할 수있는 다른 대안이 자바가 없기 때문에 자바에서 유사한 기능의 사용은 훨씬 높다.


OOP 디자인의 본질에 따라 다른 클래스에서 클래스를 완전히 숨기는 것이 좋습니까?
Maxood

1
@Maxood 클래스를 숨길 수 있다면 숨기는 것이 좋습니다. API 사용자는 API 구현 방식에 대해 가능한 적게 알고 있어야합니다.
dasblinkenlight

3

다른 클래스 내에서 클래스를 작성하는 순간을 생각해보십시오. 다른 클래스는 프로그램의 다른 곳에서는 사용되지 않습니다. 다른 곳에서 사용한다면 다른 모든 것과 마찬가지로 일반 대중 수업으로 만들 수 있기 때문입니다.

따라서 OOP를 크게 (재사용 가능성)으로 만드는 것은 없습니다. 또한 부모 클래스 내의 일반 메서드 및 개인 멤버로는 달성 할 수없는 중첩 클래스로 무엇을 얻을 수 있습니까?

중첩 클래스를 활용하는 유용한 소프트웨어 패턴 은 여기를 참조하십시오 .


10
나는 재사용 성 제품을 구입 한 적이 없으며 적어도 일반적으로 사용되는 방식은 아닙니다. (1) 기존 코드 / 클래스 (당신이 이야기하는 것처럼 보이고 일반적으로 재사용의 정의로 간주 됨)를 호출하는 것은 OOP와 전혀 관련이 없으며 기본 모듈 만입니다. (2) OOP의 특성을 정의하는 하나의 하위 유형 다형성 은 특정 구현을 무의미하게하여 클라이언트 코드 재사용 할 수있게 한다. 재사용 한 IOW이지만 중첩 클래스에서도 작동합니다.

1
부모 클래스가 제공하는 네임 스페이스 절연도 있다고 말하고 싶습니다. 원하는 경우 클래스 A와 B 모두 중첩 클래스 "Params"와 포함하는 클래스의 비공개 멤버에 대한 액세스 권한을 가질 수 있습니다. 둘 다 클래스 외부에서 사용되는 내부 클래스를 사용해야하는 이유가 아닙니까?
Aaron Anodide

@AaronAnodide 중첩 클래스를 사용하는 좋은 방법에 대한 답변이어야합니다. 정확히 어떻게 / 왜 그들을 사용하는지, 코드를 구성하는 데 도움이됩니다.
Izkata

2

am I going down an inherintly bad path

두 번째 예 (작업자 서브 클래스)에서 당신이 분명히 있다고 생각합니다. 각 서브 클래스를 수퍼 클래스의 특정 상태에 맵핑했습니다. 이제 슈퍼 클래스에 상태를 추가 할 때마다 위치 에서 변경해야합니다 (슈퍼 클래스에 상태 추가, 새 하위 클래스 추가 및 파생 클래스의 생성자를 변경하여 하위 클래스를 목록에 추가해야 함) ).

비공개 멤버에 액세스하기 위해 중첩 클래스를 사용하는 것은 유효한 용도로 보이지만 (개인적으로는 해본 적이 없음) 귀하의 특정 사례는 여기에서 작동하지 않습니다.

본문 부분 예는. 모든 중첩 클래스가 공개되어 있으므로 네임 스페이스를 제외하고는 실제로 많은 일을하지 않습니다. 이러한 클래스에 더 많은 기능이 포함되어 있으면 중첩 클래스가 인터페이스를 복잡하게 만들고 코드를 통해 특정 정보를 찾는 것입니다. 또한 중첩 된 클래스가 있으므로 명명 규칙을 위반하고 클래스 이름을 소문자로 지정해야합니다 (이것은 선택 일 수 있음). 그러나 이러한 주장은 실제로 잘못된 것보다 피상적입니다.

물론, 구현되지 않은 팔을 구현해야하는 경우가 아니라면. 몸통 / 몸통 / 측면이 없기 때문에 다음을 수행하여 팔을 만드는 것은 혼란 스럽다. 또한 혼란스러운 케이스를 주목하십시오.

arm newArm = new Body.torso.side.arm("");

1

중첩 클래스를 생각할 수있는 유일한 장점은 개인 클래스 (또는 보호)로 만들 수 있다는 것입니다. 이 경우 중첩 클래스는 외부 클래스와 해당 클래스에서만 클래스를 사용하려는 경우 기능 을 캡슐화하는 데 도움이 될 수 있습니다 .


1

내 경험에 따르면 중첩 클래스

  • 나를 괴롭히기 위해 돌아 왔어
  • 모서리를 자르고 싶을 때 사용되었습니다
  • 악몽 테스트
  • 관심사 분리와 전체 디자인에 부정적인 영향을 미쳤습니다.

수업을 간략히 살펴 보았고 바로 다음과 같이 생각합니다.

  • 수업이 거대하기 때문에 그것을 보는 것은 고통 스럽습니다.
  • 몸 전체를 만들지 않으면 서 손가락을 테스트 할 수 없습니다
  • 몸통을 여러 번 구현할 수 없습니다. "인체"상황에서는 그다지 명백해 보이지 않지만 다른 시나리오에서는 이것이 분명해 보일 것입니다.

클래스를 여러 클래스로 분리하고 별도의 네임 스페이스를 제공하십시오. 예 :

WindowsGame1.PhysicalModel.UpperBody
WindowsGame1.PhysicalModel.LowerBody
WindowsGame1.PhysicalModel.UpperBody.Arms
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.