同じ処理ステップを別ルーティンとしてまとめることは可能?

投稿者: Anonymous

お世話になります。多くの基本的なことを理解しないで
自分のビジネスに関係したアプリをrailsで作って
いるものです。アクションのコーディング中で同じ操作
が結構あります。同じステップをいくつも記述するのはやはり
余りに見苦しいし、無駄です。それでその部分をメソッドに
するには、スコープの問題でやりにくい。あるいは
引数があまりに数が大きくなりすぎる。オブジェクト化
するほどでもないし、ちょっと大げさ過ぎます。このような
コーディングの時、簡単に同じ部分だけを別の個所に記述
して他のアクションとあるいは同じアクション内で共有する
ことはできないでしょうか?
VBAでは何か関数のオプションでできたような記憶が
ありますが、rubyでは可能ですか?よろしくお願い
します。


例えば次のようなステップがあるとします。

filea.field_a = ary[1]
filea.field_b = ary[2]
filea.field_c = ary[5]
filea.field_d = ary[6].to_i





このコーディングは変えたくない,
そして、数箇所繰り返して出現するとします。
当然同じものをコーディングしたくありません。
従って、どこか一か所に書いて共有して使えれば
便利ですし、コーディングミスも防げます。


フィールド名は違うかも知れないが内容は殆んど
同じです。renderで理解できないエラーが出たのと、
newとeditのアクションはコンピューターで判断
させた方がユーザーには親切だと思い、つまり
入力でキーが重複したときは自動的にedit画面に
導いた方がユーザは助かります。
そしてrenderを使わないで、すべてredirect_toで入力ミスを返しているので
アクション毎の入力データをすべてファイルで管理する
必要が有り、配列データで各フィールの値を持っています。
そして配列フィールドから最終的にマスターに登録します。
確かに異常なコーディングかもしれません。でもひと昔の
言語cobol等では簡単にできたものです。そして普通でした。

解決

例えば以下のようなメソッドではいかがでしょうか。

# 定義
def  set_file_field_with_ary(file, ary)
    file.field_a = ary[1]
    file.field_b = ary[2]
    file.field_c = ary[5]
    file.field_d = ary[6].to_i
end

# 使用
set_file_field_with_ary(filea, ary)

参照渡しについての補足:

メソッドから変更対象のオブジェクト(file)を return していないのは、メソッドに渡されるのがオブジェクトの参照である事によります。
つまり、上のメソッドはオブジェクトのコピーを操作しているのではなく、元のオブジェクトその物を変更しています。
いわゆる「破壊的」メソッドです。

実行:

ary[1] = "あいう"
set_file_field_with_ary(filea, ary)
puts "変数 filea の 'field_a' の値: #{filea.field_a}"

ary[1] = "ABC"
set_file_field_with_ary(filea, ary)
puts "変数 filea の 'field_a' の値: #{filea.field_a}"

出力:

変数 filea の 'field_a' の値: あいう
変数 filea の 'field_a' の値: ABC

「Ruby 参照渡し」などのキーワードで検索すると、色々と解説があると思います。
(もちろん、戻り値として返した方が都合がいい場合もありますし、それでもまったく構いません)

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *