- PR -

メソッドの設計方法について

投稿者投稿内容
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-01-26 11:43
引用:

またもう1つ別の疑問がでてきました。
ByRefなのですが、これは使わずByValでオブジェクトを渡して、そのプロパティで
セットするようにしたほうがいいのではないかとう意見があったのですが、
どうなのでしょうか?




Cでも同じインタフェースで設計しなければいけないことを考えると
ByRefの方がいいんじゃないでしょうか?
データが複雑なら構造体を作ってByRefで渡せばよいと思います。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-01-26 12:24
引用:

lamさんの書き込み (2007-01-26 11:25) より:
もちろん言語が違うのだから多少の違いはでてもいいじゃないかという意見はあると思いますが、みんながみんな言語がわかる人でもなく、政治的理由でどうにも・・・というのが正直なところです。


気持ち的には良く分かります。でもそのライブラリはとても使いにくそうですね。VB.NETから使いやすくするために、あるいはJavaから使いやすくするためにライブラリを用意しているのですから、それぞれの言語の流儀に合わせて設計して欲しいものです。このまま行くと「例外を返してくれないし、非標準的なインターフェースで使いにくいから、例外を返すラッパークラスを実装する」と言う本末転倒な事になりかねません。そもそも同じインターフェースを提供することが目的なら、C言語だけを提供して、Javaや.NETにはネィティブコードを呼び出す為の宣言を提供すれば事済みますね。

引用:

また、EとFは正しい運用を行っていても出る可能性があります。
これは出る、出ないで設計が変わるものなのでしょうか?


変わります。事前に内部状態からエラーになる事を判断できるなら、内部状態を返すメソッドを用意して、そもそも呼ばないようする設計もありうるでしょう。普通に取りうる状態なら構造化例外を使うべきでは無いという意見もあります。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-01-26 13:12
最初の1,2,3の中だったら、あとで情報を足せるから1かなぁ。
2,3はエラーか正常かを判断するのが面倒くさそう。

GetInfoをどう呼び出したいかを考えます。私なら以下のように使えるInfoを作るかなぁ。
コード:
Info info = new Info();
info.GetInfo();
if(info.HasErrors) //エラーの場合trueになる
{
 //エラー処理
 //info.ErrorCode EとかFとか
 //info.Exception 例外も消さないで残しといてほしい
}
{
 //正常処理
 //info.B 
}

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-01-26 14:03
引用:

じゃんぬねっとさんの書き込み (2007-01-26 09:58) より:
これは、FCL 2.0 の [ValueType]::TryParse メソッドに倣ったものですね。

戻り値は単純に bool としたいところですが、今回のように詳細が欲しい場合は、
列挙体ではなく、エラーを示すクラスのインスタンスにします。

それでもあまり使いたくないパターンですが、この 3 つの中では 1 番良いと思います。
しかし、この場合は、Get ~ という名称は改変すべきかもしれません。
(戻り値が Info ではないので)


同意。

Pubic Function TryInfoFill(ByVal a As ParamA, ByRef info As Info) As InfoError
 〜
End Function

VBだとこうだっけ?
ちなみにC#ならinfoはoutで。んで。

infoError = InfoClass.TryInfoFill(a, info)

If infoError.isError Then
 'エラーの時。当然infoはnothing
return
End If

'こっから正常時当然infoには何か入ってる


エラーの詳細がほしい時点でboolじゃ無理。詳細がほしいなら列挙体も厳しい。
ってことでエラー用のクラスを作る。戻り値はこっちになるからメソッド名も変える。

とりあえず3は論外。1は俺的には無理。

2でもこうやって型にするパターンにすりゃあとで情報足せるし。
1を選択する理由としては不足だと思うがいかが?


引用:
しかしながら、GetInfo メソッドが Try 系のメソッドではないので、(Get できない == 例外)
結論としては、やはり例外を Throw するのが正しい方法でしょう。


ま。最終的にはこうなるけどね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-26 22:01
引用:

lamさんの書き込み (2007-01-26 11:25) より:

