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
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
foo.bar
lakukan? Ini mengaktifkan jenisfoo
dan mengeksekusibar
yang berbeda tergantung pada jenisfoo
. Apa fungsi ekspresicase
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.when
sedikit mengganggu. Apakah Anda benar-benar harus mencocokkan setiap string yang berisi mis. "osha", atau adakah cara Anda dapat mengubah nilaiOPTIONS[:type]
terlebih dahulu menjadi "menormalkan" sehingga Anda dapat melakukan pencocokan kesetaraan sederhana? Itu akan sangat menyederhanakan banyak hal.