대부분의 대규모 응용 프로그램에서는 일반적으로 "상수"위치가 몇 군데 있습니다.
- GUI 및 내부 상수에 대한 하나의 클래스 (탭 페이지 제목, 그룹 상자 제목, 계산 요소, 열거)
- 데이터베이스 테이블 및 열에 대한 하나의 클래스 (이 부분은 코드가 생성됨)와 읽을 수있는 이름 (수동으로 할당 됨)
- 응용 프로그램 메시지 (로깅, 메시지 상자 등)를위한 하나의 클래스
상수는 일반적으로 해당 클래스에서 다른 구조체로 분리됩니다. C ++ 애플리케이션에서 상수는 .h 파일에만 정의되며 값은 .cpp 파일에 지정됩니다.
장점 중 하나는 모든 줄 등이 하나의 중앙 위치에 있으며 모든 것이 무언가를 변경해야 할 때 찾을 위치를 알고 있다는 것입니다.
이것은 특히 사람들이 들어오고 갈 때 프로젝트 관리자가 좋아하는 것이므로 모든 사람이 응용 프로그램의 구조를 파지 않고도 사소한 것을 바꿀 수 있습니다.
또한 유사한 그룹 박스 / 탭 페이지 등의 제목을 한 번에 쉽게 변경할 수 있습니다. 또 다른 측면은 해당 클래스를 인쇄하여 프로그래머가 아닌 사람에게 제공하여 캡션이 직관적인지 여부와 사용자에게 보내는 메시지가 너무 상세하거나 혼동되는지 등을 확인할 수 있다는 것입니다.
그러나 특정 단점이 있습니다.
- 모든 단일 클래스는 상수 클래스와 밀접하게 연결되어 있습니다.
- 상수를 추가 / 제거 / 이름 바꾸기 / 이동하려면 응용 프로그램의 최소 90 %를 다시 컴파일해야합니다 (참고 : 값을 변경해도 C ++에서는 그렇지 않습니다). 1500 개의 클래스가있는 C ++ 프로젝트 중 하나에서 이는 약 7 분의 컴파일 시간 (사전 컴파일 된 헤더 사용, 약 50 분)과 특정 정적 라이브러리에 대한 약 10 분의 링크를 의미합니다.
- Visual Studio Compiler를 통해 속도 최적화 릴리스를 빌드하는 데 최대 3 시간이 걸립니다. 엄청난 양의 계급 관계가 소스인지는 모르겠지만 그럴 수도 있습니다.
- 무언가를 매우 빠르게 테스트하고 해당 테스트를 위해 15 분을 기다리지 않기 때문에 일시적으로 하드 코드를 코드로 직접 코드화해야합니다. 모든 사람은 "나중에 고칠 것"이라는 생각을 알고 있습니다.
- 다른 프로젝트에서 클래스를 재사용하는 것이 항상 쉬운 것은 아닙니다 (주로 다른 단단한 커플 링으로 인해 상수 상수를 사용하는 것이 쉽지 않습니다).
그런 상수를 어디에 저장 하시겠습니까? 또한 위에 나열된 이점을 준수하는 더 나은 개념이 있음을 프로젝트 관리자에게 확신시키기 위해 어떤 주장을 제기 하시겠습니까?
C ++ 전용 또는 독립적 인 답변을 자유롭게 제공하십시오.
추신 : 나는이 질문이 주관적이라는 것을 알고 있지만 솔직히이 종류의 질문에 대해이 사이트보다 더 좋은 곳을 모릅니다.
이 프로젝트에서 업데이트
컴파일 시간에 대한 소식이 있습니다
.Caleb와 gbjbaanb의 게시물에 따라 시간이있을 때 상수 파일을 다른 여러 파일로 나눕니다. 또한 결국 내 프로젝트를 여러 라이브러리로 분할하여 훨씬 쉽게 할 수있었습니다. 이것을 릴리스 모드에서 컴파일하면 데이터베이스 정의 (테이블, 열 이름 및 8000 개 이상의 기호)를 포함하고 특정 해시를 빌드하는 자동 생성 파일이 릴리스 모드에서 컴파일 시간이 엄청나게 증가하는 것으로 나타났습니다.
DB 상수를 포함하는 라이브러리에 대한 MSVC의 옵티 마이저를 비활성화하면 릴리스 모드 에서 프로젝트 (여러 응용 프로그램)의 총 컴파일 시간을 최대 8 시간에서 1 시간 미만 으로 줄일 수있었습니다 !
아직 MSVC가 이러한 파일을 최적화하는 데 어려움을 겪는 이유를 아직 알지 못했지만, 이제는 더 이상 야간 빌드에만 의존 할 필요가 없기 때문에 이러한 변경으로 인해 많은 압박이 완화됩니다.
그 사실-그리고 덜 단단한 커플 링, 더 나은 재사용 성 등과 같은 다른 이점은 또한 "상수"를 나누는 데 시간을 보내는 것이 그렇게 나쁜 생각이 아니라는 것을 보여주었습니다. ;-)
업데이트 2
이 질문은 여전히 주목을 받고 있기 때문에
지난 몇 년 동안 내가 한 일이 있습니다.
모든 상수, 변수 등을 관련 범위에 정확하게 넣으십시오. 단일 메소드에서만 상수를 사용하는 경우 해당 메소드에서 정의하는 것이 좋습니다. 단일 클래스에 관심이있는 경우 해당 클래스의 개인용 구현 세부 사항으로 두십시오. 네임 스페이스, 모듈, 프로젝트, 회사 범위에도 동일하게 적용됩니다. 또한 도우미 기능 등에 동일한 패턴을 사용합니다. (공개 프레임 워크를 개발하는 경우 100 % 적용되지 않을 수 있습니다.)
이렇게하면 재사용 성, 테스트 가능성 및 유지 관리 성이 향상되어 컴파일 시간 (적어도 C ++에서)이 줄어들뿐만 아니라 버그 수정에 더 적은 시간이 소요되므로 실제로 새로운 기능을 개발하는 데 더 많은 시간을 할애 할 수 있습니다. 동시에 더 많은 코드를 더 쉽게 재사용 할 수 있기 때문에 이러한 기능의 개발이 더 빨라집니다. 이것은 중앙 상수 파일이 가질 수있는 모든 이점보다 중요합니다.
더 자세히 알고 싶다면 특히 인터페이스 분리 원칙 과 단일 책임 원칙을 살펴보십시오 .
동의한다면,이 업데이트는 기본적으로 그가 말한 것을 더 일반적으로 받아들이 기 때문에 Caleb의 대답을 찬성하십시오.