파일로 분할-얼마나 많은 분할?


9

내가 말하면 구성 요소 모델이 아닌 계층 적 엔터티 프레임 워크가 있습니다. 다음과 같은 것 :
(예, 구성되었습니다)

무기-> 총-> 자동 총-> MP44
또는 고전적인 예 :
Entity-> MovableEntity-> Enemy-> WalkingEnemy

가독성과 구성을 위해 소스 / 헤더 파일을 얼마나 멀리 분할 하시겠습니까? Entity.cpp, MovableEntity.cpp, Enemy.cpp 등을 사용하는 것이 가장 좋습니까? 아니면 Entity.cpp [Entity 및 MovableEntity를 포함 함] 및 Enemy.cpp [Enemy 및 WalkingEnemy를 포함 함]와 같은 접근 방식이 더 좋을까요? (또는 더 많은 언어와 무관하게 Enemy 파일과 Entity 파일을 각 클래스의 파일
과 비교할 수 있습니까?) 또한 가독성과 구성 외에 다른 영향을 미칩니 까?


1
Nitpicky, 그러나 부작용에 관해서 language-agnostic는 사용하는 언어에 크게 의존하기 때문에 적절한 태그 라고 생각하지 않습니다 .
Tetrad

좋은 지적은 태그를 다시 지정할 수 있다고 생각합니다.
공산주의 오리

답변:


12

이것은 전적으로 선호의 문제입니다. 그러나 개인적으로 더 많은 파일을 잘못 쓰는 것이 가장 좋습니다. Java에는 파일 당 하나의 클래스가 필요합니다 . 예를 들어 파일 이름은 클래스 이름과 동일합니다. 이 모범 사례를 시행하기 위해 정책에 따라이 작업을 수행합니다 (기본적 으로이 문제를 해결하는 하위 클래스를 가질 수 있음).

또한 소스 제어 시스템 은 파일의 변경 사항을 병합하는 데 능숙하지만 완전히 별개의 파일로 작업하는 경우 번거 로움이 없습니다. 누가 어떤 수업을 변경했는지 쉽게 볼 수 있습니다. 다른 개발자가 AllEntities.h 파일을 변경한다고 가정 해 봅시다. 파일을 열고 diff 출력을 볼 때까지 그가 변경 한 엔티티 (또는 엔티티)를 정확히 알 수 없습니다.

그래도 클래스와 관련된 작은 구조체와 열거 형을 한 클래스의 파일 내 에서 그룹화하는 것이 좋습니다 . 단일 클래스에서만 사용되는 열거 형이 있다면 왜 자체 파일로 분할합니까? 함께 모 으세요. 그러나 다른 클래스에서 사용하는 경우 (즉, 다른 클래스 멤버가이 열거 형의 유형 인 경우), 자체 파일을 제공 할 때입니다.


동의했다. 유형의 복잡성은 확실히 요인이되어야합니다. 언어가 부분 클래스를 지원하거나 멤버 구현을 C ++과 유사하게 구성 할 수있는 경우 특히 복잡한 유형을 여러 파일로 나누는 것이 좋습니다. 예를 들어, 클래스가 구현해야하는 (큰) 인터페이스가 있지만 코드가 상당히 일반적이고 나머지와 관련이없는 경우 해당 코드를 별도의 파일 / 부분 클래스로 나눌 수 있습니다. 열거 형 유형의 경우 주어진 네임 스페이스에 대한 모든 열거 형을 단일 파일 내에 배치하면 벗어날 수 있다고 생각합니다.
Mike Strobel

1
열거 형을 그룹화하지 않는다는 것이 단일 값을 변경하면 해당 네임 스페이스에서 열거 형을 사용하는 모든 파일을 다시 컴파일하는 것을 의미합니까?
오리 공산당

글쎄, 그건 언어에 따라 다르지만, 확실히 그 영향을 줄 수 있습니다. 파일별로 컴파일하지 않고 C #에서 주로 개발하기 때문에 실제로 문제가되지 않지만 C ++ 및 기타 언어에서는 문제가 될 수 있습니다. 항상 그렇듯이 고려해야 할 언어 별 요소가 있으며 그중 하나가 될 것입니다. :).
Mike Strobel

2

C / C ++ 이외의 많은 언어는 파일에 제약을가합니다. 리켓은 자바의 '파일 당 하나의 클래스'를 언급했다. 파이썬은 파일을 네임 스페이스로 사용합니다. 다른 언어는 종종 그 정신을 복사합니다.

C 또는 C ++를 사용하는 경우 포함 된 파일이 많을수록 일반적으로 파일 당 컴파일 시간이 길어집니다. 반면에 작은 변경을 할 때 다시 컴파일해야하는 횟수가 줄어 듭니다. 열거 형은 C에서 앞으로 선언 될 수 없으므로 종속성 정리를 위해 항상 다른 열거 형 만 포함하는 헤더 파일에 넣어야합니다.

그렇지 않으면 Java의 "클래스 당 하나의 파일"이 합리적이지만 오랫동안 Java는 컨테이너와 같은 내부 클래스와 반복자의 내부 클래스를 지원했습니다. 마찬가지로 다른 언어에서도 헤더 당 하나의 지배적 인 레코드 / 구조 / 클래스 / 유형 / 인터페이스 / blorb를 원하지만 관련 헬퍼 또는 컨테이너도 포함하기로 결정할 수 있습니다.

(컴포넌트 모델을 사용할 필요는 없지만, 이와 같이 깊고 구체적인 클래스 계층 구조가 있다면 나중에 스스로를 미워할 것입니다.)


예를 들어 계층 구조를 사용하고있었습니다. 나는 그것이 더 나은 의미를 강조한다고 느꼈다. 실제 코드에서는 구성 요소를 향해 노력하고 있습니다.
공산주의 오리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.