- - PR -
メソッドの設計方法について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-26 11:43
Cでも同じインタフェースで設計しなければいけないことを考えると ByRefの方がいいんじゃないでしょうか? データが複雑なら構造体を作ってByRefで渡せばよいと思います。 | ||||||||||||||||
|
投稿日時: 2007-01-26 12:24
気持ち的には良く分かります。でもそのライブラリはとても使いにくそうですね。VB.NETから使いやすくするために、あるいはJavaから使いやすくするためにライブラリを用意しているのですから、それぞれの言語の流儀に合わせて設計して欲しいものです。このまま行くと「例外を返してくれないし、非標準的なインターフェースで使いにくいから、例外を返すラッパークラスを実装する」と言う本末転倒な事になりかねません。そもそも同じインターフェースを提供することが目的なら、C言語だけを提供して、Javaや.NETにはネィティブコードを呼び出す為の宣言を提供すれば事済みますね。
変わります。事前に内部状態からエラーになる事を判断できるなら、内部状態を返すメソッドを用意して、そもそも呼ばないようする設計もありうるでしょう。普通に取りうる状態なら構造化例外を使うべきでは無いという意見もあります。 | ||||||||||||||||
|
投稿日時: 2007-01-26 13:12
最初の1,2,3の中だったら、あとで情報を足せるから1かなぁ。
2,3はエラーか正常かを判断するのが面倒くさそう。 GetInfoをどう呼び出したいかを考えます。私なら以下のように使えるInfoを作るかなぁ。
| ||||||||||||||||
|
投稿日時: 2007-01-26 14:03
同意。 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を選択する理由としては不足だと思うがいかが?
ま。最終的にはこうなるけどね。 | ||||||||||||||||
|
投稿日時: 2007-01-26 22:01
???ナンセンスに思える。。。 例外機構のない言語から呼び出されるのかな、と思っていたんだけど、例外機構のない言語にも同じ設計をする、、、のですか。 機能設計であれば、どんな言語だろうと実装できるような設計をすると思いますが、プログラム設計の段階で、言語に依存しないってのは、無理がありませんか? また、「みんながみんな言語がわかる人でもなく」というのも、変かと。「みんながみんな、すべての言語をわかっているわけではない」だと、わかるのですが。まぁ、設計書を言語だけ書かなければならないので、それは大変かも。 反対にお尋ねしますが、Java や .NET にはクラスがあります。しかし、C 言語にはありません。これは、どうするおつもりですか? _________________ | ||||||||||||||||
|
投稿日時: 2007-01-26 22:17
ByRefはJavaでは太刀打ちできませんよ。
クラスは構造体とするとして、自分の場合はこんな感じ。 .NETはやったことないので、Javaコードですが。
って感じで設計しますね。 実行方法は、
って感じです。 シングルスレッドでの動作が保障されているなら、 例えばClassAのインスタンスBのgetInfo()の後に 同じくインスタンスBのhasError()を呼び出しても問題ありませんが、 マルチスレッドでは動作が保障されません。 | ||||||||||||||||
|
投稿日時: 2007-01-27 01:53
いろいろなご意見本当にありがとうございました。
大勢としてはA、@の順で推奨される方が多かったみたいですが、 確かにソフトウェアの理想的な姿に少しでも近づくならばAなの かなという感じがしています。 ただ@も実際的には使えないとも思えないので、決して否定される こともないと思っています。 Bはさすがに論外みたいですが・・・ どれが1位と答えをだすことを期待していたわけではないので、 皆様のご意見により、その一長一短がわかり大変勉強になりました。 とはいえ、「例外をなぜ使わないのか?」、「政治的理由では理由になっていない!」 「言語が違うのに言語依存しないことがおかしい」と感じられている方も やはり多いなと感じました。(だからあまり理由はいいたくなかったのですが^^;) この意見にはまったく同感ですが、開発に携わる会社も人も多いため、 技術的な優位性が必ずしも認められるわけではなく、こればかりはなかなか 末端の私がいくらがんばってもすぐの解決は難しいのが実情です。 会社に不満があるからといって、すぐに社長と喧嘩することができないのと 同じようなものだとご理解いただければと思います。 @になるかAになるかはまだ決着がついていませんが、 ここでのご意見を参考に決めていきたいと思います。 貴重なご意見ありがとうございました。 また何かありましたらぜひご教授ください。 | ||||||||||||||||
|
投稿日時: 2007-01-27 12:52
会社の大小にもよりますが、然るべきところへ然るべき方法で喧嘩するのは、普通だと思います。 それぞれの言語の、長所短所を知った人間が、それぞれの言語での実装方法を示しながら、同じ設計をするのは、何ら問題はないと思います。たとえば、MSDN では、C++.NET または C++/CLI、VB.NET または VB2005、J#、C# での使用方法が例示してあります。 こういった“例”を示さずに、一律に「この設計の通りに作れ」という方が、反対に無理ではないかと思います。 ところで、C 言語で次のようなコードを書くと、この行でプログラムが異常終了します。
Java などでは、例外が送出され、キャッチしていると、継続が可能です。 あるいは、この様な、C# のコード。
ファイルの存在チェックをしているので、ファイルがあればそのファイルのストリーム、無ければヌルが返ります。 しかし、ファイルのチェックが甘いため、書き込み権がなければ、例外が送出されます。 本当に例外を返さないようにするのなら、すべての例外を受けなければならないことをお忘れ無く。C# での実装では、次のようにする必要があります。
そしてそれが、著しく生産性(バグの発見)を低下させることも、お忘れ無く。 _________________ |