코드 재사용

Code reuse

코드 재사용(소프트웨어 재사용이라고도 함)은 재사용 가능 원칙에 따라 기존 소프트웨어 또는 소프트웨어 지식을 사용하여 새로운 [1][2]: 7 소프트웨어를 구축하는 것입니다.

코드 재사용 기술을 다른 방법에 의해 프로그래밍 언어 선택의 복잡성과 코드처럼 하위 수준의 접근법(몇몇 정보들을 통해 예를 들어)[3] 간단한 기능(절차나 서브 루틴으로)이나 사물 또는 기능의 많은 모듈들로:7또는 사용자 지정 네임 스페이스, Santa(예를 들어 도서관)[4][2]조직 copy-pasting에서 범위에 따라 달성될 수 있다.kages, frameworks 또는 소프트웨어 스위트(고부하)를 사용합니다.

코드 재사용은 코드 유지보수를 어렵게 할 수 있는 의존관계를 의미합니다.적어도 한 연구에서는 코드 재사용이 기술적 [5]부채를 줄여준다는 사실이 밝혀졌습니다.

개요

애드혹 코드 재사용은 프로그래밍 초기부터 실행되어 왔습니다.프로그래머는 항상 코드, 템플릿, 함수 및 프로시저의 섹션을 재사용해 왔습니다.그러나 소프트웨어 엔지니어링에서 인정된 연구 분야로서의 소프트웨어 재사용은 Bell Laboraties의 Douglas McIlroy가 재사용 가능한 컴포넌트를 기반으로 소프트웨어 산업을 제안했던 1968년부터 시작되었습니다.

코드 재사용은 소프트웨어 제품 개발 [6]프로세스에서 이미 생성된 자산을 활용하여 시간과 자원을 절약하고 중복성을 줄이는 것을 목적으로 합니다.재사용의 핵심 아이디어는 한 번에 작성된 컴퓨터 프로그램의 일부가 나중에 작성된 다른 프로그램의 구성에 사용될 수 있거나 사용되어야 한다는 것입니다.

코드 재사용은 재사용 가능한 자산의 별도 유지 관리 버전을 생성하는 것을 의미할 수 있습니다.코드가 재사용 대상으로 선택된 가장 일반적인 리소스이지만 개발 사이클 중에 생성된 다른 자산(소프트웨어 컴포넌트, 테스트 스위트, 설계, 문서 등)[7]은 재사용 기회를 제공할 수 있습니다.

소프트웨어 라이브러리는 코드 재사용의 좋은 예입니다.프로그래머는 프로그램의 특정 부분을 재사용할 수 있도록 내부 추상화를 작성하거나 사용자 정의 라이브러리를 작성할 수 있습니다.소프트웨어를 보다 쉽게 재사용할 수 있도록 하는 특징으로는 모듈화, 느슨한 결합, 높은 응집력, 정보 은폐문제 분리 등이 있습니다.

새로 작성된 코드가 기존 코드의 일부를 사용하려면 일종의 인터페이스 또는 통신 수단을 정의해야 합니다.여기에는 일반적으로 서브루틴, 객체, 클래스 또는 프로토타입의 "콜" 또는 사용이 포함됩니다.조직에서는 소프트웨어 제품 라인 엔지니어링이라고도 하는 도메인 엔지니어링에 의해 이러한 프랙티스가 공식화 및 표준화됩니다.

기존 프로그램의 이전 버전을 다음 버전의 시작점으로 사용하는 일반적인 관행도 코드 재사용의 한 형태입니다.

소위 "재사용"이라고 불리는 일부 코드에는 단순히 기존 프로그램에서 새 프로그램으로 코드 일부 또는 전부를 복사하는 것이 포함됩니다.조직은 이 접근방식을 통해 신제품의 시장 출시 기간을 단축할 수 있지만, 그 에는 컷 앤 페이스트 프로그래밍으로 인해 발생하는 동일한 코드 복제 문제에 직면할 수 있습니다.

많은 연구자들이 더 빠르고, 쉽고, 체계적이며, 정상적인 프로그래밍 프로세스의 필수적인 부분을 재사용하기 위해 노력해 왔습니다.이것들은 객체 지향 프로그래밍의 발명의 배후에 있는 주요 목표들 중 일부이며, 이것은 가장 일반적인 형태의 공식화된 재사용이 되었습니다.좀 더 늦은 발명품은 범용 프로그래밍이다.

또 다른 새로운 수단은 소프트웨어 "제너레이터"를 사용하는 것입니다.제너레이터는 사용자가 선택한 파라미터에 따라 특정 유형의 새로운 프로그램을 만들 수 있는 프로그램입니다.이러한 시스템에 대한 연구 분야는 생성 프로그래밍메타프로그래밍입니다.

재사용의 종류

동기 부여 및 추진 요소에 관해 재사용은 다음과 같습니다.

  • 기회주의 – 프로젝트를 시작할 준비를 하면서 팀은 재사용할 수 있는 기존 컴포넌트가 있음을 깨닫습니다.
  • 계획 – 팀은 컴포넌트를 향후 프로젝트에서 재사용할 수 있도록 전략적으로 설계합니다.

