今時なんでと思うのですが。 「関数の出口であるReturnは、該当関数の最後に1箇所のみ配置すべし」という規約が生きているプロジェクトがありました。
(例1)Private Sub proc1()
Dim a As Integer = 0
Dim b As Integer = 3
'いろいろ
If a = 10 Then Return
'いろいろ
If b = 2 Then Return
'いろいろ
Return
End Sub
このように記したら違反らしい。
(例2)Private Sub proc2()
Do
Dim a As Integer = 0
Dim b As Integer = 3
'いろいろ
If a = 10 Then Exit Do
'いろいろ
If b = 2 Then Exit Do
'いろいろ
Exit Do
Loop
Return
End Sub
れはOkだという。この判断基準が理解できません。例2)は Do/Loopが如何にも冗長だし、うっかりミスると無限Loopになる
for Loopや do while false にしても冗長さを感じます。ミスりやすい記述より規約を優先させるのは良くないでしょう。
gotoが悪者扱いされた時、Gotoの変わりに Flag制御に置換したら、制御判定がスパゲッティになったという笑い話が過去にあります。
出口を一箇所にするならば
(例3) Private Sub proc()
Try
Dim a As Integer = 0
Dim b As Integer = 3
'いろいろ
If a = 10 Then Return
'いろいろ
If b = 2 Then Return
'いろいろ
Return
Finally
MessageBox.Show("K")
End Try
End Sub
のように 、Finally句で対処できそうに思うのです。と指摘したところ......
「規約は随分以前に作られたもので。規約を変えるには相当な運動が必要で、開発に追われて、そのような暇はない。規約に従ってれば波風立たないのでそのほうか良い。」
「規約責任者に Try/Catch/Finally を理解してもらうのは困難だ。このスタイルでも困らないから放っていて。」
との返事を頂きました。
今時のオープン系の開発現場で規約策定者が例外処理やFinallyを知らないのはモット問題でしょう。(この類の人が権力を持っているケースが多いのも事実なんですか....)
この絵柄は本末転倒でしょう。効率のよい開発規約を作るのも開発作業の仕事の一部です。波風立てないのは短期的には良いでしょうが、中長期的にマイナスです。
開発者が効率を求めるのはソースコードだけではありません。システムの効率化に匹敵するくらい、規約の見直しも作業の進め方の一つで大事なことです。