소프트웨어 개발시 모듈을 파일별로 나누는 방법?

geekforum의 이미지

어떤 프로젝트에 참여하고 있는데.. 여러명이서 같이 개발하고 있습니다.. 함수로 모듈화하고, 자료구조도 잘 정의해놓고 이런것까지는 명확합니다.. 문제는 그런 함수와 자료구조를 어떤 소스파일에 분산시켜 담아놓느냐 하는건데.. 이게 장난이 아니더라구요.
아무리 독립적으로 각 모듈을 분산시키려고 해도 cross 참조를 하게되는 경우를 피할수가 없더군요.. 그래서 #include 를 하나만써도.. 그 헤더파일이 참조하고 있는 다른 헤더파일까지 같이 참조하고.. 또 참조된 헤더파일 내부의 #include가 또다른 헤더를 참조하고...그래서 각 모듈이 헤더를 참조하려면 쓸데없는것까지 다 끌고 들어오게 되거든요..

모듈로 나누는것과 나눠진 모듈을 독립된 파일에 담는것은 매우 다른 문제라는걸 이번에야 깨닫게 되었습니다.. 모듈로 잘 쪼개진.. 1000개의 함수가 있다 하더라도 하나의 헤더파일과 하나의 소스파일에 모두 담아낼수도 있지만 100여개의 파일에 분산시킬수있는 방법도 있지 않겠습니까. 그냥 독립적인 기능을 하는 모듈들끼리 하나의 헤더와 .c에 넣으라고 답변이 올라올듯도 한데요.. 그게 애매한 경우가 수도 없이 존재합니다.
A라는 스트럭쳐가 file_a.h에 있다면.. A가 어떤 하나의 모듈에 종속적일수만은 없어서 될 수 있으면 A와 관련없는것들은 모두 file_a.h에서 제거시켜야만 할테지만.. 그게 불가능합니다.
제 생각에는 file_a.h에 A를 억세스하는 함수의 정의를 놓고 file_a.c에 함수의 body를 넣는게 바람직하다고 보는데. (객체지향적으로 생각한다면 말이죠..) 그 함수가 또다른 자료구조 B를 참조한다 이 말입니다.. 그럼 그 B를 쓰기위해 하는수 없이 file_a.h 내부에다가#include "file_b.h"라는 코드를 넣어줘야 하고.. 이건 file_b.h 도 마찬가지여서 줄줄이 사탕처럼 다른 헤더도 물고 옵니다..

이건 sw설계와는 좀 다른 문제인것 같더군요..
이에 대해 조언이나 잘 나와있는 책이 있다면 추천을 부탁드립니다. 저한테 sw공학책이 있긴하지만.. 독립된 파일에 소스를 모듈별로 분산시켜 담는방법에 대해 언급한곳은 찾아볼수가 없었습니다. 모듈을 파일에 나눠담는 전략에 대한 노하우를 한수 가르쳐 주십시오.. 방법을 모르니 너무 힘들군요..

댓글

안근홍의 이미지

노하운데 갈켜주기 아깝다 켜켜(사실은 누구나 알고있는내용 ^^)

아마추어랑 프로랑 프로그램 작성시 가장 큰 차이는
=> common 즉 프로그램의 기본 틀을 무시한다는 것

프로는 일단 모든 프로그램에서 당연히 사용될 내용을 분류해서 별도로 작성합니다.(100명이든 1000명이든) 그리고는 해당 내용을 모든 사람에게 강제로 사용하게 만듭니다.(이거 안하고 모든 프로그래머가 자기 멋대로 프로그램 짜면 전체적으로 아주 이상한 프로그램 나옵니다.) 그리고나서 또한 각 담당자도 다른 담당자와 이야기해서 공통되는 부분을 또 분리해 냅니다.(설계시에 아주 중요한 작업중 하나가 이거죠^^ 설계가 괜히 필요한 거시 아닙니다.) 그후 당근 공유될 부분은 무조건 common으로 두사람간 공유인 경우는 두사람만의 별도 공유용 common2로 이렇게 모듈을 분리해서 심습니다. 자신만의 소스를 심는 파일도 물론 따로 존재 해야겠죠...

이거 무시하면 위의 님의 말처럼 나중에 아주 이상한 스파게티가 만들어지죠 ^^

익명 사용자의 이미지

첫 단추가 잘못된것이 아닐까여?

1. Process 로 분리 가능한 기능들인가 확인
2. DLL 이나 static library 로 분리 가능하가 확인
3. 정 안되면 Thread 로 분리 가능한가 확인

일단 이정도면 하나 하나의 단위가 그렇게 크지는 경우는 별루
없을 걸요?

그담 문제들은 아래 답들이 잘해주네여~~~!

박응주의 이미지

전 c라 c++로 큰 프로그램을 짜본
적이 없어
잘 모르겠지만
Large-Scale C++ Software Design
이라는
책이 그런 문제에 대해서 많이 언
급을 하고 있는 것 같습니다.

각각의 방법으로 나누었을 때 컴파
일이나
링킹에 걸리는 시간까지 나와있는
걸보면..

온라이서점 같은데 가셔서 목차를
함 참고해보세요.

익명 사용자의 이미지

