함수 구현시 올바른 방법은?

youngminny의 이미지

C에서 함수를 구현할 경우,
function(char *p, int flag);
을 구현한다고 가정하고, 여기서는 flag의 값(0,1..)의 값에 따라서 내부에선 별도로 동작하는 함수를 작성했습니다.

이와 비슷하게

function1(char *p);
function2(char *p);

와 같이 위 function을 여러개로 쪼개서 만들었습니다.

어떤 방식이 좋은 방식이 될 수 있을까요?
아시는 분의 얘기에 의하면 후자가 좋다고 하시는데, 제가 감각적(?)으로 안 와닿는군요..
여러분은 어떤식으로 function을 구현하시는지요?

lkjt의 이미지

일단 모듈화가 잘 안되지 않나요..

또,,, 단순히 생각하면 if문이 들어가므로 비교를 하게되서 미세하게나마 느려지겟내요..

sjpark의 이미지

상황에 맞게 사용하심이.....

벗뜨...

후자에 한표.

litdream의 이미지

저도 후자가 좋다고 생각합니다.
일단, 첫번째 처럼 flag 을 사용하여서, 하나의 펑션을 사용하게되면,
return type 이 묶여버립니다.
function overloading 을 하더라도, 넘겨주는 인자들이 변할수는 있지만
함수이름과 리턴 타입은 바뀔수 없기 때문에, 차후에 다른 리턴값을 원하게
될때는, 어쩔수없이 칼을 많이 갖다대야 할겁니다.
lkjt님의 모듈화 문제가 어찌보면 여기에 속하는 문제일수도 있겠군요.
짧은 제 소견이었습니다.

삽질의 대마왕...

운형의 이미지

함수는... 하나의 기능만 하는 것이 좋습니다. 앞에서 글을 쓰신분들과 거의 같은 맥락인데, 작은 규모의 프로젝트의 경우는 별 문제 없는데,
규모가 커지면서는 상황이 다름니다. 딱하나의 기능이 있는 함수를 제공하고, 좀 더 복잡한 기능이 필요하다면 기존 것을 래핑해서 사용하는 쪽이
여로 모로 유리합니다.

Do you think that's the air you are breathing now?

pynoos의 이미지

각각 장단점이 있습니다.

두가지 다른, 하지만 비슷한 액션이 하나의 함수안에 구현되어있는 경우와
다른 함수에 있는 경우..

전자는 인터페이스 측면에서 구현해야할 함수가 적기 때문에 깔끔해집니다.
ioctl 과 같은 것을 생각하시면 됩니다. 주로 인터페이스 같이
하위 라이브러리를 만들때 설계시 도입하는 경우가 좋습니다.
후자로 가야하는 경우에는 한쪽이 다른 한쪽을 내부에서 불러쓴다거나 하는
형식으로 공통되는 코드가 없는 것이 좋습니다.
비슷한 코드가 다른 함수에도 있을 때는, 한쪽에 버그가 생길 경우에는
다른 한 쪽도 반드시 생각해야하는 관리상의 약점도 따라옵니다.
반면 공유하는 코드가 적고 인터페이스 측면이 적다면 나눠쓰는 쪽이
훨씬 좋겠죠.
예를 들면 stat, lstat 을 통합할 수도 있는데 나눈 것은 그런 고민의 결과였을 것입니다.

alwaysN00b의 이미지

함수가 하는 일에 따라 틀리죠.

코드가 거의 같고 flag에 따라서 어떤 변수값만 변한다면

전자가 낫고,

flag에 의해서 함수 자체가 크게 덩어리로 나누어 진다면(-_-;; 먼소리여..)

후자가 낫다고 생각합니다.

언제나 시작

youngminny의 이미지

여러분의 의견.. 많은 참조를 하겠습니다.
개인적인 Style를 고집하다보니.. 전자를 무척 많이 사용했는데.. 지금와서 곰곰히 따져보니.. Program을 만들때, 생각없이 했다는 생각이 드는군요..
아직 갈길이 너무 멀군요.. 쩝

ㅡ,.ㅡ;;의 이미지

youngminny wrote:
C에서 함수를 구현할 경우,
function(char *p, int flag);
을 구현한다고 가정하고, 여기서는 flag의 값(0,1..)의 값에 따라서 내부에선 별도로 동작하는 함수를 작성했습니다.

이와 비슷하게

function1(char *p);
function2(char *p);

와 같이 위 function을 여러개로 쪼개서 만들었습니다.

어떤 방식이 좋은 방식이 될 수 있을까요?
아시는 분의 얘기에 의하면 후자가 좋다고 하시는데, 제가 감각적(?)으로 안 와닿는군요..
여러분은 어떤식으로 function을 구현하시는지요?

사용하는것에 따라 달리 해야겠지만..

거의 흡사한함수 인데 여러개로 할필요가 있을까요..
나중에 변할것을감안하여 첨부터 잘해야겠지요..
전자를 구현하려면 첨부터 많은고민이 필요하겠죠.. 나중에 확장성을 생각할때도 문제가 없는가..

함수의 분업화와 구조화 를고려한다면 전자로 설계하도록 하는게 좋다고 생각합니다.

많은 C 함수들을 보면 전자의 방식을 선택했습니다. 가장기본적인 open fopen 함수등만봐도 오픈형태를 인자를주어 사용하죠

이는 나중에 새롭게 필요한함수 인터페이스를 만들지 않아도 옵션추가만으로 확장할수있겠죠..

더구나 나중에 수정사항이 발생했을때를 감안한다면 전자는 한번의수정으로 끝이나며 후자는 함수갯수만큼 수정해야겠지요..

C++적인 스타일에서는 옵션보다 각각의 함수를 다만들어버리는식이죠.
제가생각할때 후자는 C++적이고 전자는 C적이라는 생각도 드는군요..


----------------------------------------------------------------------------

댓글 달기

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