2012-09-10 17 views
5

私は大きなプログラミング人ではありませんが、プログラマーから多くの時間、関数から常に値を返す必要があります。理由を知りたいなぜ関数から常に値を返すべきですか?

+0

何をするのとは対照的に? – Duniyadnd

+3

RTFM:http://php.net/manual/en/function.return.php – diEcho

+6

@diEcho - このマニュアルへのリンクは、この質問に全く答えていません... – Lix

答えて

5

役立ちます:

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); 
} 

後者は何も返しません。まあ、それはvoidを返します。主な機能は何かを返します: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 

後者のアプローチは、一般的に良好であると考えられている理由、それはです。したがって、多くの場合、関数は値を返す必要はありませんが、コード全体をより安全にするため、関数はすべて同じ結果を返します。
その理由は、機能が常にの値を返す必要があるという印象を受けている理由が考えられます。

7

これは、関数の最後の終了点が存在するように行われます。主に読みやすさを向上させ、将来のプログラマーがあなたがしようとしていたことを理解するのに役立ちます。

関数が返すものについての仮定はありません。

5

ように多くの理由があります...

あなたのアーキテクチャのためのより良いです

:関数はそれらとリターンが期待結果とパラメータ、仕事を取ります。このようにして、コードを再利用したり、コードを整理することができます。

これはunit testingの方が優れているため、関数が期待した結果を返すかどうかを非常に簡単に確認できます。

3

一般にコンピュータプログラミングでは、関数は何らかの入力(何も含まない)をとり、値を返す再利用可能なコード単位です。

一部の言語は、プロシージャと呼ばれる関数と同様の構造を持ち、何らかの入力(何も含まない)を取り、何らかのアクティビティを実行するが結果を返さない再利用可能なコードです。

しかし、いくつかの言語は後者を構文構造として持たず、関数を使って手続きを実装することはできません。ここでは、結果を無視して関数を取得します。また、一部の言語では、実際にコードが関数から何かを返すように強制する必要はありません(つまり、関数を使って手続きを実装します)。

あなたのオプションとして後者だけがあるなら、@ lixのように、関数からものを返すのが良い方法だと主張することができます。主な理由は、関数をプロシージャのように使用することはできますが、呼び出し元は関数のように呼び出すことができ、結果を処理することが期待されます。テストコードは主な使用例であり、この規則に従うのは唯一の理由かもしれません。

個人的に私はコンベンションが答えだと思います。何が一番効果的なのか、いつも同じことをやろうとするならば、また発散する必要がある場合は、ユーザーに知らせる方法を見つけてください。

2

また、柔軟性。関数内からechoを入力してreturnを入力します。たとえば、関数から返されたtrueまたはfalseを使用すると、さまざまな方法でビュー内での表示方法を変更できます。文字列をエコーし​​ても、この柔軟性は得られません。

7

これは古いプログラミングの伝承です。 Fortranのような古い言語では、int型、float型、bool型などの型を返す必要がありました.Cでは、void型で返すことができます。 return文は、最後にvoidを返します。たとえば、Javaでは戻り値の型を指定してから、その型で返さなければなりません。あなたが何かを返すようにしたくない場合は、「無効」タイプを使用します。

//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が言ったようなものです。ほとんどの機能プログラムでは、関数はデータまたはtrue/falseマーキングの成功または失敗のいずれかを返します。多くのシステムでは、関数は '1'や '-1'のように成功または失敗を示すintを返すことができます。 Unixシェルプログラムはこれを使用します。

PHPのような他の言語では、何も返す必要はありませんが、バックグラウンドでPHPは関数に戻り値として 'void'型をつけているので、明示的に書く必要はありません。

希望これは(まあ、ない明示的に)それらの多くない、あなたがC(++)関数を見れば機能が...何も返さない必要が

+0

これは最近私が見てきた空白の代わりに、すべてのリターン0を説明するでしょう。 – Steinin

0

一部の初期の言語には、手順と機能がありました。手続きは何も返しませんでした(彼らは何かをしました)。関数が何かを返しました。私は誰かが関数が単純に無効になる可能性があるので(Cで使用されるように)、両方を持つ必要はないと判断したと思います。私はちょうどデータベースにデータを格納するための簡単な関数を書いた。データはいくつかのレベルでフィルタリングされていたので、エラーの確率は無視できるものでしたが、エラーにエコーするアラートが関数に含まれていたので、エラーアラートを返す必要はありませんでした。 (これは社内のサイトであり、一般向けではありません)ので、関数を返すことは全く必要ありませんでした。

なぜ値を返すのがよいのかという理由から、値を返すのはなぜ良いのではないのですが、いつも値を返さなければならない理由は何かありますし、いつも返す正当な理由はありません関数からの値。

関連する問題