中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

捨てられない戻り値

捨てられない戻り値

サンプルを鵜呑みにしちゃいけないというのも含めて、ドキュメントと一緒に旅に出ようと書いた。

たとえば戻り値の存在がわからない例(C#)

bool 更新処理(string param)
{
  .....
  return false;
}
void xxx()
{
  更新処理("fiename.ext");
  
}

さて、このコードのxxx関数だけみてほしい。これでこの処理が正しく動いているだろうか?

ぱっとみはもちろんわからない、戻り値があるかどうかすらもわからない。

次に更新処理がvoid 更新処理()だったとしよう、このメソッドに戻り値bool を追加したとして、これを受け取っていないコードはコンパイルエラーになるだろうか?

そう。ならない。

これに対する解決策は

void 更新処理(out bool 成功フラグ,string param)

このようなパラメータにするしかない。

もちろんこんなつくりを推奨するわけではないけれども、戻り値は二つの値を戻すこともできないし、読まずに捨てることもできてしまう

戻り値の限界はこんなところかもしれない。

#この文書を短絡的に受け取って、古臭い戻り値はint、エラー情報は別途取得して確認というスタイルに戻らないでね

投稿日時 : 2007年1月12日 14:38

コメントを追加

# re: 捨てられない戻り値 2007/01/12 15:05 とっちゃん

いまどきなら例外投げるが正解例ですかねw
#ものによるんだけどw

# re: 捨てられない戻り値 2007/01/12 15:22 シャノン

結局のところ、何をしても、xxxのような愚かなコードを書くことを止めることはできないわけで。

void xxx()
{
  bool ignore;
  更新処理( out ignore, "filename.txt" );
}

とかされたら終わりだし、例外指定ができたとしても

void xxx()
{
  try
  {
    更新処理( "filename.txt" );
  }
  catch
  {
  }
}

とかされたらそれまで。
そして、こういうコードを書く奴って、必ず一人はいるもんだ。

# re: 捨てられない戻り値 2007/01/12 17:47 黒龍

さすがに関数のシグネイチャと違って例外の使用は厳しい場所が多くないですか?(コーディングルールになっていそう)

> とかされたらそれまで。
> そして、こういうコードを書く奴って、必ず一人はいるもんだ。
こういう行いを禁止するために^^;

# re: 捨てられない戻り値 2007/01/12 18:33 恣意の

>戻り値は二つの値を戻すこともできないし
二つの値を戻せれば良いのであれば
C++だとこういう話かなぁと思ったりもする

boost::tuple<bool, type> 更新処理(const std::string& param)
{
  ...
  return boost::make_tuple(false, type());
}

void xxx()
{
  bool flg;
  type result;
  boost::tie(flg, result) = 更新処理("fiename.ext");
}

んでも、ライブラリを使用する人間には
ドキュメントはやはり読んでいて欲しい罠

# re: 捨てられない戻り値 2007/01/13 3:43 RUN

戻り値って、条件分岐(if文等)に直接放り込むことが出来るから、2つ以上取得できるとそれはそれで困ったことになりそうな気も・・・

VB表記で申し訳ないが(汗)こんなんとか

if 更新処理("fiename.ext") then
 ...
else
 ...
endif

(個人的には戻り値を直接放り込むコードって嫌いではありますが(笑))

# re: 捨てられない戻り値 2007/01/14 15:17 シャノン

> 例外の使用は厳しい場所が多くないですか?(コーディングルールになっていそう)

そういう会社であればまだ報われるかもしれません。
悪いところだと「例外は遅いから全面使用禁止」というのもあるんじゃないかと。

例外って、フレームワークが出すものを捕らえて対処するだけならまだしも、アプリケーションの中から投げるとなると、クラス設計をしっかりやっておかないと破綻するので、それが出来ている会社であれば機能するでしょうけど、最初にそういう設計をしてなくて、後から戻り値じゃいかんと気づいた場合は悲惨だったりする。

タイトル
名前
URL
コメント