理由なのですが、現在のシステムが複数の言語(C(Unix),Java、.NET(VB, C#))で構成されていることにあります。
今私が作ろうとしているもの(GetInfo)は、これらのすべての言語で提供する必要があります。
作るにあたって、扱いやすいようにインタフェースを統一してくれという話があり、
例外のないCで例外を模倣することは難しいのため、他の言語をC風にあわせようと
話になっています。
もちろん言語が違うのだから多少の違いはでてもいいじゃないかという意見はあると思いますが、みんながみんな言語がわかる人でもなく、政治的理由でどうにも・・・というのが正直なところです。


???ナンセンスに思える。。。

 例外機構のない言語から呼び出されるのかな、と思っていたんだけど、例外機構のない言語にも同じ設計をする、、、のですか。

 機能設計であれば、どんな言語だろうと実装できるような設計をすると思いますが、プログラム設計の段階で、言語に依存しないってのは、無理がありませんか?

 また、「みんながみんな言語がわかる人でもなく」というのも、変かと。「みんながみんな、すべての言語をわかっているわけではない」だと、わかるのですが。まぁ、設計書を言語だけ書かなければならないので、それは大変かも。

 反対にお尋ねしますが、Java や .NET にはクラスがあります。しかし、C 言語にはありません。これは、どうするおつもりですか?
_________________
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-01-26 22:17
ByRefはJavaでは太刀打ちできませんよ。

クラスは構造体とするとして、自分の場合はこんな感じ。
.NETはやったことないので、Javaコードですが。
コード:
//情報クラス
class Info{
    String getValue();
}

//結果クラス
class Result{
    Info getInfo();
    
    boolean hasError();

    String getErrorDescription();
}

//情報取得メソッド
Result getInfo(String parameter);


って感じで設計しますね。

実行方法は、
コード:
Result result = getInfo("xxxx");
if(result.hasError()){
    //正常処理
    Info info = result.getInfo();
    ....//色々
}else{
    //エラー処理
    String description = result.getErrorDescription();
    ....//色々
}


って感じです。

シングルスレッドでの動作が保障されているなら、
例えばClassAのインスタンスBのgetInfo()の後に
同じくインスタンスBのhasError()を呼び出しても問題ありませんが、
マルチスレッドでは動作が保障されません。
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2007-01-27 01:53
いろいろなご意見本当にありがとうございました。

大勢としてはA、@の順で推奨される方が多かったみたいですが、
確かにソフトウェアの理想的な姿に少しでも近づくならばAなの
かなという感じがしています。
ただ@も実際的には使えないとも思えないので、決して否定される
こともないと思っています。
Bはさすがに論外みたいですが・・・

どれが1位と答えをだすことを期待していたわけではないので、
皆様のご意見により、その一長一短がわかり大変勉強になりました。

とはいえ、「例外をなぜ使わないのか?」、「政治的理由では理由になっていない!」
「言語が違うのに言語依存しないことがおかしい」と感じられている方も
やはり多いなと感じました。(だからあまり理由はいいたくなかったのですが^^;)
この意見にはまったく同感ですが、開発に携わる会社も人も多いため、
技術的な優位性が必ずしも認められるわけではなく、こればかりはなかなか
末端の私がいくらがんばってもすぐの解決は難しいのが実情です。
会社に不満があるからといって、すぐに社長と喧嘩することができないのと
同じようなものだとご理解いただければと思います。

@になるかAになるかはまだ決着がついていませんが、
ここでのご意見を参考に決めていきたいと思います。

貴重なご意見ありがとうございました。
また何かありましたらぜひご教授ください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-27 12:52
引用:

lamさんの書き込み (2007-01-27 01:53) より:

とはいえ、「例外をなぜ使わないのか?」、「政治的理由では理由になっていない!」
「言語が違うのに言語依存しないことがおかしい」と感じられている方も
やはり多いなと感じました。(だからあまり理由はいいたくなかったのですが^^;)
この意見にはまったく同感ですが、開発に携わる会社も人も多いため、
技術的な優位性が必ずしも認められるわけではなく、こればかりはなかなか
末端の私がいくらがんばってもすぐの解決は難しいのが実情です。
会社に不満があるからといって、すぐに社長と喧嘩することができないのと
同じようなものだとご理解いただければと思います。


 会社の大小にもよりますが、然るべきところへ然るべき方法で喧嘩するのは、普通だと思います。

 それぞれの言語の、長所短所を知った人間が、それぞれの言語での実装方法を示しながら、同じ設計をするのは、何ら問題はないと思います。たとえば、MSDN では、C++.NET または C++/CLI、VB.NET または VB2005、J#、C# での使用方法が例示してあります。
 こういった“例”を示さずに、一律に「この設計の通りに作れ」という方が、反対に無理ではないかと思います。


 ところで、C 言語で次のようなコードを書くと、この行でプログラムが異常終了します。
コード:
double divide(double a, double b) {
    return a / b; ← b が 0 だと異常終了
}


Java などでは、例外が送出され、キャッチしていると、継続が可能です。

あるいは、この様な、C# のコード。
コード:
FileStream OpenFile(string filename) {
    if (File.Exists(filename)) {
        return File.Open(filename, FileMode.ReadWrite);
    } else {
        return null;
    }
}


ファイルの存在チェックをしているので、ファイルがあればそのファイルのストリーム、無ければヌルが返ります。
 しかし、ファイルのチェックが甘いため、書き込み権がなければ、例外が送出されます。

 本当に例外を返さないようにするのなら、すべての例外を受けなければならないことをお忘れ無く。C# での実装では、次のようにする必要があります。
コード:
bool SomeMethod(...) {
    try {
        実装コード
        return true;
    } catch (Exception ex) {
        lastError = ex;
        return false;
    }
}


 そしてそれが、著しく生産性(バグの発見)を低下させることも、お忘れ無く。
_________________

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