0

csv ファイルを読み取るコードをリファクタリングしようとしています。ファイルの各行の最初の文字は、レコードのタイプ ( H= ヘッダー、I= 情報、およびD= データ) を示します。各レコード タイプには固定の異なる数のフィールドがあります。私のプログラムは FasterCSV を使用してファイルから行を読み取り、case ステートメントを使用して行の処理方法を決定します。

     record_type = new_record[:record_type]
     case record_type
     when "H"
     factory_build_H_record(new_record)
     when "I"
     factory_build_I_record(new_record)
     when "D"
     factory_build_e_record(new_record)
     end

リファクタリングについては、OO プログラミングでの case ステートメントの使用に関するSandi Metz のブログ投稿に従い、case ステートメントを削除しようとしています。私の傾向としては、3 つのレコード タイプを表すいくつかのクラスを作成し、process_record. クラスを作成する方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

1

リンクしたブログ投稿は、具体的にはcaseステートメントを使用して、何かがどのような種類のオブジェクトであるかを伝えることに関するものです。それはしばしば悪いデザインの兆候であり、それが彼女が主張していることです.

あなたがcaseステートメントを使用している方法は、はるかに受け入れられます。実際、これをどのように再構成しても、行の正しい動作を判断するために、その列に対して何らかのテスト ( case、または、またはその他) を行うことになります。if

後でコードでこれらのオブジェクトをクラスによって区別する必要がある場合 (case ステートメントまたは if を使用)、ブログ記事の精神に違反しています。

解決策は、同じインターフェースを持つオブジェクトを作成することです (同じメソッドを持ち、同じ方法で使用されます。これらのメソッドの動作は、そのオブジェクトに対して正しいことを行うために、各クラスで内部的に異なります。

これがあなたのコンセプトを明確にするのに役立つことを願っています:)

于 2013-08-07T02:53:13.073 に答える
0

Case ステートメントは、あなたが持っているような小さくてかなり静的な条件付きケースでは悪くありません。

(理論的には) 将来 (H、I、および D 以外に) より多くのレコード タイプがあることを予想した場合、case ステートメントの問題は、Open-Closed Principle に違反し始める可能性があることです。

この場合、次のような一連のRecordTypeクラスを作成できます。

class HeaderRecordType
  def is_mine(record)
     ...
  end
  def build(record)
     ...
  end
end

class DataRecordType
   ...
end

class SomeNewRecordType
   ...
end

次に、ケースの代わりに、すべての のリストを反復処理してRecordType(または責任の連鎖を使用して)、それぞれに質問しますis_mine(record)。そのうちの 1 人が「はい」と言うとすぐに、見るのをやめて に電話しますbuild

于 2013-08-07T05:29:13.253 に答える