재사용은 더 자세히 분류할 수 있습니다.

  • 내부 재사용 – 팀은 자체 구성요소를 재사용합니다.프로젝트에 중요한 컴포넌트를 제어하고 싶을 수 있기 때문에 이는 비즈니스상의 결정일 수 있습니다.
  • 외부 재사용 – 팀은 서드파티제 컴포넌트의 라이선스를 선택할 수 있습니다.서드파티제의 컴포넌트에 라이선스를 부여하려면 일반적으로 사내 [8]개발 비용의 1~20%가 소요됩니다.팀은 컴포넌트를 찾아 학습하고 통합하는 데 걸리는 시간도 고려해야 합니다.

재사용 형태 또는 구조에 관한 코드는 다음과 같습니다.[9]

  • Referenced – 클라이언트 코드에는 재사용된 코드에 대한 참조가 포함되어 있습니다.따라서 클라이언트 코드에는 라이프 사이클이 다르며 버전도 다를 수 있습니다.
  • Forked – 클라이언트 코드에는 재사용된 코드의 로컬 또는 개인 복사본이 포함되어 있으므로 단일 라이프 사이클과 단일 버전을 공유합니다.

포크 재사용은 코드 복제의 한 형태이기 때문에 권장되지 않습니다.이는 각 복사본에서 모든 버그를 수정해야 하며 재사용된 코드에 대한 확장 기능은 모든 복사본에서 수동으로 병합하거나 구식이 됩니다.그러나 포크 재사용에는 분리, 재사용 코드 변경 유연성, 패키징, 도입 및 버전 [9]관리 등의 이점이 있습니다.

체계적

체계적인 소프트웨어 재사용은 소프트웨어 산업의 생산성을 높이고 품질을 향상시키기 위한 전략입니다.개념은 단순하지만 소프트웨어 재사용을 성공적으로 구현하는 것은 실제로 어렵습니다.그 이유는 소프트웨어 재사용이 구현되는 컨텍스트에 의존하기 때문입니다.체계적인 소프트웨어 재사용과 관련하여 대처해야 할 몇 가지 문제가 있습니다.[10]

  • 명확하고 명확하게 정의된 제품 비전은 소프트웨어 제품군(SPL)의 필수적인 기반입니다.
  • 진화적 구현 전략은 회사에 더 실용적인 전략이 될 것입니다.
  • 성공을 보장하기 위해 지속적인 경영 지원과 리더십이 필요합니다.
  • SPL 엔지니어링을 지원하려면 적절한 조직 구조가 필요합니다.
  • 프로젝트 중심적인 회사에서 제품 중심적인 회사로 사고방식을 바꾸는 것이 필수적입니다.

소프트웨어 라이브러리

코드 재사용의 매우 일반적인 예는 소프트웨어 라이브러리를 사용하는 기술입니다.다른 유명한 형식 간의 정보 변환, 외부 스토리지 액세스, 외부 프로그램과의 인터페이스, 또는 정보(숫자, 단어, 이름, 위치, 날짜 등)를 공통적으로 조작하는 것과 같은 많은 공통 작업이 다양한 프로그램에 의해 필요합니다.새로운 프로그램 작성자는 조작을 수행하기 위해 완전히 새로운 코드를 프로그램에 직접 작성함으로써 "바퀴를 다시 발명"하는 대신 소프트웨어 라이브러리의 코드를 사용하여 이러한 작업을 수행할 수 있습니다.라이브러리의 실장에서는, 많은 경우, 충분한 테스트를 실시해, 비정상적이거나 난해한 케이스를 커버하는 메리트가 있습니다.단점으로는 퍼포먼스나 원하는 출력에 영향을 줄 수 있는 세부사항을 조정할 수 없다는 점, 라이브러리의 [11]취득, 학습 및 구성에 소요되는 시간과 비용 등이 있습니다.

설계 패턴

설계 패턴은 반복되는 문제에 대한 일반적인 해결책입니다.디자인 패턴은 유형적이기보다는 개념적이며 정확한 요구에 맞게 수정할 수 있습니다.단, 추상 클래스 및 인터페이스를 사용하여 특정 패턴을 구현할 수 있습니다.

프레임워크

개발자는 일반적으로 타사 애플리케이션 및 프레임워크를 통해 대규모 소프트웨어를 재사용합니다.프레임워크는 보통 도메인마다 다르며 애플리케이션[citation needed] 제품군에만 적용됩니다.

고차 함수

기능 프로그래밍에서는 설계 패턴 또는 프레임워크가 이전에 사용되었던 많은 경우에 고차 함수를 사용할 수 있습니다.

레트로 컴퓨팅

레트로컴퓨팅은 단순히 레트로 프로그램이 오래된 컴퓨터 또는 에뮬레이터에서 실행된다는 이유만으로 코드를 재사용하는 것을 포함합니다.

컴퓨터 보안

