Saya memiliki pernyataan kasus yang sangat panjang:

def gather_intel
  case OPTIONS[:type]
    when /osha/
      FORMAT.info('Creating OSHA Regional email..')
      EMAILS.osha_reg
    when /pend/
      FORMAT.info('Creating 6 day hold pending email..')
      EMAILS.pend
    when /60/
      FORMAT.info('Creating 60 day hold account deletion email..')
      EMAILS.sixty_day
    when /generic/
      FORMAT.info('Creating generic email..')
      EMAILS.generic
    when /resolve/
      FORMAT.info('Creating resolution ticket..')
      EMAILS.resolve
    when /esc/
      FORMAT.info('Creating escalation ticket..')
      EMAILS.assign
    when /pii/
      FORMAT.info('Creating request to remove personal info..')
      EMAILS.remove_pii
    when /vip/
      FORMAT.info('Creating VIP user email..')
      EMAILS.vip_user
    when /inop/
      FORMAT.info('Creating INOP user email..')
      EMAILS.in_op_user
    when /dev/
      if OPTIONS[:type].to_s.include?('dev=unlock')
        message = 'unlock'
      else
        message = 'password reset'
      end
      FORMAT.info("Creating dev account #{message} email")
      EMAILS.dev_account(OPTIONS[:type])
    else
      raise ERROR
  end
end

case statement ini berfungsi namun saya tidak dapat menunjukkan kode lainnya karena sensitivitas dan materi proyek. Pertanyaan saya adalah, apakah ada cara yang lebih mudah dibaca untuk menulis case statement ini, atau cara yang lebih pendek untuk menulisnya?

0
JohnDoeYo 6 Juli 2016, 02:03
Tidak perlu contoh Anda terlalu panjang. Anda dapat memasangkannya menjadi beberapa klausa saja tanpa mengubah substansi pertanyaan.
 – 
Cary Swoveland
6 Juli 2016, 02:20
Saya baru saja menyalin seluruh metode ke SO, hanya untuk memastikan. Tidak ingin seseorang menganggap saya tidak melakukan apa-apa.
 – 
JohnDoeYo
6 Juli 2016, 02:31
2
Ini adalah kandidat sempurna untuk Refactoring Ganti Bersyarat Dengan Polimorfisme. Petunjuk: apa yang foo.bar lakukan? Ini mengaktifkan jenis foo dan mengeksekusi bar yang berbeda tergantung pada jenis foo. Apa fungsi ekspresi case Anda? Ini mengaktifkan beberapa jenis dan mengeksekusi kode yang berbeda tergantung pada jenisnya. Heck, nilai yang Anda aktifkan bahkan disebut :type!!! Anda pada dasarnya telah menerapkan kembali pencarian metode, buruk.
 – 
Jörg W Mittag
6 Juli 2016, 03:16
1
Daripada menyulitkan OP, mengapa tidak memposting jawaban yang benar-benar akan membantu mereka menyelesaikan masalah mereka?
 – 
Jordan Running
6 Juli 2016, 03:21
1
Fakta bahwa Anda menggunakan ekspresi reguler untuk setiap when sedikit mengganggu. Apakah Anda benar-benar harus mencocokkan setiap string yang berisi mis. "osha", atau adakah cara Anda dapat mengubah nilai OPTIONS[:type] terlebih dahulu menjadi "menormalkan" sehingga Anda dapat melakukan pencocokan kesetaraan sederhana? Itu akan sangat menyederhanakan banyak hal.
 – 
Jordan Running
6 Juli 2016, 03:28

1 menjawab

Jawaban Terbaik

Saya tidak mengerti beberapa detail pertanyaan, tetapi inilah pendekatan umum yang mungkin Anda ambil. Saya berasumsi bahwa :info dan nilai :email dalam hash di bawah ini adalah nama metode. (Saya mengerti bahwa asumsi itu salah.) Berikut ini mungkin memiliki kesalahan, mengingat saya tidak memiliki sarana untuk mengujinya.

DATA = [[/osha/,    'Creating OSHA Regional email..',                :osha_reg],
        [/pend/,    'Creating 6 day hold pending email..',           :pend],
        [/60/,      'Creating 60 day hold account deletion email..', :sixty_day],
        [/generic/, 'Creating generic email..',                      :generic],
        [/resolve/, 'Creating resolution ticket..',                  :resolve],
        [/esc/,     'Creating escalation ticket..',                  :assign],
        [/pii/,     'Creating request to remove personal info..',    :remove_pii],
        [/vip/,     'Creating VIP user email..',                     :vip_user],
        [/inop/,    'Creating INOP user email..',                    :in_op_user]]

def gather_intel
  type = OPTIONS[:type]
  regex, msg, email = DATA.find { |r,*_| type =~ r }
  if regex
    FORMAT.send :info, msg
    EMAILS.send email
  elsif type =~ /dev/ 
    message = type.to_s.include?('dev=unlock') ? 'unlock' : 'password reset'
    FORMAT.info("Creating dev account #{message} email")
    EMAILS.dev_account(type)
  else
    raise ERROR
  end
end
3
Cary Swoveland 6 Juli 2016, 09:54