- - PR -
SUBは使わないのが基本?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-12-18 15:59
はじめまして。
現在ASP.NET+VB2008で現在Webアプリケーションを作成しております。 作成中のソースを有識者にチェックしていただいたところ、 "SUBプロシージャは利用しないのが基本です" という指摘を受けまして、これは何故なのかな?と、ご教授頂きたくこちらに書き込ませていただきました。 これまで、そのような指摘は受けたことが無く、また既存のシステム改修などの業務時にも、Subは使われていたことが多かったので、"利用しないのが基本"という考えはありませんでした。 本来であれば、そのチェックを頂いた方にたずねるのが本筋ですが、他の質問に対する答えなどを考えると、理由を伺っても "それが一般的なため" という答えが予想できるので、こちらで質問させていただきました。 実際、Subで書いているところとそれをCallで呼んでいる部分をFunctionに直す作業の工数はまだそれほどでもないのですが、理由もわからず直すのはどうかな、と思いまして。 件名の理由について、ご存知の方がいらっしゃいましたら、何卒ご教授のほどお願い致します。 | ||||
|
投稿日時: 2008-12-18 16:27
Sub は戻り値がありませんから、Sub 内の処理の結果を Sub の外に知らせるためには、引数で与えられたモノをいじるか、あるいは、グローバル変数をいじるしかありません。処理の結果を返したいときに、戻り値で返せるならばそうしたほうが、一般に、良いコードになります。 Sub を文字列置換で Function に直しても、戻り値をちゃんと意味のあるものにして、その戻り値の分、引数やグローバル変数をいじらないようにしないと、Sub を Function に直す意義はないでしょう。 | ||||
|
投稿日時: 2008-12-18 16:57
unibon様、ご返信有難うございます。
Subで値を返す、という処理があればそれをFunctionにする理由もわかるのですが、画面初期化用の処理や、与えられた値をファイルに書く、といった値を返さない処理について、Functionにするべきなのだろうか?という疑問があります。 今回チェックを受けたソースで、Subはそのような値を返す必要の無い処理、Functionは値を返す処理、と分けていたので全てをFunctionにすべき、という指摘の理由が少々わからず、この質問をさせていただきました。 値を返さないSubをFunctionに変更すると警告が出てしまうので、True(正常)かFalse(エラー)を必ず返すような修正が必要か?と考えてしまうと・・・ ・呼び元でそのエラーに対して処理を行わなければいけない ・エラーのキャッチをそういう形で行うのはいかがなものか? と修正量も多くなってしまったり、なにより疑問がある処理が残ってしまう。 これは良く無さそうと直感的に思ったのですが、そのような形が一般的、といわれてしまうと保守性を考えてそうするのですが・・・ | ||||
|
投稿日時: 2008-12-18 17:20
「SubかFunctionかは適材適所」が正解でしょうね。
身も蓋もない言い方ですが。 昔・・・VBにTry〜Catch〜Finally構文が無かったころは 「処理はやりっぱなしにしないで、ちゃんと自分でエラー処理して 結果を呼び出し側に返しなさい! 呼び出した側は、ちゃんと結果を見て、その後の処理を記述しなさい! 常にそうしなさい!」 と言う作法を主張する人たちが、確かにいました。 そのお作法は、 あまりにもエラー処理等に無頓着なプログラマが多い現場では それなりに効果があったように思います。 ただ今は、例外というものがあるのだし TASTOさんのおっしゃるようにSubとFunctionを使い分けるのが一般的と思います。 | ||||
|
投稿日時: 2008-12-18 18:16
sasagaki様、ご返信有難うございます。
かつては理由はあったが、現在では便利なものもあるのでそれほど意味は無い、という感じなのですね。 質問というか、確認のような形になってしまい申し訳ありませんでした。 またご回答頂いたお二方、有難うございました。 | ||||
|
投稿日時: 2008-12-18 18:16
このような時の戻り値が無いものはSubを使うべきです。 Visual BasicでSubを使うなというのはC言語系でvoidを使うなと言っているようなものです。 非常に初期のC言語はvoidがありませんでした。 その名残と、「有識者」の方のバグ回避のための経験からのご指導だと思います。 しかし、Subを使わずFunctionを使わなければならないという方針はコードブロックに「意味の無い値を返す」というノイズを載せることになります。 プログラムソースに害がありますのでSubを禁止にするのはよくありません。 _________________ campylo | ||||
|
投稿日時: 2008-12-18 18:30
結局のところ納得のできる説明がない以上、答えは簡単で 「その人が有識者ではない」 ということですね。 私には意味がわからないだけで、その方が私なんかより有識という可能性はもちろんありますが、私はこのように思っております (大真面目)。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2008-12-18 18:42
ご提示の例:画面初期化用の処理をFunctionにするとしたら、 何を返したらいいですか?とその方に具体的に質問をしてみてください。 そうすればその方の意図も見えるのではないでしょうか? なんとなくですが、その方はすべてFunctionにして処理がOKかNGを 戻り値Booleanで返すようなコードを書く人なのではないですかね。 そうだとしたら、それは.NET Framework対応のVBの流儀ではありません。 チェックするためのメソッドがBooleanを返す、というのはよくある話ですが、 そうでないメソッドの場合、例外を使って処理するのが一般的です。 戻り値で返す方法だと意識的/無意識的のどちらでも無視されうるため、 例外機構を使った方がよいです。 |