私はプログラミングの大物ではありませんが、関数から常に値を返す必要があることをプログラマーから何度も聞いています。理由を知りたい。
9 に答える
関数は何も返す必要はありません...C(++)関数を見ると、それらの多くは(明示的にではなく)返しません。
void nonReturningFunction(const int *someParam);
int main()
{
int i = 12;
nonReturningFunction(&i);
return 0;
}
void nonReturningFunction(const int *someParam)
{
printf("I print the value of a parameter: %d",someParam);
}
後者は何も返しません、まあ、それはボイドを返します。main関数は何かを返します:0
、これは通常、プログラムが終了したことをシステムに通知するためのシステムへのシグナルであり、正常に終了しました。
同じロジックがPHPやその他のプログラミング言語にも当てはまります。一部の関数の戻り値は関連性があり、別の関数は何も返す必要がない場合があります。一般に、関数はプログラムのフローに関連しているため、値を返します。
たとえば、クラスを取り上げます。
<?php
class Foo
{
private $foo,$bar;
public function __construct()
{
$this->foo = 'bar';
}
public function getFoo()
{
return $this->foo;//<-- getter for private variable
}
public function getBar()
{
return $this->foo;//<-- getter for private variable
}
public function setBar($val = null)
{
$this->bar = $val;
return $this;//<-- return instance for fluent interfacing
}
public function setFoo($val = null)
{
$this->foo = $val;
return $this;
}
}
$f = new Foo();
$f->setFoo('foo')->setBar('bar');//<-- fluent interface
echo $f->getFoo();
?>
setter関数が何も返さない場合は、次のように記述する必要があります。
$f->setFoo('foo');
$f->setBar('Bar');
したがって、この場合、戻り値が関係します。それらが無関係である別の例:
function manipulateArray(array &$arr)//<-- pass by reference
{
sort($arr);
}
$arr = range('Z','A');
manipulateArray($arr);
var_dump($arr);//array is sorted
とは対照的に:
function manipulateArray(array $arr)//<-- pass by copy
{
sort($arr);
return $arr;
}
$arr = range('Z','A');
manipulateArray($arr);
var_dump($arr);//array is not sorted!
$arr = manipulateArray($arr);//<-- requires reassign
多くの場合、参照による受け渡しは危険であると見なされます。そのため、一般的に後者のアプローチの方が優れていると考えられています。したがって、多くの場合、関数は値を返す必要はありませんが、コード全体がより安全になるため、すべて同じように機能します。そのため、関数は常に値を返さ
なければならないという印象を受けているのかもしれません。
これは古いプログラミングの遺産です。Fortranのような古い言語では、常にint、float、boolなどの型で返す必要がありました。Cなので、「void」型で返すことができます。これは、ほとんどのC関数で指定しない場合のデフォルトです。 returnステートメントの場合、最後にvoidを付けて戻ります。たとえばJavaでは、リターンタイプを指定してから、そのタイプでリターンする必要があります。何も返したくない場合は、「void」タイプを使用します。
//This works
public void boo() {
return;
}
//This gets you an error
public int boo() {
return;
}
//This gets you an error too, because you must specify a type for any function in Java
public boo() {
return;
}
ですから、それはLixが言ったことに似ています。もしあなたが何かを返すことがあれば、あなたはそうします。ほとんどの関数型プログラムでは、関数はデータ、または真/偽のマーキングの成功または失敗のいずれかを返すことができます。多くのシステムでは、関数は「1」や「-1」のような成功または失敗を示すintを返すことができます。Unixシェルプログラムはこれを使用します。
PHPのような他の言語では、何も返す必要はありませんが、バックグラウンドでは、PHPは戻り値として「void」型を関数に付加するため、明示的に記述する必要はありません。
お役に立てれば
これは、関数の最終的な終了点が存在するようにするために行われます。これは主に、読みやすさを向上させ、将来のプログラマーがあなたがやろうとしていることを理解できるようにすることです。
関数が何を返すかについての仮定はありません。
たくさんの理由があります...
これはアーキテクチャに適しています。関数はパラメータを受け取り、それらを操作して、期待される結果を返します。このようにして、それを再利用し、コードを整理できる場合があります。
これは単体テストに適しています。関数が期待される結果を返すかどうかを非常に簡単に確認できます。
一般的に、コンピュータープログラミングでは、関数は再利用可能なコードの単位であり、入力(何も含まない)を受け取り、値を返します。
一部の言語には、プロシージャと呼ばれる関数と同様の構造があり、これらは再利用可能なコードであり、入力(何も含まない)を取り、アクティビティを実行しますが、結果を返しません。
ただし、一部の言語では、構文構造として後者がなく、関数を使用してプロシージャを実装する場合があります。したがって、ここでは、結果を無視する関数を取得します。また、一部の言語では、コードが関数から何かを返すように実際に強制する必要がない場合があります(つまり、関数を使用してプロシージャを実装します)。
したがって、後者のみをオプションとして使用する場合は、@ lixのように、関数から物事を返すことをお勧めします。主な理由は、関数はプロシージャのように使用できますが、呼び出し元が関数のように呼び出して、結果を処理することを期待する場合があるためです。テストコードは主なユースケースであり、この規則に従う唯一の理由である可能性があることに注意してください。
個人的にはコンベンションがその答えだと思います。自分に最適な方法を実行しますが、常に同じことを実行し、分岐する必要がある場合は、ユーザーに知らせる方法を見つけます。
また:柔軟性。echo
関数内からのingとingの比較を検討してくださいreturn
。たとえば、returnedtrue
またはfalse
from関数を使用すると、ビューでの表示方法を必要な数だけ変更できます。文字列をエコーしても、この柔軟性は得られません。
以前のいくつかの言語には、プロシージャと関数がありました。プロシージャは何も返しませんでした(彼らはただ何かをしました)。関数は何かを返しました。関数が単に無効になる可能性があるため(Cで使用されているように)、誰かが両方を持つ必要はないと判断したと思います。データベースにデータを保存するためのクイック関数を作成しました。データはいくつかのレベルでフィルタリングされたため、エラーの可能性はごくわずかでしたが、エラーにエコーするアラートを関数に含めたので、エラーアラートを返す必要はありませんでした。(これは社内サイトであり、公開されません)したがって、関数が何かを返すようにする必要はまったくありませんでした。
問題は、常に値を返す必要がある理由であるため、値を返すことが良い場合がある理由ではありませんが、常に値を返す必要があることを要求する理由が存在し、常に値を返す正当な理由はありません。働き。
私は常に特定のケースに依存します。たとえば、静的メソッドはオブジェクトを変更できないため、常に何かを返す必要があります。ただし、オブジェクトへの参照をメソッドに渡せば、とにかくそれを行うことができます。参照変数のように(C ++のポインターのように)、または単にオブジェクトのように(PHPのように暗黙の参照として渡されます)。後の練習は、参照を受け取り、メソッドが定義されているのと同じクラスを変更するメソッドのように、良い方法ではありません。メソッドを非静的にしないのはなぜですか。さまざまなクラス(おそらく派生クラスまたは抽象クラス)で再利用されるメソッドが必要な場合は、後者が常に当てはまるとは限りません。また、最近のIDEの場合、変数の型が返されることを宣言する方が適切であるため、インタープリターまたはコンパイラーは、実行時間ではなくコンパイル時に多くのエラーをキャッチします。おもう、
データベースにログを記録する関数を書いているときに、同じ質問が思い浮かびました。何も返却する必要はありません。ロギング関数が呼び出されているときに、nullを返していることに気づきました。いくつかの調査の結果、PHPの場合、関数に戻り値がない場合、デフォルトではnullが返されます。私はこれをphpドキュメントでも見つけました:
だから私は考えました-nullを返す代わりに、いくつかの有用なメッセージを返す必要があります、そして私は「エラーが正常にログに記録されました」という文字列を返しました