「先輩」と「後輩」のやりとりを通し、IBM Rationalのエンタープライズ・モダナイゼーションがもたらす価値についてご紹介します。ぜひ「後輩」と一緒に最新のメインフレーム開発テスト環境(IBM Integrated Solution for System z Development)について理解を深めていただき、メインフレーム環境を最大限に活用し、より価値のあるソフトウェア開発を追求ください。
7. 既存の実装
class Order < ActiveRecord::Base
include ProviderA
include ProviderB
include ProviderC
・
・
end
module ProviderA
extend ActiveSupport::Concern
included do
with_options if: :provider_a? do |o|
o.validates :email, presence: true
o.validates :bill_office_number, presence: true
・
・
end
end
end
➢ 一つのクラスで実装。
➢ 各事業者のバリデーションを書いた concernを定義し、モデルで読み込む。
(事業所コード)
(メールアドレス)
8. 既存の実装の問題点1
class Order < ActiveRecord::Base
include ProviderA
include ProviderB
include ProviderC
・
・
end
module ProviderA
extend ActiveSupport::Concern
def phone_type_text_for_provider_a
end
end
➢ 同じようなメソッドが様々な concernに
実装されていく・・・。
➢ 実装者によってメソッド名の流儀が違
う・・・。事業者数も多くレビュアーも把
握しきれない。
module ProviderB
extend ActiveSupport::Concern
def phone_type_text_for_provider_b
end
end
module ProviderC
extend ActiveSupport::Concern
def provider_c_phone_type_text
end
end
{
'自宅' => 1,
'携帯' => 2,
'家族・親族 ' => 3,
'配偶者' => 4,
'家主・管理人 ' => 5,
'事務所' => 6,
'その他' => 9,
}
{
'事務所' => 1,
'代表電話' => 2,
'携帯電話' => 3,
'その他' => 4
}
9. 既存の実装の問題点2
class Order < ActiveRecord::Base
include ProviderA
include ProviderB
include ProviderC
・
・
end
module ProviderA
extend ActiveSupport::Concern
LOW_VOLTAGE_EQUIPMENTS_FOR_A = {
'空調' => 1, '冷凍/冷蔵' => 2, 'モータ' => 3, 'その他' => 9
}
def low_voltage_equipment_text
LOW_VOLTAGE_EQUIPMENTS_FOR_A.key(low_voltage_equipment)
end
end
module ProviderB
extend ActiveSupport::Concern
LOW_VOLTAGE_EQUIPMENTS_FOR_B = {
'冷凍/冷蔵' => 1, 'モータ' => 2, 'コンプレッサ' => 3, 'その他
' => 9
}
def low_voltage_equipment_text
LOW_VOLTAGE_EQUIPMENTS_FOR_B.key(low_voltage_equipment)
end
end
気づいたら同名のメソッドが追加さ
れ、後からincludeされたもので上書
きされる・・!
※実際にあったが、まったく同じメソッドであったため、問題が顕在化しなかった。
10. 既存の実装の問題点3
class Order < ActiveRecord::Base
include ProviderA
include ProviderB
include ProviderC
・
・
def applied_at_cannnot_be_in_the_past
return unless applied_at && applied_at < Time.current
errors.add(:applied_at, “過去の日付は使用できません”)
end
end
module ProviderA
extend ActiveSupport::Concern
included do
with_options if: :provider_a? do |o|
o.validate :applied_at_cannnot_be_in_the_past
end
end
end
module ProviderB
extend ActiveSupport::Concern
included do
with_options if: :provider_b? do |o|
o.validate :applied_at_cannnot_be_in_the_past
end
end
end➢ 複数の事業者に同じバリデーションメソッドを
違う条件で用たい。
後から呼ばれた条件だけに適用されてしま
う!
※with_optionsの中にifを書くと後ろの条件しか適用されない問題と同じ。
(詳しくは[1], [2]をご覧ください)
with_options if: :condition_a? do |v|
v.validates :hoge, presence: true, if: :condition_b?
end
[1] https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations.rb#L154
[2] https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb#L374
11. class Order < ActiveRecord::Base
with_options if: -> { provider_a? || provider_x? } do |o|
o.validates :family_name, length: { maximum: 20 }
o.validates :given_name, length: { maximum: 20 }
・
・
end
with_options if: -> { provider_b? || provider_y? } do |o|
o.validates :family_name, length: { maximum: 30 }
o.validates :given_name, length: { maximum: 30 }
・
・
end
end
各事業者ごとに一つのファイルで完
結
モデルにも事業者ごとのバリデー
ションが記述されコードが散乱
理想
現実
事業者によっては同じバリデーショ
ンの場合もある
今行なっている修正が、他の事業者へ影響があるかどうかすぐに分からない・・・!
既存の実装の問題点4