"Source Code Modularization" 요약
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=183638155
※ Source Code Modularization이란 책을 챕터 별로 요약하겠습니다. 소프트웨어 모듈화에 대한 이해를 높이기 위해서 좋은 책입니다.
소프트웨어 시스템은 복잡하고 대규모로, 유지보수 및 진화를 위해 소스 코드로부터 소프트웨어 아키텍처를 추출하는 소스 코드 모듈화가 필요하다.
소프트웨어 모듈화는 소프트웨어 산출물(클래스, 파일, 모듈 등)을 하위 시스템 단위로 분할해 추상적 아키텍처 관점을 제공한다.
소프트웨어 아키텍처를 알면 변경 비용 및 위험 평가, 재사용 가능성 판단이 용이하다.
모듈화는 그래프 분할 문제와 관련 있으며, 응집도(cohesion)와 결합도(coupling)를 최소화/최대화하는 것이 품질 핵심이다.
전방위 산출물(omnipresent artefacts)은 여러 모듈에 걸쳐있어 모듈 분석 시 제외하는 경우가 많으며, 자동 판별은 기술적 도전이다.
소스 코드는 근사적 방법(정규 표현식 등) 또는 정확한 파서 기반 방법으로 분석하여 중간 메타모델을 생성한다.
대표적인 산출물 의존성 그래프에는 호출 의존성 그래프(CDG)와 산출물-기능 의존성 그래프(AFDG)가 있다.
모듈화 방법에는 계층적(상향식/하향식), 비계층적, 데이터 마이닝 기반, 개념 분석, 탐색 기반 방법 등이 있다.
이해도를 높이기 위한 리버스 엔지니어링 도구로는 Understand(다중 언어, 풍부한 시각화)와 NDepend(.NET 정적 분석, 메트릭스 및 규칙 검증)이 있다.
효과적인 소프트웨어 모듈화는 유지보수성, 재사용성, 품질 향상과 비용 절감을 가능하게 한다.
이 요약은 소프트웨어 모듈화 전반에 대한 기본 개념, 기법, 도구, 그리고 품질 요소들의 관계를 포함합니다.
일반적으로 소프트웨어 시스템의 모듈화 과정은 다음의 여섯 단계로 구성됨.
1. 소스 코드 분석: 이 단계에서는 소스 코드를 다양한 문법적 및 의미적 데이터 분석 기법으로 분석하여 소프트웨어 산출물 간의 주요 개념과 관계를 추출하여 ADG(산출물 의존성 그래프)를 생성
2. 산출물 의존성 그래프 생성: 소스 코드를 분석한 후 호출 의존성 그래프(call dependency graph)와 산출물–기능 의존성 그래프(artefact–feature dependency graph)를 만듬.
3. 모듈화: 생성된 ADG를 여러 다른 모듈화 기법으로 분할함
4. 평가: 이 단계에서는 생성된 아키텍처의 품질을 측정함. 보통 외부 평가(external evaluation)와 내부 평가(internal evaluation) 두 가지가 사용됨. 외부 평가는 전문가가 제안한 아키텍처와 비교하는 방식이고, 두 아키텍처가 비슷할수록 성공적인 모듈화로 간주함. 내부 평가는 다양한 지표를 통해 모듈들이 얼마나 잘 분리되었는지를 평가함.
5. 분할 라벨링: 생성된 하위 시스템에 라벨을 달아 참조와 이해를 도움.
6. 시각화: 마지막 단계로, 도출된 모듈을 그래픽 형태로 표현함.
의존성 그래프가 생성된 후, 이 그래프들을 분할하기 위해 모듈화 방법들이 적용함.
계층적 방법(Hierarchical methods) 두 가지 방식으로 적용될 수 있습니다: 상향식(agglomerative, bottom-up)과 하향식(divisive, top-down). 하향식 방법은 처음에 모든 산출물이 하나의 모듈을 형성한다고 가정하고, 반복적인 단계별 분할을 진행합니다. 분할이 더 이상 불가능할 때까지 계속됨. 상향식 방법은 처음에 각 산출물이 별도의 모듈에 있다고 가정하고, 단계별로 가장 유사하거나 거리가 가까운 모듈들을 합쳐 새 모듈을 생성하는 과정을 반복함.
비계층적 방법(Non-hierarchical methods) 배타적이고 평면적인 방법으로, 모듈 수를 미리 정하고 이 수를 고정함. 각 모듈의 평균을 계산해 산출물을 모듈별 평균과의 근접성에 따라 배치하는 방식이며, k-평균 클러스터링과 유사한 알고리즘임.
데이터 마이닝 기반 방법(Data-mining based methods) 연관 규칙(association rules) 등의 데이터 마이닝 기법을 활용해 하위 시스템을 만듬. 다른 모듈화 접근법과 달리 대규모 데이터 처리에 적합하지만, 단일 프로그램과 중첩 계층만 다루며, 이들은 하위 시스템으로 배치할 수 없음.
개념 분석 방법(Concept analysis methods) 절차적 코드에서 아키텍처를 추출하는 데 사용됨.전역 변수와 프로시저 간 관계를 기반으로 추상 데이터 타입이나 산출물 유사성을 찾기 위해 개념 분석이라는 수학적 과정을 활용함.이 알고리즘은 절차적 코드 대상이며, 대규모 소프트웨어 시스템에는 사용하기 어렵다고 알려져 있음.
탐색 기반 방법(Search-based methods) 모듈화 문제를 탐색 문제로 보고 휴리스틱 탐색 기법을 사용해 근사 최적해를 찾음.목표 함수를 사용해 하나의 모듈 내 산출물 간 최대 연결과 서로 다른 모듈 간 최소 연결을 고려하며 탐색을 진행함.
#소프트웨어모듈화 #모듈화 #소프트웨어설계 #응집도 #결합도 #소스코드분석 #소프트웨어아키텍처 #리버스엔지니어링 #소프트웨어유지보수 #코드분석도구 #Understand #NDepend