2010-06-29 1 views
10

클래스가 다른 클래스에서만 인스턴스화되므로 해당 클래스에 중첩 된 클래스를 사용하는 것이 적절하다고 생각합니다.이 방법은 좋은 디자인을 얻는 데 도움이 될 것이라고 생각합니다. 프로젝트를 볼 때 이러한 중첩을 거의 보지 못했습니다. 그러나 이번에는 중첩 된 클래스를 시도해 볼 때 다른 질문이 내 마음에 나타납니다. 예를 들어,중첩 클래스는 어디서 어떻게 사용합니까?

나는 Board 클래스를 가지고 있으며, Pawn, Queen, Rook 같은 ShortCastle, LongCastle, EnPassant, Knight 등등. 그래서 그것은 명백합니다. Board 클래스는 Piece 클래스를 인스턴스화하고 Piece 클래스는 Move 클래스를 인스턴스화합니다. 좋은 디자인을 위해서, 전당포가 자신을 승진시킬 수 있기 때문에 승진 클래스를 Pawn에 중첩시켜야합니다. 짧고 긴 성은 왕만이 중첩되어야하며, 오직 왕만이 그러한 유형의 이동을 할 수 있기 때문에.

모든 조각 클래스를 보드 클래스에 넣으려고하면 좋은 디자인이 보이지 않습니다. 8-9 클래스가 보드 클래스 안에 있고 보드 클래스 파일이 너무 커서 보드가 너무 크고 읽을 수 없기 때문입니다. 다른 파일에서 조각 클래스. 우리가 부분적으로 Board 클래스를 만들 수 있지만 여전히 성가신 것은 아닙니다. 8-9 Partial Board 클래스 파일은 각 클래스를 보유 할 것입니까? 그들을 중첩시키지 않는 것이 낫습니까? 동일한 피스 (Piece)에 대해서 다른 Move 피스 (Move) 유형 클래스 용으로 다른 부분 피스 파일을 만듭니 까? 중첩 클래스가 작은 공간을 차지하면 아무런 문제가 없지만 많은 메소드가 필요한 경우?

답변

11

네가 중첩 된 클래스에 너무 관대하다고 생각합니다. 중첩 된 유형에 대한 설계 지침은 this입니다. 사실 다음과 같은 경우

중첩 된 형식을 사용하지 마십시오 있습니다

  • 유형은 클라이언트 코드로 인스턴스화해야합니다. 유형에 public 생성자가있는 경우 을 중첩하지 않아야합니다. 이 지침의 근거는 중첩 된 유형 을 인스턴스화 할 수있는 경우 을 나타내며 형식에는 라이브러리의 위치가 단독으로 있음을 나타냅니다. 을 작성하여 사용하고 외부 유형을 사용하지 않고 파기하십시오. 따라서 은 중첩되어서는 안됩니다. 내부 유형 은 외부 유형에 대한 관계없이 외부 유형의 외부로 널리 재사용하지 않아야합니다.
  • 형식에 대한 참조는 일반적으로 클라이언트 코드에 선언 된 입니다.

조각들은 보드에 소속되어있을 수도 있지만 (그것들은 구성원으로서의 조각 모음입니까?), 그것 없이는 공존 할 수 있습니다. 너. 조각 (주제 등)없이 보드를 재사용하고 보드없이 조각을 재사용 (위치 등)하고 싶습니다.

2

상위 클래스의 개인 멤버는 Nexted 클래스 메서드에 액세스 할 수 있습니다.

다음 클래스를 사용하면 넓은 범위없이 복잡성을 줄일 수 있습니다.

0

실제로 네스트 한 클래스가 디자인에 적합한 지 생각해보십시오 (Tim Schmelter의 경고 참조)하지만 파일 크기가 너무 크다고 생각하면 부분 클래스를 사용하면 중첩 된 클래스 정의를 자체 파일로 분할하는 것이 좋습니다. 또는 중첩 된 클래스가 충분히 작 으면서도 많은 수의 클래스가있는 경우에는 중첩 된 클래스를 모두 하나의 부분 파일로 만듭니다.

학부모CS :

public partial class Parent 
{ 
    void SomeMethod() 
    { 
     Nested1 n1 = new Nested1(); 
     Nested2 n2 = new Nested2(); 
    } 
} 

Nested.cs : 전용 폰이 자신을 홍보 할 수 있기 때문에 좋은 디자인에 대한

public partial class Parent 
{ 
    private class Nested1 
    { 

    } 
    private class Nested2 
    { 

    } 
} 
1

, 이동 클래스를 홍보는 폰의 중첩되도록한다.

나는 정말로 동의하지 않습니다. 단지 당신이 일 수 있기 때문에 네스트 클래스가 꼭해야한다는 것을 의미하지는 않습니다. 이러한 수업을 중첩하면 어떤 이점이 있는지 자문 해보십시오.

+0

이 디자인으로 실수 가능성을 제한합니다. 다른 조각들 중 아무도 그런 움직임을 만들지 못합니다. 잘못 설계된 것입니다.이 디자인으로는 해결할 수 없습니다. 내가 잘못 했습니까? – Freshblood

+0

깊이 중첩 클래스는 범위를 제한합니다 (특정 시나리오에서 유용한 아키텍처 제약이 될 수 있음). 그러나 프로젝트 초기에 많은 복잡성을 겪고 있습니다. "작동 할 수있는 가장 단순한 작업"을 수행하고 필요할 때보다 복잡한 디자인으로 리팩터링하는 것이 좋습니다. 나중에 특정 클래스를 인스턴스화 할 수있는 곳을 제약하려면 "클래스 라이브러리"프로젝트를 만들어 솔루션을 여러 어셈블리로 분리 할 수 ​​있습니다. 행운을 빈다. =) –

0

중첩 클래스는 자리가 있지만 작업하기가 혼란 스러울 수 있습니다. 일부 닷넷 클래스를 사용하여 월스트리트의 페이스 북의 JSON 출력을 얻는 방법을 보여주는 웹 페이지를 발견했습니다. http://www.virtualsecrets.com/graph-api-json-facebook-handler.html 흥미로운 점은 클래스가 다른 클래스 내부에 중첩되어 있다는 것입니다. bit complex. :)

+0

나는이 기사가 중첩 된 클래스가 아니라 단지 중첩 된 객체라는 것을 이해한다. 그것은 완전히 다릅니다. – Freshblood