컴퓨터 보안에서는 코드 재사용이 소프트웨어 악용 [12]방법으로 사용됩니다.공격자는 예를 들어 W^X 등의 코드 주입 방어가 존재하는 경우 프로그램의 제어 흐름을 수정하기 위해 코드를 직접 입력할 수 없는 경우 제어 흐름을 메모리에 존재하는 코드 시퀀스로 리다이렉트할 수 있습니다.

코드 재사용 공격의 예로는 Return-to-libc 공격, 리턴 지향 프로그래밍 및 점프 지향 프로그래밍이 있습니다.[12][13]

구성 요소들

컴포넌트는 오브젝트 지향의 범위 내에서 일련의 콜라보레이션클래스(또는1개의 클래스만)와 그 인터페이스를 나타냅니다.인터페이스는 컴포넌트의 교환을 가능하게 합니다.재사용 가능한 컴포넌트는 CSCM([citation needed]컴포넌트 Source Code Management Technologies)을 사용하여 SCM 저장소 간에 분리 및 동기화할 수도 있습니다.

외부 컴퓨터

"코드 재사용"의 전체 개념은 소프트웨어 외부의 엔지니어링 애플리케이션을 포함할 수도 있습니다.예를 들어 컴퓨터 지원 설계파라메트릭 모델링을 사용하면 재사용 가능한 설계를 만들 수 있습니다.표준화를 통해 상호 운용 가능한 부품이 생성되어 많은 [citation needed]컨텍스트에서 재사용할 수 있습니다.

비판

코드 재사용은 재사용되는 구성 요소에 따라 달라집니다.Rob Pike는 "조금 복사하는 것이 약간의 의존보다 낫다"고 말했습니다.그가 구글에 입사했을 때, 그 회사는 코드 재사용에 중점을 두고 있었다.그는 구글의 코드베이스가 컴파일 속도와 유지 [14]보수성 측면에서 이전 정책의 결과로 인해 여전히 어려움을 겪고 있다고 믿고 있다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Frakes, W.B.; Kyo Kang (July 2005). "Software Reuse Research: Status and Future". IEEE Transactions on Software Engineering. 31 (7): 529–536. CiteSeerX 10.1.1.75.635. doi:10.1109/TSE.2005.85. S2CID 14561810.
  2. ^ a b Reddy, Martin (2011). API design for C++. Boston: Morgan Kaufmann. ISBN 978-0-12-385004-1. OCLC 704559821.
  3. ^ Selaolo, Karabo; Hlomani, Hlomani (2016). "Towards An Algorithms Ontology Cluster: for Modular Code Reuse and Polyglot Programming". Advances in Computer Science. 5: 63 – via Researchgate.
  4. ^ "4. Code Reuse: Functions and Modules - Head First Python, 2nd Edition [Book]". www.oreilly.com. Retrieved 2022-01-26.
  5. ^ Feitosa, Daniel; Ampatzoglou, Apostolos; Gkortzis, Antonios; Bibi, Stamatia; Chatzigeorgiou, Alexander (September 2020). "CODE reuse in practice: Benefiting or harming technical debt". Journal of Systems and Software. 167: 110618. doi:10.1016/j.jss.2020.110618. S2CID 219502749.
  6. ^ Lombard Hill Group. "What Is Software Reuse?". lombardhill.com. Lombard Hill Group. Archived from the original on 23 January 2019. Retrieved 22 October 2014.
  7. ^ Lombard Hill Group. "What Is Software Reuse?". Archived from the original on 23 January 2019. Retrieved 22 October 2014.
  8. ^ McConnell, Steve (1996). Rapid Development: Taming Wild Software Schedules. ISBN 978-1-55615-900-8.
  9. ^ a b Colombo, F. (2011). "It's not just reuse". SharedNow.blogspot.
  10. ^ Champman, M.; Van der Merwe, Alta (2008). "Contemplating Systematic Software Reuse in a Small Project-centric Company". Proceeding SAICSIT '08 Proceedings of the 2008 annual research conference of the South African Institute of Computer Scientists and Information Technologists on IT research in developing countries: riding the wave of technology. doi:10.1145/1456659.1456662. ISBN 978-1-60558-286-3.
  11. ^ "Code reuse". DocForge. Archived from the original on 2011-07-10. Retrieved 3 August 2022.
  12. ^ a b Bletsch, Tyler (2011). Code-reuse Attacks: New Frontiers and Defenses. North Carolina State University. ISBN 978-1-124-75297-6.
  13. ^ Bletsch, Tyler; Jiang, Xuxian; Freeh, Vince W; Liang, Zhenkai (2011). "Jump-oriented programming: a new class of code-reuse attack" (PDF). Proceedings of the 6th ACM Symposium on Information, Computer and Communications Security. ACM. pp. 30–40. doi:10.1145/1966913.1966919. ISBN 978-1-4503-0564-8. Archived from the original (PDF) on 2017-08-07. Retrieved 2017-08-07.
  14. ^ The Go Programming Language (2015-12-01), Go Proverbs – Rob Pike – Gopherfest – November 18, 2015, archived from the original on 2021-12-22, retrieved 26 February 2016

외부 링크