내부 애플리케이션을위한 내부 라이브러리를 개발해야하는 이유


10

내부 응용 프로그램 개발 전용으로 사용할 내부 라이브러리를 개발해야하는 이유를 이해하는 데 어려움이 있습니다. 조직 외부의 누군가가 작성한 소프트웨어를 사용하려면 헤더 파일과 .a 또는 .so 파일을 보내서 프로젝트에 링크 할 수 있습니다 (동일한 환경에서 컴파일되었다고 가정). .

그러나 헤더 및 구현 파일에 액세스 할 수 있고 소스 트리에 포함시키고 모두 함께 컴파일 할 수있을 때 내부 응용 프로그램에 연결되도록 내부 라이브러리를 개발 해야하는 이유는 무엇입니까?

다시 말해, 일부 소스 코드가 작성된 경우 이진 라이브러리로 컴파일하여 응용 프로그램에 연결하거나 프로젝트의 소스 파일에 포함시키고 정기적으로 컴파일해야하는지 어떻게 결정합니까?

각 프로젝트에 '포함'파일을 말할 때 각 파일을 복사하여 현재 개발중인 프로젝트의 소스 트리에 붙여 넣는 것은 아닙니다. 일반적인 방법으로 프로젝트 파일에 포함될 수있는 공통 소스 코드를 포함하는 디렉토리 / 라이브러리 (모든 프로젝트와 분리)를 개발하는 것을 의미합니다 (예 : #include).

추신 : 나는 여러 데스크탑 응용 프로그램을위한 c / c ++ 개발에 대해 이야기하고 있습니다.


답변:


25

내부 사용 을 위해 라이브러리 및 공유 라이브러리 (.dll 또는 .so 파일) 를 작성하는 데는 여러 가지 이유가 있습니다 .

  1. 프로젝트 간 재사용이 훨씬 깨끗합니다.
  2. 책임 분리-코드의 일부가 다른 개발자 나 팀에 더 적합 할 수 있습니다.
  3. 특정 코드를 찾을 필요없이 다른 팀이 만든 라이브러리를 개선 할 수 있습니다
  4. 더 빠른 빌드 시간, 라이브러리가 안정적인 경우 다시 빌드 할 필요가 없습니다.
  5. 디스크 공간-프로젝트에서 라이브러리와 헤더 만 가질 수 있습니다
  6. 공유 라이브러리를 사용하는 경우 여러 프로그램에서 사용중인 경우에도 RAM에 하나의 사본 만로드하여 메모리를 절약 할 수 있습니다.
  7. 일반적으로 라이브러리에 대한 더 나은 문서화 및 테스트로 끝납니다.
  8. 사물을 라이브러리로 구성하는 것에 대한보다 깔끔한 디자인과 코드 생각은 각 라이브러리에서 관련 기능 그룹을 생성해야 하며, 애플리케이션의 특정 애플리케이션 과 앱의 일반 코드 를 라이브러리로 분리하는 경향 이 있습니다 .
  9. 라이브러리에 독점 알고리즘이있는 경우 계약자 나 외부 팀이 소스에 접근하는 것을 허용하지 않는 등 소스에 대한 액세스를 제한 할 수 있습니다.
  10. - 라이브러리 코드가 자랑 것을 원래, 일부 기업은 심지어 오픈 소스 라이브러리로 알려져있다의 일환으로 작성된 응용 프로그램에 다른 라이센스하에 둘 수있다 기여 오픈 소스 커뮤니티의 주요 명성 언젠가 주요 개선 사항을 얻고 뒤.

일부 회사는 도서관을 만드는 프로젝트가 재사용 할 때마다 상환을받는 회계 관행을 가지고 있습니다.


1
또는 9 지점의 변형에서 기본 응용 프로그램 코드와 다른 라이센스로 라이브러리를 릴리스 할 수 있습니다.
Michael Borgwardt '

@MichaelBorgwardt-위의 좋은 점 프롬프트 포인트 10.
Steve Barnes

또한 코드를 별도의 라이브러리로 사용하면 "여기에이 추가 매개 변수를 추가하겠습니다"와 같이 프로그래밍하는 동안 바로 가기를 피하고 필요한 기능을 구현하는 더 나은 방법을 찾는 데 도움이됩니다.
Valdas

11

더 크고 사소한 프로젝트에 적용될 수있는 다른 가능한 이유는 다음과 같습니다.

  • 컴파일 시간 : 수천 개의 파일, 수천 개의 클래스, 함수 등을 포함하는 거대한 단일 C ++ 프로젝트는 컴파일하는 데 시간이 오래 걸릴 수 있습니다 (몇 줄의 코드를 변경할 때마다 다시 컴파일하려는 경우 생산성이 저하됩니다). 정적으로 링크 된 라이브러리와 동적으로 링크 된 라이브러리는 독립적으로 컴파일되며 소스가 변경되지 않은 경우 다시 컴파일 할 필요가 없습니다.

  • 별개의 모듈 또는 하위 시스템의 논리적 분리 : 별개의 기능 영역이 별개의 모듈에 배치되는 경우 일반적으로 큰 시스템을 관리하기가 쉬우 며 개발자는 수천 개의 파일 / 클래스가 포함 된 거대한 폴더 / 프로젝트를 검색하지 않아도됩니다.

  • 개발자 / 팀 간의 경계 : 동시에 별도의 새로운 기능을 구축하는 개발자는 각 개발자가 서로 다른 모듈에서 작업 할 수있는 경우 병합 충돌 가능성을 줄일 수 있습니다.

  • 라이브 환경으로 공개해서는 안되는 코드 : 예를 들어 개발자 테스트에 라이브 시스템 구성 요소 (하드웨어, API, 원격 시스템, 데이터베이스 등)를 대체하기 위해 사용되는 단위 테스트 라이브러리 또는 '모의'라이브러리

  • 컴파일러 플래그 : 이상한 컴파일러 플래그를 기대하는 타사 API와 통합하는 매우 불행한 위치에있는 경우 라이브러리는 타사 API와 나머지 응용 프로그램 사이에있는 "오염 제거 계층"이 될 수 있습니다.

  • 선택적 기능 / 최적화 : 대규모 시스템에서 응용 프로그램의 기본 기능에 중요하지 않은 경우 동적으로 링크 된 특정 모듈을 런타임에 메모리에로드하기 전에 응용 프로그램이 대기 할 수 있습니다.


일반적으로 많은 내부 프로젝트는 종종 소규모 마이크로 앱으로 별도의 라이브러리로 분류되지 않는 이점이 있습니다. 작은 개발자로 작은 프로젝트를 수행하는 경우 코드를 라이브러리로 분할하는 것에 대해 걱정할 필요가 없습니다 (아직 ...). YAGNI 원칙을 잊지 마십시오 .


3
@ downvoter-downvote의 이유를 설명해 주시겠습니까? 답변에 대한 피드백은이 사이트의 품질을 향상시키는 데 유용합니다.
벤 Cottrell

4

원래 질문으로 인해 다른 답변 대부분이 여기에 오해되었을 수 있습니다. 프로젝트 전체에서 기존 코드 를 복사 하지 않고 reference 와 다른 프로젝트의 동일한 소스 파일을 포함 시키려고하므로 "중복 코드"인수와 다른 많은 인수가 의미가 없습니다.

이것은 때때로 현명한 기술인 경우도있다 . 실제로, 프로젝트 전체에서 재사용하려는 모든 소스 파일을 하나의 개별 포함 폴더에 넣을 때 이미 바이너리 라이브러리가 아닌 소스 코드 라이브러리 인 라이브러리를 이미 빌드했습니다. 특히 C ++에서 템플릿을 사용하여 일반 라이브러리를 만들 때 간단한 포함이 필요하고 별도의 링크 준비가 필요없는 헤더 전용 라이브러리가있는 것은 드문 일이 아닙니다.

그래서 당신의 실제 질문은 언제 소스 코드 라이브러리를 빌드 할 것인지, 또는 사전 컴파일 된 바이너리 라이브러리를 선호 할 것입니까? 이러한면에서 이 사이트에 나이가 대답 , 어쩌면 그것은 당신을 도움이 헤더 전용 libs와의 몇 가지 장점과 단점을 논의했다. 소스 코드 라이브러리의 주요 장점은 라이브러리를 사용하는 응용 프로그램과 동일한 런타임 및 / 또는 호환 가능한 컴파일러 / 링커 플래그로 컴파일 할 필요가 없다는 것입니다. 단점은 추가 컴파일 시간과 소스 코드에 대한 액세스를 제공하기위한 요구 사항입니다 (이것은 분명히 "내부"프로젝트의 종류에는 문제가되지 않습니다).


필자는 일반적인 #include 지시문을 통해 필요한 파일을 참조하는 여러 프로젝트에 공통되는 소스 코드 라이브러리를 의미한다는 것이 사실입니다. 지금 질문하십시오. 연결된 답변도 매우 유용합니다.
Andrew Murtagh '

@AndrewMurtagh : MichaelBorgwardt의 답변을 너무 빨리 받아 들였다는 사실은 그가 저를 오해 한 것으로 보였기 때문에 저를 놀라게했습니다.
Doc Brown

글쎄 그는 여러 프로젝트에 공통적 인 코드를 단일 패키지 (이진 라이브러리 또는 소스 코드 라이브러리에 상관없이)로 그룹화 할 때의 초기 혼란을 분명히했지만 소스의 단일 디렉토리를 갖는 것에 대해 이야기하고있었습니다. 프로젝트간에 공유 할 수 있고 필요할 때마다 각 파일을 각 프로젝트에 복사하여 붙여 넣을 수없는 코드.
Andrew Murtagh '

2

다른 주석 작성자가 코드를 복제해서는 안된다고 작성할 때 동의합니다. 그러나 귀하의 경우 (또는 함께 일하는 사람들)는 다른 곳에서 복제 되지 않은 코드에 대한 라이브러리를 작성하는 것 같습니다 .

이 경우에는 조기 일반화에 주의하십시오 . 종종 코드 조각을 재사용 할 수있는 느낌이 드는 경우 가 있습니다. 그러나 두 번째 유스 케이스가 이러한 코드를 사용하는 방법에 대한 자세한 내용을 알지 못하면 추가 사례에서 실제로 유용하지 않거나 잘못된 것으로 가정하는 "재사용 성"기능에 추가 시간을 소비하는 것이 매우 쉽습니다. 두 번째 경우.

하나의 유스 케이스에 대해 "라이브러리"를 작성하면 아무런 보상없이 매우 비싼 연습이 될 수 있습니다.

비용 예 :

  1. "일반적인"사용 사례를 고려하는 데 소요되는 시간 / 에너지
  2. "라이브러리"를 "클라이언트"(자신의 코드)에 배포 할 수있는 시간
  3. 다음 사용 사례와 완전히 일치하지 않더라도 "라이브러리"를 사용해야한다는 향후 압력

내 일반적인 규칙은 : 코드가 필요한 장소가 적어도 두 곳 이상이 아닌 한 코드를 라이브러리에 만들지 마십시오.


2
코드가 모두 단일> 20k 라인 소스 파일에있는 이유와 일부 개발자가 사용하는 거의 동일한 이유를 보았습니다. 기발한 이름 지정 및 열악한 주석과 결합하면 곧 유지 관리하는 것보다 다시 작성하는 것이 더 빠른 코드가 생깁니다.
Steve Barnes

요점 : 필자는 유지 관리 가능하고 읽을 수있는 코드 작성에 반대하지는 않습니다. 별도의 파일, 잘 알려진 메서드 / 클래스 및 패키지 구조는 모두 유지 관리의 중요한 구성 요소입니다. 필자의 요점은 "라이브러리"에 대한 단일 사용 사례가있을 때 라이브러리 작성 및 배포 비용이 매우 많이 든다는 것입니다.
Sam

1
반대로 나는 모든 경우에 반드시 라이브러리를 패키징하고 배포해야한다고 주장하지는 않습니다. 코드가 언젠가 라이브러리가 될 수있는 것처럼 작성하고 구조화 하는 것이 일반적으로 약간의 노력을 기울일 필요가 있으며 코드가 결코 없어지지 않더라도 배당금을 지불하는 경우가 많습니다 라이브러리로 배포됩니다.
Steve Barnes

1

헤더와 구현 파일에 액세스 할 수 있고 소스 트리에 포함시키고 모두 함께 컴파일 할 수있을 때 내부 응용 프로그램에 연결되도록 내부 라이브러리를 개발 해야하는 이유는 무엇입니까?

"내 소스 트리에 포함시키기 만하면" 코드복제 되기 때문 입니다.

문제는 코드를 복사 한 프로젝트에서 수행 한 개선 (중요 버그 수정 포함)의 이점을 얻지 못하거나 개선 한 내용의 이점도 없다는 것입니다.

최신 버전의 코드를 소스 트리에 정기적으로 복사하여 git 또는 이와 비슷한 서브 모듈을 사용하여 자동화 하여이 문제를 해결할 수 있다고 생각할 수도 있습니다. 그러나 호환되지 않는 API 변경으로 인해 빌드가 계속 중단됩니다. 반면에 라이브러리에는 클라이언트와 협력하지 않고 개발자가 변경할 수없는 "공식"공개 API가 있습니다.

마지막으로 기술적 인 이유가있을 수 있습니다. 코드의 일부를 라이브러리로 유지하여 필요할 때로드하거나 언로드 할 수 있으므로 기능이 필요하지 않을 때 메모리 사용량을 줄일 수 있습니까?


1
내가 이해하는 것처럼, 일부 코드를 라이브러리로 만드는 주된 이유는 코드가 복제, 업데이트, 유지되지 않도록하기 위해 다른 프로젝트 (모든 내부에서 개발 된 경우에도)에서 사용될 때입니다. 갈라져? 그리고 단일 프로젝트 만 개발하려는 경우 나중에 추가 프로젝트에서 사용하려는 경우를 제외하고 라이브러리에 무언가를 만들 필요가 없습니다.
Andrew Murtagh '

@AndrewMurtagh : 그렇습니다. 정확히 제가 어떻게 넣었는지입니다. 기술적 인 이유도있을 수 있지만; 나는 C / C ++ 개발에 익숙하지 않다-라이브러리의 코드가 필요할 때 코드를 선택적으로로드하거나 필요에 따라로드하거나 언로드 할 수 있으므로 기능이 필요하지 않을 때 메모리 사용량을 줄일 수 있습니까?
Michael Borgwardt

공유 라이브러리를 통해 가능할 수 있다고 생각합니다. 설명해 주셔서 감사합니다. 답변을 수락 된 것으로 표시하겠습니다.
Andrew Murtagh '

지난 10 년 동안 거의 모든 VCS는 외부 참조 또는 하위 모듈을 지원합니다. 이것은 중복 코드와 버그 수정 문제를 제거했습니다. 이들이 여전히 유효한 문제라고 생각할 경우 이것이 왜 실행 가능한 해결책이 아닌지에 대한 자세한 정보를 포함 할 수 있습니다.
Sirisian

유지 관리도 생각하십시오. 1) lib는 독립적으로 그리고 병렬로 유지 될 수 있습니다. 2) 코드를 쉽게 교체 할 수 있습니다. 3) 소규모 코드 기반은 소규모 팀이 관리하기 쉽고 모든 사람이 이해하기 쉽습니다. 4) 출시 시간이 중요한 경우 더 빠른 빌드를 선호합니다. libs의 코드는 파이프 라인 (IMO)에서 반복해서 컴파일하지 않는 코드입니다. 5) 신뢰할 수있는 재사용 가능한 코드입니다 ... 당신은 그것을 만들었습니다 ;-)
Laiv

