너무 거대한 클래스를 적당하게 쪼개고 싶어요!

badseat의 이미지

안녕하세요

최근 이직에 성공한 낡은신입입니다.

제가 이직하고 처음으로 맡은 업무가, 전임자분들이 덕지덕지 구현만 겨우 해놓은 초거대 클래스를 좀 잘게 쪼개서 가독성과 효율성을 높이는 겁니다.

그런데 제가 워낙 C만 해오다보니 oop가 익숙치가 않아서 방향을 좀 잡고자 이렇게 질문글을 올리게되었습니다.(__)

상황은 이렇습니다.

SUPER_BIG_CLASS.cpp

class SUPER_BIG_CLASS
{
      수많은 멤버 변수, 함수 등등
}
 
void SUPER_BIG_CLASS::member_function1(void)
{
      int result = SUPER_BIG_CLASS::member_function2(void);
}
 
int SUPER_BIG_CLASS::member_function2(void)
{
 
}
 
void SUPER_BIG_CLASS::member_function3(void)
{
 
}

이렇게 꼬여있는게 좀 복잡합니다..

그냥 서로 호출하는 관계만 없다면 그냥 파일분할 개념으로 접근하면 될 것 같은데,

멤버함수끼리 서로 호출까지 얽히다보니 이게 간단하게 파일분할로는 해결이 안될것 같습니다.

질문을 정리해보겠습니다.

1) 거대 클래스안의 멤버 함수들이 서로 호출하는 관계. 심지어 기능적으로 일관되지도 않기 때문에 같은 기능들끼리 묶어서 새로운 클래스를 생성하여 코드를 분할하고 싶음.
-> 이 경우에 header파일까지 분할을 해야하는데, 그러면 다른 클래스에서 분할된 클래스의 멤버 함수에 접근을 하려면, 그 멤버 함수들이 public이어야 하잖습니까? 그러면 기밀성(?원래는 private으로 작성된 함수들) 문제는 없을지..

2) 이 경우에 업계에서 통용되는 무슨 이론적 배경같은게 있을까요?? 비슷한 기능들끼리 쪼개되 OOP의 장점을 활용할 수 있도록 구현을 해보라고 하셔서 말이죠...

답변부탁드립니다..ㅠㅠ

막막해서 방향이 잡히질 않네요..ㅠㅠㅠ

감사합니다!

익명 사용자의 이미지

특정 클래스/함수가 어떤 일을 하는지 모르기 때문에,
일반적 클래스/함수를 위한 업계 통용되는 이론적 배경이나 특별한 것은 없고요...

굳이 있다면, 소프트웨어공학책에 나오는 이론이라고 해야하나..
응집성, 결합성... 뭐... 이런 내용들이 있고,

그외 OOP 책에 나오는 캡슐화... 상속... 뭐 이런 뻔한 내용들.. 이지만 정말 중요한 내용입니다.

실용적인 부분에서는 디자인 패턴에 대해 간략히 알아보시면 되겠고,
사람이 직접 적절하게 수정해야겠죠.
그래서 기계(또는 자동 생성 프로그램)가 아닌 사람 프로그래머가 필요한 거겠죠.

yhsuk의 이미지

하시려는 작업을 리팩토링(refactoring)이라고 부릅니다.
리팩토링이나 refactoring으로 검색해서 더 많은 글들을 보시길 추천드립니다.

마틴 파울러의 리팩토링 이라는 책이 번역되어 있으니 참고해 보세요.
이론이라기 보다는 전문가들이 경험이 쌓인 내용에 대해서 기술해 놓은 것입니다. (얘기하신 사항은 책에서는 2. Bad Smells in Code의 거대한 클래스(Large Class) 에 해당되겠네요)
리팩토링은 변수나 함수 네이밍 수정같은 간단한 것에서부터, 메쏘드 분리/통합, 클래스 분리 등등의 참고할 만한 기준점?을 제시하고 있습니다.

아래서부터는 뱀다리:
이 분야가 다 그렇지만, 방법에 대한 이론은 이론이고, 그것을 자신의 것으로 하려면, 부단한 노력이 필요로 합니다.
(이런 말을 쓴다고 해서, 제가 리팩토링에 대해서 노력했다는 것은 아닙니다 :-p)

리팩토링이란 수술과도 같으니, 작업을 수행한 후에는 기존 기능이 모두 정상적으로 동작하는지 기능 테스트와 통합 테스트를 필요로 합니다.
이것과 연계해 TDD가 리팩토링을 지탱하는 힘이라는 표현도 어디선가 봤었는데, 어디서 봤는지 모르겠네요.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

badseat의 이미지

제게 정말 필요한 방향을 잡아주셨네요~
어차피 구체적인 방법은 찾을 수는 없을테고,, 참고할 자료를 찾고있었는데 정말 큰 도움이 되었습니다.
감사합니다~^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.