質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

戻り値あり、戻り値なしの使い分けについて

解決済

回答 7

投稿

  • 評価
  • クリップ 5
  • VIEW 9,453

kon_ta

score 81

基本的な質問かもしれませんが、メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは
どのようにすれば良いのでしょうか?
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識でしたが、
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも
用いることができるのではないかと思いました。

どなたかこのような場面で、戻り値ありの形でメソッドを記述するという具体例を示していただけると幸いです。
よろしくお願いい致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+4

例えば絶対値を求めるabs関数が int abs(int x) という形でなく void abs(int x, 【絶対値を処理する関数】) という形にしてしまえば、というお話になるでしょうか。

はい、このような形でプログラムを構成することは可能です。
むしろこのような形でプログラミングせざるを得ない世界があって、非同期プログラミングはまさにこれの連鎖でプログラムを組み上げていくことになります。
ただし実際やってみるとわかるのですが、そうやって書き上げられたプログラムは複雑怪奇、なかなか人間の目に読めたものではない代物になります。
やはり引数を与えたら戻り値が返ってくる、というプログラミングモデルは人間にわかりやすいのです。
ですからむしろ、非同期プログラミングの世界をどういう風に戻り値が返ってくるプログラミングに落とし込むか、という方向に人々は努力しています。
少し前はFutureパターン(またはPromiseパターン)という方法を使うのが標準的で、もう少し新しくはasync/await構文というのがよりわかりやすいと歓迎されています。
この辺のキーワード、興味があったら調べてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+3

メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは(中略)
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識

はい、それで合ってます。

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、
他の部分でも用いることができるのではないか

可能かどうかなら可能です。
しかし、とくに意図がないのなら、
なるべく多用すべきではありません。

なぜなら、密結合になるからです。
疎結合を目指すのが筋の良いプログラムです。

参照とは依存でもあり、呼ぶ側と呼ばれる側のメソッドが癒着し、
変更容易性、保守性、汎用性、再利用性などに支障をきたします。

家電でもケーブルはコンセントやスロットに差し込んで使い、
直接ハンダ付けはしない方が使いやすい、といった感じでしょうか。

参照を埋め込むよりは戻り値で済むなら戻り値で返します。
そういう依存の少ないメソッドを組み合わせてシステムを作ると
複雑なシステムでも後で変更しやすくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば

これを突き詰めると継続渡しスタイルという考え方に行き着きますが、ひとまず脇に置きます。

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とか計算できなくなります。

ポインタとか参照型とかが絡むとまた話が変わりますが、
とりあえずこんな感じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

戻り値なしはそのオブジェクトに対する操作(情報変更など)だけで完結するもの、出力だけなどの結果を求めないものなどに使うことになるのではないでしょうか。

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも 
用いることができるのではないかと思いました。

「他のメソッド」を使うことが最終目的ならそれでもいいのですが、元のメソッド(戻り値ありにしていたもの)の結果を他の形で使うことが不可能になります。
基本的にメソッドは役割ごとに分割するべきで、例えば図形であれば面積を求めるなら、その結果である面積の値を計算して返すという段階で終了するべきです。他の出力などの役割は別のところで行うべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

Cしか経験はないのですが・・・
これまで質問者さんのようなことで悩んだ経験はほとんど記憶がありません。

何かをしたい場合、情報AとBが必要だが、Bを得るためにはデータa,bを用いて
何らかの作業(演算)が必要な場合
B = getB(a,b);
などとやるはずです。これを
foo(A, a, b);
でも確かにできますが、そうすると
「情報A,Bを用いて処理Xをする」
という役割は元々の関数ではなく foo() が担うことになります。
また、
「データ a, b を用いてBを求める」
という事が foo() の中を見ないとわからなくなります。

結局は、関数(メソッド)で役割をどう分担するか、の問題だと思いますが、
引数を渡す → 渡された引数で処理をする → 結果を返す → 結果を受け取り処理を進める
がスッキリすると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

C言語の場合は他の言語と違って、例外機構やオブジェクト指向がありませんので、関数外部とのやり取りはすべて引数を通じて行うしかありません。また、配列で返り値を返すなんて芸当も困難ですので、「返り値はエラーコード、他にやり取りするデータはポインタ経由で書き込み」というようなインターフェースになっていることもあります。

オブジェクト指向で、例外も備えたような言語の場合、エラーは例外で投げられるので、呼び出した側で必要な情報が「成功か失敗か」だけなら、値を返さなくても構いません(Javaのsetterなどは、ふつうそんな感じになります)。

ただ、jQueryに見られるように、メソッドチェーンを行うために「返すものがなくてもとりあえずthisを返す」というような書き方も存在しています。あと、Rubyではメソッドの最後の行が自動で返り値になるので、返すつもりがなくても意図しないものが返り値となっていることがよくあります(たいていの場合、その値は捨てられるだけなのでどこにも影響しませんが)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述する」が基本だと思います。

そのメソッド内部で値を別のメソッドに引数として渡すことは可能ですが、どのメソッドに渡すのかが固定(コードの中で指定)なので、柔軟な使い方が出来ません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る