1

솔루션의 장기 실행 비용에 대해 자세히 설명하겠습니다.

분명히, 라이브러리를 프로젝트에 추가하는 것이 처음이라면 위의 모든 오버 헤드가 있습니다. 워크 플로를 변경해야하는 경우가 종종 있습니다. 때로는 인프라와 일부 팀원도 좋아하지 않을 수도 있습니다 (처음에는). 덜 비용을 부과 그래서 솔루션의 장점은 명백하다 지금 .

그러나 프로젝트가 성장함에 따라 "의사 라이브러리"비용도 증가합니다. A응용 프로그램과 단위 테스터가 사용 하는 "의사 라이브러리"가 있다고 가정합니다 . 에 cpp를 추가 할 때마다 A두 프로젝트 모두에 cpp를 추가해야합니다. 그렇지 않으면 연결되지 않습니다.

"의사 라이브러리"가 다른 "의사 라이브러리"에 의해 사용되면 B어떻게됩니까? 많은 프로젝트에 새 cpp를 추가해야합니다. 그리고 경우 B스위치 또 다른 라이브러리를 사용 하는가? 에 A따라 모든 프로젝트에서 cpps를 삭제해야합니다 B.

실제 라이브러리를 사용한다면이 모든 것이 무료입니다. 문제는 실제 라이브러리로의 이동을 정당화하기 위해 얼마나 많은 cpp가 필요합니까?

