早期returnとMISRA-Cルール14.7は背反か否か.

3
もなか @monamour555

Jeff Bay氏の言う早期returnの使用と,MISRA-Cの「14.7 R 関数では、関数の最後に唯一の出口がなくてはならない。」は真っ向から衝突する.オブジェクト指向と手続き型との見解の違いだろうか? …それ以外の何かが潜んでいる気がしている(けれど形式化できない).

2012-08-29 14:18:15
@trapneko

早期returnはオブジェクト指向と関係がなくて単にネストを浅くしてコードがシンプルに見えるようにするための手法

2012-08-29 14:20:19
しのぶ@ @c5h12o51

@monamour555 そういうのは宗教と一緒だから形式化なんてできないんじゃないかな?

2012-08-29 14:25:34
もなか @monamour555

.@c5h12o51 宗教も,掘り込んでいくと,根っこのところで案外繋がったりしますから….

2012-08-29 14:35:42
しのぶ@ @c5h12o51

@monamour555 確かにコーディングルールそのものが宗教っぽいってところから案外繋がるかもしれんね

2012-08-29 14:48:30
@trapneko

@monamour555 わたしも突き詰めたら宗教に1票です。関数型ぽくシンプルなメソッド定義にしたいという意図はあるかもしれないですが、C由来のC++ではコーディングルールというか見た目で制約するのは無理そうですし。

2012-08-29 14:37:29
もなか @monamour555

.@trapneko jeff Bay氏のルールだと,インデント1段階やelse句禁止で,見た目から縛りかけていますね.それらがあっての早期returnだろうとは思います.

2012-08-29 14:45:10
もなか @monamour555

MISRA-Cルール14.7を「関数の出口を1つにしても気持ち悪くないくらいまで関数分割せよ」と暗に主張していると解釈すると,両者の言っていることは割と整合する気もする.

2012-08-29 14:38:22
もなか @monamour555

ただ,MISRA-C本が手元にないので記憶曖昧だけれど「関数の出口を1つにしても気持ち悪くないくらいまで関数分割せよ」なんて解説ではなかったように思うので,MISRA屋さんに言わせたら,きっと正解ではない.

2012-08-29 14:50:37
きしもと @ksmakoto

@c5h12o51 @monamour555 @monamour555 出口1箇所というのは、資源の解放し忘れとかを予防するためとかであって、そういう目的もなしに教条的に守れというなら宗教ですけど、いきなりそう決め付けるのはどうかと思いますが

2012-08-29 14:49:24
もなか @monamour555

確かにリソースリーク予防の観点はありますよね.特にC言語ではリソースリークは起こりがちで致命的. QT @ksmakoto: @c5h12o51 出口1箇所というのは、資源の解放し忘れとかを予防するためとかであって、

2012-08-29 14:52:34
もなか @monamour555

まずはリソースリークへの考え方の違いと考えるべきか.MISRA-Cのルール14.x全体を見ると,goto 禁止だけでなく,break や continue に制限がかかったり if-else の後の else を強制したりして,想定外の制御フローの存在を極端に嫌っているし.

2012-08-29 15:00:02
もなか @monamour555

ただ,MISRA-Cルール14.x に適合するコードを書こうとすると,たぶんインデントの段数は少なく(STLないので1段は無理としても)なり,関数中のreturn文の数は少なくなる.result変数を持ち歩くコードは可読性悪いから.結局 Jeff Bayの推奨コードに近づく.

2012-08-29 15:08:43
もなか @monamour555

パラダイムやアプローチは違うのに,結局似たコードに落ち着きそうな不思議.

2012-08-29 15:11:28
しのぶ@ @c5h12o51

@monamour555 それってPythonの開発者が言ってたことに似てる

2012-08-29 15:12:53

このまとめを引用しているブログ等

リンク はてなダイアリー MISRA-Cにおける「関数の末尾以外の return 禁止」の真意 - 新・日々録 by TRASH BOX@Eel http://askslashdot.slashdot.jp/comments.pl?sid=588292&cid=2295472 http://togetter.com/li/363795..