1

ペアリング セッションで、Ruby の nil を処理する方法と、空の文字列を返す場合に (Ruby の CSV パッケージを介した) csv 解析の方が優れているかどうかという問題に直面しました ...

ここで作成していた仕様を確認できます。

https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/spec/models/organization_spec.rb

テキスト ファイルのデータを csv 形式で処理しようとしていますが、入力要素が nil の場合、郵便番号を抽出する処理で barf が発生するという問題があるため、次の悲しいパスがあります。

expect(Organization.extract_postcode('HARROW BAPTIST CHURCH, COLLEGE ROAD, HARROW')).to eq(nil)
expect(Organization.extract_postcode(nil)).to eq(nil)

実際、この extract_postcode メソッドは空の文字列を返す可能性があると思います。ここで実装したコードを確認できます。

https://github.com/mtc2013/LocalSupport/blob/seed-refactoring/app/models/organization.rb

def self.extract_postcode(address_with_trailing_postcode)  
    match = address_with_trailing_postcode && address_with_trailing_postcode.match(/\s*(\w\w\d\s* \d\w\w)/)
    match && match[1]
  end

私たちはまだこれが少し醜いと感じています。Objective C のようなものでは、nil オブジェクトのメソッドを呼び出すだけで、nil が返されます。Rubyでは例外がスローされるので、この「match && match[1]」操作でチェックしていますが、これは推奨されますか?

別のアプローチとして、CSV 解析で常に nil ではなく空の文字列が生成されるようにすることも考えられますが、nil が渡されないようにコードを保護する必要があるように感じます。

私たちの最終的な質問は、ここでのルビーの方法は何ですか? メソッドがある場合、nil が渡されたときにエラーをスローする必要がありますか? または、それらをキャッチして nil を返す必要がありますか? または、文字列操作メソッドの場合は空の文字列ですか?

nil エラーをスローすることが推奨されている場合は、欠落している要素を空の文字列として扱うように CSV 解析を修正することに集中する必要があると思います...または、nil エラーをキャッチして独自のエラーで再スローする方がよいでしょう。カスタムエラーメッセージ?

どんな提案でも大歓迎です

4

1 に答える 1

2

extract_postcodeあなたの復帰nilは正しいと思います。住所から抽出する郵便番号がない場合は、適切な表現です。メソッドが代わりに空の文字列を返し、呼び出し元がそれに対処することを期待している場合、呼び出し元のコードは、その値を処理する方法を決定するために内容を直接確認する必要があります (結局、有効または有用な郵便番号ではありません)。 )。空の文字列の郵便番号は、String メソッドを安全に呼び出すことができるという点でのみ役立ちますが、実際には郵便番号データを持っていないという事実は無視されています。事実、コードは遅かれ早かれ確認する必要があります。

私が思うようなメソッド名extract_postcodeでは、郵便番号データがなかったときに例外を発生させることも合理的です。しかし、例外処理は、必要な論理フローを取得するためのより厄介な方法である可能性があります。

抽出したデータを別の場所に保存している場合は、戻り値を設定方法に合わせることを検討する価値があります。データベースが「郵便番号なし」を表すために郵便番号列に null を格納する場合、Ruby の nil 値は、空の文字列よりもそれに一致します。これを行うと、表現間のコード マッピングが節約されます。

最終的に、ここには「Ruby の方法」はありません。少なくとも、このコードが動作するアプリケーション全体のどのレイヤーのコンテキストでも、自己一貫性を保つことで、最高のリターンが得られます。

于 2013-04-27T21:50:21.123 に答える