보통 그렇게 관리하지 않나요 ?
헤더파일, 디렉토리, 라이브러리.. 뭐 이런식의 단계로 모듈단위로 걸러낼수 있겠죠..

어떤 프로그램을 한 파일에 한다면..
아마 그것들은 컴파일하는데에도 엄청난 시간이 걸릴것입니다.

10만라인 짜리 프로그램을 한 파일에 모두 집어넣고 컴파일하는 거랑.

그걸 2000라인짜리 50개정도로 나눈거랑 컴파일 속도에는 엄청난 차이가 있을 것입니다.

익명 사용자의 이미지

그걸 어떻게 나누는가는 ..
개인적인 관점을 차이가 아닐까요 ?
모듈을 어떻게 나누고,
그것을 파일로 구분하는가는..

지금 까지는 기능단위로 분화하는 것이 거의 정설인걸로 알고 있습니다.

그것을 좀더 추상화시킬수 있는 무언가가 필요하다면.
그것을 나타내기위한 다른 모듈을 만들 수도 있겠죠~

결론은 우선을 시스템을 어떤 모듈로서 나눌것인지에 대해서 먼저 생각해야되지 않나.. 하는 것이 저의 생각입니다.

김우일의 이미지

예.. 그 방법 좋네요. 가끔 보이는 방법인데 모든 헤더를 담은 헤더를 넣고 다른 지시자를 써서 빼든지 알아서 하는 방법..
그런데 근본적으로 c는 대규모 프로젝트에는 그다지 적합하지 않은 것 같습니다. 아무래도 java가 편하지요. package도 그렇고...
근본적으로 대규모 프로젝트에는 객체지향 언어가 아무래도 유리하다고 판단됩니다.

익명 사용자의 이미지

아마 개별적으로 컴파일 해서 나중에 링크하시려는것 같은데

저 같은 경우는 헤더에는 되도록 이면 선언(declare)만

소스파일에는 정의(define)만 담습니다. 그리고 헤더에 담는

선언은 그 선언을 사용하는 유저에 따라 다시 여러 파일로

나눕니다. 그러면 유저는 필요한 헤더만 참조 하니까

어느 불필요한 선언(즉 인터페이스)이 변경 되더라도

다시 컴파일할 필요가 없죠. 그런데 이렇게 선언을

여러 파일로 나누다 보면 프로그래밍 도중 중복 되는 이름을

쓸경우가 많습니다. 그래서 연관성이 있는 선언들은

namespace로 묶어 줍니다. 답변이 제대로 됬는지나 모르겠네요.

이런 분리 컴파일과 링크에 관련된 문제는 '브얀 스트라우럽'이

쓴 책에 나와 있으니 참조 하세요.

아시겠지만 이 책은 C/C++의 키워드에 대한 소개보다는

어떻게 프로그래밍을 할것인가에 초점을 맞춘 책입니다.

그럼 부실한 답변을 마치겠습니다.

신동호의 이미지

geekforum에 처음으로 글을 적습니다.
C/C++의 경우에 헤더화일을 자꾸 물고들어가는 경우, 헤더화일만 모은 헤더화일을 만드는 방법이 있습니다.
#include "xx1.h"
#include "xx2.h"
...
이렇게 모아둔 헤더화일만 include하면 되기는 하죠.
유일한 방법인가?
그러나, 이것이 요구하는 답변은 아닌 것 같은데,
구현설계의 문제는 실제 프로그램작성시에 가장 문제가
되는 부분입니다. 요구사항에서 프로그램의 구조를 정하고
정한 프로그램의 구조에서 실제 코드로 구현이 가능하도록
framework(맞는 단어인가?)을 정하는 것은 경험의 문제입니다.
진짜 프로그래머는 이 부분에서 강한 사람이죠.

익명 사용자의 이미지

> 제 생각에는 file_a.h에 A를 억세스하는 함수의 정의를 놓고 > file_a.c에 함수의 body를 넣는게 바람직하다고 보는데. (객체지향적으로 생각한다면 말이죠..) 그 함수가 또다른 자료구조 B를 참조한다 이 말입니다.. 그럼 그 B를 쓰기위해 하는수 없이 file_a.h 내부에다가#include "file_b.h"라는 코드를 넣어줘야 하고.. 이건 file_b.h 도 마찬가지여서 줄줄이 사탕처럼 다른 헤더도 물고 옵니다..
=======================================
이런건 당연한겁니다.
왜 이런걸 금기시하나요?
*.h/*.c 짝으로 모듈화시키고, 다른 모듈이 필요하면, 당연히 #include 문으로 끌어다 쓰는거죠.

file.h 라는 헤더가 있을때 아래처럼 #directive를 쓰시면 여러 다른 모듈 화일에서 동시에 include 한다 하더라도 , 컴파일시는 아래 헤더 화일은 단한번만 include 하게 됩니다.

#ifdef __FILE__H_
void myfucion();
#endif __FILE__H_

다 아시는 얘기였나요?

익명 사용자의 이미지

#ifdef 가 아니라 #ifndef 죠. ^^;; 실수란거 압니당. 호호.

익명 사용자의 이미지

#ifndef __FILE_H_
#define __FILE_H_

void myfunction();

#endif

익명 사용자의 이미지

하하 지송...
성급한 마음에 부실한 답을 올렸군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.