하나의 .cs 파일에 여러 클래스가 있습니까? [닫은]


30

.cs 파일 내에 여러 클래스를 만드는 것이 좋습니까? 아니면 각 .cs 파일에 개별 클래스가 있어야합니까?

예를 들면 다음과 같습니다.

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

이것이 좋은 아키텍처의 나쁜 예라는 사실을 잠시 피하고 .cs 파일에 코드 냄새가 하나 이상 있습니까?

답변:


30

당신이 주신 예는 실제로 제 생각에는 괜찮습니다. 당신은 내부 클래스를 선언 하고 있기 때문에, 그것들을 같은 파일 에 보관하는 것은 완벽하게 합리적 입니다. 이 문제를 해결하는 유일한 방법은 Items수업을 부분 수업으로 만들고 여러 파일로 나누는 것입니다. 나는이 나쁜 습관을 고려할 것입니다. 중첩 클래스에 대한 나의 일반적인 정책은 작고 사적이어야한다는 것입니다. 이에 대한 두 가지 예외가 있습니다.

  • 클래스 클러스터를 디자인하고 (객관 -c에서 더 일반적 임) 부분 클래스 접근 방식을 사용하는 것이 합리적 일 수 있습니다
  • 부모 클래스의 공용 API에서만 사용되는 열거 형이 필요합니다. 이 경우 네임 스페이스를 오염시키는 대신 부모 클래스 내에 선언 된 공개 열거 형을 선호합니다. 열거 형은 "내부 열거 형"이므로 효과적으로 정의 된 범위를 제공합니다.

질문에 약간 다르게 말하고 "각 네임 스페이스 수준 클래스를 자체 파일에 넣어야합니까?"에 대해 묻는 다면 제 대답은 "예"입니다.

수업을 설계 할 때 우리는 단일 책임 원칙을 존중합니다. 코드의 형태가 의미를 따르는 경우 코드를 읽는 것이 훨씬 쉬워 지므로 파일을 클래스별로 분할하는 것이 좋습니다.

기계적인 관점에서 클래스 당 파일을 갖는 것은 몇 가지 장점이 있습니다. 다른 창에서 여러 클래스를 동시에 열 수 있습니다. 심각한 개발자가 두 개 미만의 화면으로 작업하지 않기 때문에 이것은 특히 중요합니다. 내 머리 앞에서 더 많은 맥락을 가질 수 있다는 것은 내 머리 속에 더 많은 맥락 유지할 수 있다는 것을 의미 합니다. (대부분의 IDE에서는 동일한 파일을 두 번 열 수 있지만 어색합니다.)

다음 중요한 측면은 소스 제어 및 병합입니다. 클래스를 별도로 유지하면 별도의 클래스를 변경해야하므로 동일한 파일을 변경할 때 많은 번거 로움을 피할 수 있습니다.


1
나는 동의하지만 다시 내면의 수업은 내 경험에서 매우 드물다. 공평하게 말하자면 실제로 내부 클래스를 정당화 할 수있는 것은 많지 않습니다. 내가 아는 유일한 경우는 열거 할 수있는 한 실제로 실제 클래스에 관한 것이 아닌 IEnumerable 클래스입니다. 다른 모든 경우에 각 클래스는 자체 파일을 가져와야합니다. 소스 제어 문제로 인해 다른 이유가없는 경우
Homde

2
내부 클래스는 드문 예외이며 공개해서는 안된다고 덧붙입니다.
Josh

그래는 내부 클래스는 innerclasses를 사용해야하는 경우에는 다른 질문입니다 :) 묻는 괜찮 마크 떨어져 너무 빨리 것에 대해 저를 가르쳐
krystan 명예

11

잔인하게 정직하려면 파일에 루트 클래스를 두 개 이상 추가하지 마십시오. 마지막 작업에는 여러 클래스뿐만 아니라 여러 네임 스페이스가있는 파일이 있었고 수천 줄의 코드로 확장되었습니다. 따라 가기가 매우 어렵습니다.

밀접하게 관련된 클래스가 있으면 파일 이름을 비슷하게 지정하거나 하위 폴더에 넣습니다.

클래스 파일을 물리적으로 분리하면 문제의 분리와보다 느슨한 결합을 유발할 수 있습니다.

반면, 귀하의 예는 둘 이상의 루트 클래스를 표시하지 않습니다. 이 몇 가지 중첩 된 클래스입니다 (참고 : 중첩 된 클래스 무엇을하지 않으려 고하지만 private당신이 디자인 할 수있는 경우)이은 완벽하게 정상적으로 하나 개의 파일에있을 수 있습니다.


3
세상에-끔찍하게 들린다.

왜 물어? 누군가 당신을 공감 시켰고 그 이유를 묻고 싶습니까?

잠깐만 ... 마지막 일에 관한 작은 일화를 언급하고 있었나요? 그렇다면, 나는 그것을 잘못 이해하고 사과합니다.
Jesse C. Slicer

완전히 동의하십시오. 대부분의 파일에 파일 당 클래스가 4 개 이상인 프로젝트를 진행 중입니다. 그리고 일부는 파일 당 최대 22 개의 클래스 + 1 개의 인터페이스를 가지고 있습니다.
L_7337

7

예를 들어 파일 이름이 매우 짧고 비슷한 이름의 파일을 여러 개 사용하는 대신 파일이 응집력이있는 경우 좋은 아이디어가 될 수 있습니다.

예를 들어, 나는 유창함 자 NHibernate를 사용하는 경우는 내가 지킨다면 쉽게 찾을 수 EntityEntityMap내 도구 그것에 대해 말을 할 수 있습니다 무엇에도 불구하고, 하나의 파일에.

대부분의 경우 클래스를 찾기가 더 어려워집니다. 주의해서 사용하십시오.


1
Fluent NHibernate의 경우, 같은 파일뿐만 아니라 같은 클래스에 보관하는 것이 유용하다는 것을 알았습니다. 모든 엔터티에는 Map이라는 중첩 클래스가 있습니다.
James Beninger

7

간단히 예,이 작업을 수행하기에 좋지 않은 양식을 넣으면 나중에 나중에 솔루션이 커질 때 클래스 이름이 파일 이름이 더 이상 내용이 무엇인지, 파일 이름이 무엇인지 나타내지 않기 때문에 클래스가 어디에 있는지 잊어 버릴 것입니다. AnimalPersonObject.cs는 불가능합니다.

확실히 resharper와 같은 도구의 기능을 사용하여 유형으로 이동하면이 문제를 해결할 수 있지만 파일 당 1 클래스 (인터페이스 포함)는 실제로 .net뿐만 아니라 Java 및 C ++ 및 많은 다른 언어, 종종 유지 관리 문제가없는 주니어 개발자는 코드를 이해하기가 어렵다는 것을 알게 될 것입니다.

거의 모든 코드 최적화 도구는 클래스를 별도의 파일로 이동하라는 메시지를 표시하므로 나에게 이것은 코드 냄새이며 중화하기 위해 oust가 필요합니다. :)


3

또 다른 문제는 동일한 파일에 매우 크고 유사한 클래스가 있으면 클래스 선언을 항상 수 없을 때 잘못된 클래스에 중단 점을 배치하고 왜 충돌하지 않는지 궁금해한다는 것입니다. grrr! :)


-3

기본적으로 "부모"클래스 내에서만 (범위 측면에서)이 클래스를 사용해야하는 경우 일반적으로이 클래스를 중첩 클래스로 정의하는 것이 좋습니다.

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