그러나 더 많은 담보가 있습니다. 개발자는 새로운 cpp를 필요로하는 모든 프로젝트를 사냥하는이 어리석은 작업을 좋아하지 않으며 기존 파일에 어딘가에 코드 / 클래스를 추가 할 것입니다. 장기적으로.

따라서 "의사-라이브러리"를 사용하는 것이 모 놀리 식 프로젝트를 분해하는 첫 단계가 될 수 있지만, 실제 라이브러리를 활용하여 장점을 활용할 수 있으려면 너무 오래 기다려서는 안됩니다.


0

그러나 헤더 및 구현 파일에 액세스 할 수 있고 소스 트리에 포함시키고 모두 함께 컴파일 할 수있을 때 내부 응용 프로그램에 연결되도록 내부 라이브러리를 개발 해야하는 이유는 무엇입니까?

라이브러리가 하나의 응용 프로그램 에서만 사용되는 경우 별도의 라이브러리로 필요 하지 않을 수 있습니다.

라이브러리가 3500 응용 프로그램에서 사용하는 경우에 당신은 절대적으로 별도의 라이브러리로 필요합니다.

라이브러리에 버그가 있고 수정해야하는 경우 어떻게합니까? 또는 어떤 법적 또는 규제 변화는 그 수단에 따라 제공 방법 라이브러리 작품을 변경?

별도의 라이브러리에있는 경우 (잠재적으로) 라이브러리를 수정하고 다시 테스트하고 다시 배포하면 모든 응용 프로그램 이 수정의 이점을 얻을 수 있습니다.

각 응용 프로그램에 "로컬"인 소스 코드에만있는 경우 모든 응용 프로그램을 개별적 으로 변경, 재 구축, 재 테스트 및 재배포해야합니다 . 그것은 훨씬 더 큰 운동입니다.

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