0

次の 2 つのコード ブロックのうち、全体的に優れているのはどれですか?

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;
}

また、

2 つの return ステートメント、インデントの少ないコード:

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;
}
4

3 に答える 3

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 行未満でない限り、両方のケースで確認できます)、複数のリターン ポイントで問題ありません。

于 2013-08-12T00:57:51.187 に答える
1

私は「すぐに失敗する」側で誤りを犯します。つまり、プログラムを壊すような状況に遭遇した場合、必要以上に長く待たないでください。ifそうしないと、コードがネストされた句の扱いにくい混乱に変わり始める可能性があります。

参照:関数には return ステートメントを 1 つだけ含める必要がありますか?

于 2013-08-12T00:57:15.523 に答える