2013-08-12 3 views
1

다음의 두 가지 코드 블럭 중 어느 것이 전반적으로 더 좋은가?더 많은 반환 문장들과 많은 들여 쓰기

하나의 return 문, 더 들여 쓰기 코드 :

struct dnode *dllist_push_front(struct dllist *dllist, void *data) 
{  
     struct dnode *dnode = malloc(sizeof(struct dnode)); 
     if (dnode) { 
       dnode->data = data; 
       dnode->next = dllist->sentinel->next; 
       dnode->prev = dlllist->sentinel; 
       dnode->next->prev = dnode; 
       dllist->sentinel->next = dnode; 
       dllist->size++; 
     } 
     return dnode; 
} 

또는

두 반환 문에서도 덜 들여 쓰기 코드 :

struct dnode *dllist_push_front(struct dllist *dllist, void *data) 
{ 
     struct dnode *dnode = malloc (sizeof(struct dnode)); 
     if (!dnode) 
       return NULL; 
     dnode->data = data; 
     dnode->next = dllist->sentinel->next; 
     dnode->prev = dlllist->sentinel; 
     dnode->next->prev = dnode; 
     dllist->sentinel->next = dnode; 
     dllist->size++; 
     return dnode; 
} 
+0

맨 위 코드 세그먼트에도 두 개의 return 문이 있습니다. –

+0

웁스! 그것은 실수입니다. 내가 수정하자. – oddlogic

+0

2 가지 방법의 또 다른 효과는 if()에서 부정 (또는 not)입니다. 부정이없는'if()'에는 미묘한 이점이 있습니다. if (working()) ... if (실패()) ...와 if (! working()) ... if (! failed()) ... '. 그것은 당신의 질문을 넘어서는 것이 아니라 배려입니다. 법원 판결과 같은'if()'를 피하려고합니다. "대법원은 부정적 리뷰를 삭제하라는 명령을 뒤집습니다" – chux

답변

1

내가 치우쳐 것 "빠르다"는 말은, 당신이 어떤 상태에 빠졌을 때 필요한 것보다 오래 기다리지 않는다는 의미입니다. 프로그램을 어기십시오. 그렇지 않으면 코드가 중첩 된 if 절의 다루기 힘든 혼란으로 바뀔 수 있습니다.

참조 : 나는 즉시 "실패"상태를 호출하기 때문에 후자를 선호하는 경향이 있지만 당신은 실제로 어느 길을 갈 수 Should a function have only one return statement?

+1

이 예에서는 다음과 같습니다. 하지만, 그들은 같은 조건 하에서 동시에 둘 다 실패합니다 ... – oddlogic

+0

나는 스레드 자체에 연결되어 있었고 어떤 특별한 대답이 아니 었습니다. – jslivka

+0

나는 나의 예를 언급하고있다. 혼란을 불러 일으켰습니다. – oddlogic

3

. 내 개인적인 취향은 해당 조건 더욱를 호출 이후 처음 return 다음 빈 줄을 가지고하는 것입니다 (나는 의견의 큰 팬이에요) :

struct dnode *dllist_push_front(struct dllist *dllist, void *data) { 
    // Get new node, exit immediately if not possible. 

    struct dnode *dnode = malloc (sizeof (struct dnode)); 
    if (!dnode) return NULL; 

    // Node exists here, populate data and pointers then return it to caller. 

    dnode->data = data; 
    : 
    return dnode; 
} 

명심 여러 반환 지점 하지만 항상 그렇지는 않습니다.

여러 지침이 잘못되어있는 이유와 그 이유가 때때로 이해하기 어려운 코드로 이어질 수 있기 때문에 기억해야합니다.

흐름을 쉽게 볼 수 있다면 (편집기 창이 13 라인 이하가 아니라면 두 가지 경우 모두 가능합니다.) 복수의 리턴 포인트가 좋습니다.

+0

죄송합니다.이 일을 의미하는 것은 아니지만 최상위 코드 블록에 추가 return 문이 있습니다. 나는 그것을 나의 의도로 바꾸 었으며 그것은 당신의 모범과 일치합니다. :/답장을 보내 주셔서 감사합니다. – oddlogic

+0

@oddlogic, probs가 질문 편집에 맞게 답변을 조정했습니다. – paxdiablo

+0

입력 해 주셔서 감사합니다. return 문을 테스트 조건과 같은 줄에 넣는 것을 좋아합니다. – oddlogic

0

명확한 흐름과 디버깅을 위해 각 기능에는 정확히 하나의 종료점이 있습니다. goto의 훈련을 활용

쉬운 일을한다 : goto를 사용 themselfs을 제한하는 사람들을 위해

#include <stdio.h> 
#include <stdlib.h> 

... 

typedef enum 
{ 
    Error_Uninitialised = -1, 
    Error_Ok = 0, 
    Error_1, 
    Error_2, 
    Error_3, 
    Error_4, 
    Error_5, 
    ... 
} ErrorCode_t; 

#ifdef DEBUG 
#define LOG(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) 
#else 
#define LOG(fmt, ...) 
#endif 

int func(int a, char b, void * p, ...) 
{ 
    LOG("entering: '%s'\n", __func__); 

    int result = Error_NoError; 

    if (42 == i) 
    { 
    result = Error_1; 
    goto lblExit; 
    } 

    if ('y' == c) 
    { 
    result = Error_2; 
    goto lblExit; 
    } 

    if (!p) 
    { 
    result = Error_3; 
    goto lblExit; 
    } 

    void * ptmp = realloc(p, i); 
    if (!ptmp) 
    { 
    result = Error_4; 
    goto lblExt; 
    } 

    ... 

    lblExit: 

    LOG("'%s' returns %d\n", __func__, result); 

    return result; 
} 

은 다음 버전은 도움이 될 수 있습니다 : 나중에 프로젝트 중

int func(int a, char b, void * p, ...) 
{ 
    LOG("entering: '%s'\n", __func__); 

    int result = Error_NoError; 

    do 
    { 
    if (42 == i) 
    { 
     result = Error_1; 
     break; 
    } 

    if ('y' == c) 
    { 
     result = Error_2; 
     break; 
    } 

    if (!p) 
    { 
     result = Error_3; 
     break; 
    } 

    void * ptmp = realloc(p, i); 
    if (!ptmp) 
    { 
     result = Error_4; 
     break; 
    } 

    ... 

    } while (0); 

    LOG("'%s' returns %d\n", __func__, result); 

    return result; 
} 

다음의 경우, 때를 최적화를 위해 이 실제로 인 경우이 접근법에서 벗어날 수 있습니다.

+0

글쎄, 나는 'early return'을 찾지 못한다. 긴 목록을 검색하는 동안 오류 조건 또는 sucessfull 일치에 대해 디버깅에 대한 특정 장벽이 될 수 있습니다. 특히 자체 최적화 된 행에서 return()을 사용하여 최적화를 수행해야합니다. –

+0

나는 goto의 훈련 된 사용에 열려있는 누군가가 여러 리턴 포인트의 훈련 된 사용에 그렇게 불리하지 않을 것이라고 기대할 것입니다 :-) 이러한 "규칙"을 생각없이 적용하면 종종 따르기가 훨씬 더 어려워집니다. – paxdiablo

관련 문제