함수 코딩 스타일에 관하여....

hatbary의 이미지

오랜만에 글 올리네요..

요즘 코딩스타일에 대해 생각이 좀 많은 편인데, 그 와중에 아래와 같은 스레드를 읽고 문득 드는 생각이 있어서 글 올립니다.
http://bbs.kldp.org/viewtopic.php?t=38469&highlight=if%B9%AE

임베디드 프로그래밍을 하면서 resource의 제한등 많은 제한등이 있는데, 그것 때문에 코드 최적화(저는 그냥 이렇게 부릅니다.)에 대한 이야기가 항상 나오는 것 같습니다.

그러던 와중에 위와 같은 스레드를 보고 이러한 것이 임베디드 시스템에서도 적용될까 라는 생각을 했습니다.

아직 임베디드 프로그래밍 경험이 많지 않아서 정확한 판단을 할 수 없더군요..

여러명이 작업할 경우 readability에 중점을 둔다는 것에는 공감하지만, 위 스레드에 나와 있는 것처럼 하나의 함수에 flag를 둬서 비슷한 기능을 하는 함수를 하나로 사용하는 것보다 함수를 둘로 나누는 것이 과연 효율적일까라는 의구심이 생깁니다.

만약 위처럼 하나의 함수를 쪼개면, if문이 그만큼 없어지겠지만 중복되는 코드가 많아서 오히려 더 비효율적이지 않을까요?

아직 내공이 부족한지라 위 부분에 대해 쉽게 납득이 가지 않네요.. :roll:

저도 지금까지 계속 flag를 둬서 웬만하면 비슷한 기능을 하는 함수를 하나로 만들어 사용하는 스타일로 코딩했었거든요..코드사이즈를 줄이는 의미에서요..

고수분들의 생각은 어떤지 알고 싶습니다...

날씨가 갑자기 추워지네요..감기조심하세요....^^

익명 사용자의 이미지

* 오버헤드
- 함수호출(calling sequence/return sequence)
- 비교연산(비교후 분기)
무엇이 비쌀까?
*고려사항 : 불리는 회수

* 심한 경우에, 함수 없이(소위 main()에 전부 코딩)하는 경우도 있다는 얘기를 들은 적이 있다는....<== 카더라~ 얘기니 믿지 마시길..

그러나, 대체로는 의미없어 보이며, 아주 정밀성을 요구하는 제어장치 프로그램(심지어 각 머신 명령어의 클락사이클조차 고려하는)이 아닌 다음에야 대충 하면 될 것으로 보입니다. 단지, 범용에나 있고, 임베디드에는(특수한 경우라서) 있지도 않을 상황을 고려해서 비교문 엄청 사용 한다거나, 메모리 팡팡~ 때려잡아서 쓰는 라이브러리나 언어는 회피하게 되겠지요.

kihongss의 이미지

어차피 사람이 두고 두고 보면서 다듬어야 할 소스라면
요즘 컴파일러가 성능이 좋아, 최적화는 잘들해주니
아무래도 readability가 제일 중요한것 같네요.

crimsoncream의 이미지

그 정도의 제한된 환경이라면 플랫폼 독립적인 코딩이 힘든 환경이 아닐까 싶은데요. 어차피 그 플랫폼용으로 기존 코드를 수정해야하지 않을까 싶고요.
기존 코드를 수정한다면 저라면 통합함수 하나를 만들고 기존 함수명을 macro로 통합함수명 + flag 형태로 바꿔서 가능한 기존 코드 안바꾸고 추가만 해서 해결해 보려고 할 것 같습니다.

그러니까 기조는 세분화된 함수고 문제가 되는 특정환경에서만 우회적으로 해결하는게 좋지 않을까 생각합니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

hatbary의 이미지

Anonymous wrote:
* 심한 경우에, 함수 없이(소위 main()에 전부 코딩)하는 경우도 있다는 얘기를 들은 적이 있다는....<== 카더라~ 얘기니 믿지 마시길..

예전에 학부때 제가 이런 짓을 한적이 있었져..FM modulation과 demodulation하는 code였는데, 제가 처음으로 코딩했던것이었는데, 담당조교가 실행시키는데, 이렇게 느린건 첨 본다구 하더군요..ㅋㅋ
Quote:
기존 코드를 수정한다면 저라면 통합함수 하나를 만들고 기존 함수명을 macro로 통합함수명 + flag 형태로 바꿔서 가능한 기존 코드 안바꾸고 추가만 해서 해결해 보려고 할 것 같습니다.

이런 방법은 미처 생각 못했었네요..흠..macro생각을 왜 못했을까요..아ㅤㅎㅔㅎㅤㅎㅔㅎ

여러분들의 답변 감사합니다... :lol:

댓글 달기

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