基本的な質問かもしれませんが、メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは
どのようにすれば良いのでしょうか?
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識でしたが、
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも
用いることができるのではないかと思いました。
どなたかこのような場面で、戻り値ありの形でメソッドを記述するという具体例を示していただけると幸いです。
よろしくお願いい致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
例えば絶対値を求めるabs関数が int abs(int x) という形でなく void abs(int x, 【絶対値を処理する関数】) という形にしてしまえば、というお話になるでしょうか。
はい、このような形でプログラムを構成することは可能です。
むしろこのような形でプログラミングせざるを得ない世界があって、非同期プログラミングはまさにこれの連鎖でプログラムを組み上げていくことになります。
ただし実際やってみるとわかるのですが、そうやって書き上げられたプログラムは複雑怪奇、なかなか人間の目に読めたものではない代物になります。
やはり引数を与えたら戻り値が返ってくる、というプログラミングモデルは人間にわかりやすいのです。
ですからむしろ、非同期プログラミングの世界をどういう風に戻り値が返ってくるプログラミングに落とし込むか、という方向に人々は努力しています。
少し前はFutureパターン(またはPromiseパターン)という方法を使うのが標準的で、もう少し新しくはasync/await構文というのがよりわかりやすいと歓迎されています。
この辺のキーワード、興味があったら調べてみてください。
投稿2016/07/19 01:09
総合スコア5568
0
ベストアンサー
メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは(中略)
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識
はい、それで合ってます。
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、
他の部分でも用いることができるのではないか
可能かどうかなら可能です。
しかし、とくに意図がないのなら、
なるべく多用すべきではありません。
なぜなら、密結合になるからです。
疎結合を目指すのが筋の良いプログラムです。
参照とは依存でもあり、呼ぶ側と呼ばれる側のメソッドが癒着し、
変更容易性、保守性、汎用性、再利用性などに支障をきたします。
家電でもケーブルはコンセントやスロットに差し込んで使い、
直接ハンダ付けはしない方が使いやすい、といった感じでしょうか。
参照を埋め込むよりは戻り値で済むなら戻り値で返します。
そういう依存の少ないメソッドを組み合わせてシステムを作ると
複雑なシステムでも後で変更しやすくなります。
投稿2016/07/19 01:45
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば
これを突き詰めると継続渡しスタイルという考え方に行き着きますが、ひとまず脇に置きます。
A.
int add(int left, int right) { return left + right; } int mul(int left, int right) { return left * right; } void main() { int x = add(1,2); int y = mul(3,x); printf("%d",y); }
B.
void add_(int left, int right) { int x = left + right; mul_(3,x); } void mul_(int left, int right) { int y = left * right; printf("%d",y); } void main() { add_(1,2) }
A,Bともに(1+2)*3の結果を表示します。
Aは戻り値で返してます。
Bは内部で別の関数を呼んでます。
Bのadd_は足した結果を3倍しないといけませんし、
mul_は結果を必ず表示しないといけません。
つまり再利用性が低いです。
例えば同時に2*3+5とか計算できなくなります。
ポインタとか参照型とかが絡むとまた話が変わりますが、
とりあえずこんな感じです。
投稿2016/07/19 01:16
総合スコア13521
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Cしか経験はないのですが・・・
これまで質問者さんのようなことで悩んだ経験はほとんど記憶がありません。
何かをしたい場合、情報AとBが必要だが、Bを得るためにはデータa,bを用いて
何らかの作業(演算)が必要な場合
B = getB(a,b);
などとやるはずです。これを
foo(A, a, b);
でも確かにできますが、そうすると
「情報A,Bを用いて処理Xをする」
という役割は元々の関数ではなく foo() が担うことになります。
また、
「データ a, b を用いてBを求める」
という事が foo() の中を見ないとわからなくなります。
結局は、関数(メソッド)で役割をどう分担するか、の問題だと思いますが、
引数を渡す → 渡された引数で処理をする → 結果を返す → 結果を受け取り処理を進める
がスッキリすると思います。
投稿2016/07/19 01:38
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
戻り値なしはそのオブジェクトに対する操作(情報変更など)だけで完結するもの、出力だけなどの結果を求めないものなどに使うことになるのではないでしょうか。
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも
用いることができるのではないかと思いました。
「他のメソッド」を使うことが最終目的ならそれでもいいのですが、元のメソッド(戻り値ありにしていたもの)の結果を他の形で使うことが不可能になります。
基本的にメソッドは役割ごとに分割するべきで、例えば図形であれば面積を求めるなら、その結果である面積の値を計算して返すという段階で終了するべきです。他の出力などの役割は別のところで行うべきです。
投稿2016/07/19 01:00
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述する」が基本だと思います。
そのメソッド内部で値を別のメソッドに引数として渡すことは可能ですが、どのメソッドに渡すのかが固定(コードの中で指定)なので、柔軟な使い方が出来ません。
投稿2016/07/19 01:31
総合スコア6915
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語の場合は他の言語と違って、例外機構やオブジェクト指向がありませんので、関数外部とのやり取りはすべて引数を通じて行うしかありません。また、配列で返り値を返すなんて芸当も困難ですので、「返り値はエラーコード、他にやり取りするデータはポインタ経由で書き込み」というようなインターフェースになっていることもあります。
オブジェクト指向で、例外も備えたような言語の場合、エラーは例外で投げられるので、呼び出した側で必要な情報が「成功か失敗か」だけなら、値を返さなくても構いません(Javaのsetterなどは、ふつうそんな感じになります)。
ただ、jQueryに見られるように、メソッドチェーンを行うために「返すものがなくてもとりあえずthis
を返す」というような書き方も存在しています。あと、Rubyではメソッドの最後の行が自動で返り値になるので、返すつもりがなくても意図しないものが返り値となっていることがよくあります(たいていの場合、その値は捨てられるだけなのでどこにも影響しませんが)。
投稿2016/07/19 01:01
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。