- PR -

SUBは使わないのが基本?

投稿者投稿内容
TASTO
会議室デビュー日: 2008/12/18
投稿数: 4
投稿日時: 2008-12-18 15:59
はじめまして。
現在ASP.NET+VB2008で現在Webアプリケーションを作成しております。

作成中のソースを有識者にチェックしていただいたところ、
"SUBプロシージャは利用しないのが基本です"
という指摘を受けまして、これは何故なのかな?と、ご教授頂きたくこちらに書き込ませていただきました。

これまで、そのような指摘は受けたことが無く、また既存のシステム改修などの業務時にも、Subは使われていたことが多かったので、"利用しないのが基本"という考えはありませんでした。


本来であれば、そのチェックを頂いた方にたずねるのが本筋ですが、他の質問に対する答えなどを考えると、理由を伺っても
"それが一般的なため"
という答えが予想できるので、こちらで質問させていただきました。

実際、Subで書いているところとそれをCallで呼んでいる部分をFunctionに直す作業の工数はまだそれほどでもないのですが、理由もわからず直すのはどうかな、と思いまして。


件名の理由について、ご存知の方がいらっしゃいましたら、何卒ご教授のほどお願い致します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-12-18 16:27
引用:

TASTOさんの書き込み (2008-12-18 15:59) より:
実際、Subで書いているところとそれをCallで呼んでいる部分をFunctionに直す作業の工数はまだそれほどでもないのですが、理由もわからず直すのはどうかな、と思いまして。


Sub は戻り値がありませんから、Sub 内の処理の結果を Sub の外に知らせるためには、引数で与えられたモノをいじるか、あるいは、グローバル変数をいじるしかありません。処理の結果を返したいときに、戻り値で返せるならばそうしたほうが、一般に、良いコードになります。

Sub を文字列置換で Function に直しても、戻り値をちゃんと意味のあるものにして、その戻り値の分、引数やグローバル変数をいじらないようにしないと、Sub を Function に直す意義はないでしょう。
TASTO
会議室デビュー日: 2008/12/18
投稿数: 4
投稿日時: 2008-12-18 16:57
unibon様、ご返信有難うございます。

Subで値を返す、という処理があればそれをFunctionにする理由もわかるのですが、画面初期化用の処理や、与えられた値をファイルに書く、といった値を返さない処理について、Functionにするべきなのだろうか?という疑問があります。

今回チェックを受けたソースで、Subはそのような値を返す必要の無い処理、Functionは値を返す処理、と分けていたので全てをFunctionにすべき、という指摘の理由が少々わからず、この質問をさせていただきました。


値を返さないSubをFunctionに変更すると警告が出てしまうので、True(正常)かFalse(エラー)を必ず返すような修正が必要か?と考えてしまうと・・・
・呼び元でそのエラーに対して処理を行わなければいけない
・エラーのキャッチをそういう形で行うのはいかがなものか?

と修正量も多くなってしまったり、なにより疑問がある処理が残ってしまう。
これは良く無さそうと直感的に思ったのですが、そのような形が一般的、といわれてしまうと保守性を考えてそうするのですが・・・
sasagaki
常連さん
会議室デビュー日: 2008/03/10
投稿数: 20
投稿日時: 2008-12-18 17:20
「SubかFunctionかは適材適所」が正解でしょうね。
身も蓋もない言い方ですが。

昔・・・VBにTry〜Catch〜Finally構文が無かったころは
「処理はやりっぱなしにしないで、ちゃんと自分でエラー処理して
 結果を呼び出し側に返しなさい!
 呼び出した側は、ちゃんと結果を見て、その後の処理を記述しなさい!
 常にそうしなさい!」
と言う作法を主張する人たちが、確かにいました。

そのお作法は、
あまりにもエラー処理等に無頓着なプログラマが多い現場では
それなりに効果があったように思います。

ただ今は、例外というものがあるのだし
TASTOさんのおっしゃるようにSubとFunctionを使い分けるのが一般的と思います。
TASTO
会議室デビュー日: 2008/12/18
投稿数: 4
投稿日時: 2008-12-18 18:16
sasagaki様、ご返信有難うございます。

かつては理由はあったが、現在では便利なものもあるのでそれほど意味は無い、という感じなのですね。

質問というか、確認のような形になってしまい申し訳ありませんでした。
またご回答頂いたお二方、有難うございました。
campylo
会議室デビュー日: 2008/12/15
投稿数: 5
投稿日時: 2008-12-18 18:16
引用:

Subで値を返す、という処理があればそれをFunctionにする理由もわかるのですが、画面初期化用の処理や、与えられた値をファイルに書く、といった値を返さない処理について、Functionにするべきなのだろうか?という疑問があります。



このような時の戻り値が無いものはSubを使うべきです。

Visual BasicでSubを使うなというのはC言語系でvoidを使うなと言っているようなものです。

非常に初期のC言語はvoidがありませんでした。
その名残と、「有識者」の方のバグ回避のための経験からのご指導だと思います。
しかし、Subを使わずFunctionを使わなければならないという方針はコードブロックに「意味の無い値を返す」というノイズを載せることになります。
プログラムソースに害がありますのでSubを禁止にするのはよくありません。

_________________
campylo
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-18 18:30
引用:

TASTOさんの書き込み (2008-12-18 15:59) より:

作成中のソースを有識者にチェックしていただいたところ、
"SUBプロシージャは利用しないのが基本です"


結局のところ納得のできる説明がない以上、答えは簡単で 「その人が有識者ではない」 ということですね。 私には意味がわからないだけで、その方が私なんかより有識という可能性はもちろんありますが、私はこのように思っております (大真面目)。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-12-18 18:42
引用:

TASTOさんの書き込み (2008-12-18 15:59) より:
"SUBプロシージャは利用しないのが基本です"



ご提示の例:画面初期化用の処理をFunctionにするとしたら、
何を返したらいいですか?とその方に具体的に質問をしてみてください。
そうすればその方の意図も見えるのではないでしょうか?

なんとなくですが、その方はすべてFunctionにして処理がOKかNGを
戻り値Booleanで返すようなコードを書く人なのではないですかね。
そうだとしたら、それは.NET Framework対応のVBの流儀ではありません。
チェックするためのメソッドがBooleanを返す、というのはよくある話ですが、
そうでないメソッドの場合、例外を使って処理するのが一般的です。
戻り値で返す方法だと意識的/無意識的のどちらでも無視されうるため、
例外機構を使った方がよいです。

スキルアップ/キャリアアップ(JOB@IT)