2016-03-31 14 views
2

私はこのように、さらに複数の割当のために複数の結果を返す方法に対する強い感情を持っている:複数の結果を反復で返していますか?

class ImportUsersFromFile 
    def perform 
    ... 
    [imported_rows, errors] 
    end 
end 

それはこの事と第二ある最初の要素その曖昧とinobviousデータ構造「配列を導入するので他のものです "。このような構造が返されることが明白であれば問題ありません。たとえば、first_name, middle_name, last_nameという3つの値が、Person#name_partsのようなメソッドから期待されます。

しかし、私の言葉以外のもので私の意見を裏付けることはできません。複数の結果がある種のアンチパターンやコードの匂いと考えられていますか?いくつかのリンクが大好きです。

+0

あなたのコードは、RubyのDestructuring機能を使用して複数の値にできる配列を返します。配列の何が問題ですか? ところで、なぜ戻り値に入れるのではなく、エラーを起こさないのですか? – sschmeck

+0

この場合、配列を破壊することで何が問題になるのか説明しました。インターフェイスが明確ではありません。 1つは、 'perform'がインポートされたユーザのリストを返すと期待することです。もう1つは本当に2つのリストの配列を返すことを知ることです。エラーは例外ではないため、私の場合は発生しません。一部の行にエラーがある場合は、他の行をインポートする必要があります。 – Hnatt

+0

次に、メソッドインタフェースは2つのバケットを返します.1つは良い行と1つは悪いバケットです。それは私には合理的だが反パターンを好まない。エラーの場合に問題がなければ、 'users、_ = importer.perform'のように明示的に無視してください。 – sschmeck

答えて

1

これは価値があるので、私はこれを反パターンと呼ぶのかどうかはわかりません。私はあなたのポイントを取るんが、Rubyは、特にあなたがについて話す非常に問題とその通訳の契約があるという事実のために:だから、私に関する限り

def foo 
    [1,2] 
end 

a = foo # -> a = [1,2] 
a,b = foo # -> a = 1, b = 2 
_,b = foo # -> b = 2 

を、メソッド/関数が戻ることを知ってました2つの値は、あなたがの2つの値を渡すことを知らなければならないことより悪くありません。

あなたはそれがあなたに義務を負わせないなら、あなたは確かにそれをやるべきではありません。それには何も問題はありません。

+0

私の問題は 'foo'と' bar'では説明できません。それは意味論に関するより多くのものです。私が言ったように、3つの値の配列を返すメソッド 'Person#name_parts'を完全に有効と見出しますが、その順序は名前から明白ですが、いくつかのバッチアクションを実行し、失敗。着信パラメータ(名前と順序)は、メソッドのシグネチャで確認できます。しかし、返される値の順序を知るには、メソッドのコードを読む必要があります。それは私のための便利なインターフェイスではありません。 – Hnatt

+0

@Hnatt Rubyでは、あなたのインターフェースは慣れていると思います。あなたまたはあなたのコードのユーザに間違っていると感じたら、それを自由に変更してください。代替案は、カスタム_Valueオブジェクト_またはRubyのハッシュで実装された名前付きの値です。 – sschmeck

+0

@Hnatt、許してください。しかし、問題を一般的なサンプルコード( "foos and bars")で説明できない場合は、セマンティクスの問題です。プログラミングの問題であるかどうかは個人的には分かりません。セマンティックプログラミングの問題**が例のコードで説明できるということは慣用的ではありませんか?繰り返しますが、入力パラメータの順序を知らなくても返される値の順序を知る必要はありますか? –

関連する問題