雑草SEの備忘録

東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

unless A && Bを止めたい

タイトルの通りである。unless A && Bはわかりにくい。

例えばRuby on Railsで開発している時。

array1 = ["text1", "text2"]

array2 = []

という二つの配列があったとする。

puts "TEST1" unless array1.present? && array2.present? #1

puts "TEST2" unless array1.present? && array2.blank? #2

puts "TEST3" unless array1.blank? && array2.present? #3

puts "TEST4" unless array1.blank? && array2.blank? #4

puts "TEST5" unless array1.present? || array2.present? #5

puts "TEST6" unless array1.present? || array2.blank? #6

puts "TEST7" unless array1.blank? || array2.present? #7

puts "TEST8" unless array1.blank? || array2.blank? #8

この8つのうちどれがputsで文字列が表示されるのか?頭の中だけで考えてみると私は混乱する。

例えば#1だと、array1は存在するからarray1.present?はtrue でarray2は存在しないからarray2.present?はfalse。true && falseなのでtrue。そのunlessなのでこれは表示されない??

いや違う。これは表示される。

pry(main)> puts "TEST1" unless array1.present? && array2.present?
TEST1

これはわかりにくい・・・。unless A && Bは非常にわかりにくいのだ!(私には)

そこでunlessをifで書き換える。

puts "TEST1" if array1.blank? || array2.blank? #1

puts "TEST2" if array1.blank? || array2.present? #2

puts "TEST3" if array1.present? || array2.blank? #3

puts "TEST4" if array1.present? || array2.present? #4

puts "TEST5" if array1.blank? && array2.blank? #5

puts "TEST6" if array1.blank? && array2.present? #6

puts "TEST7" if array1.present? && array2.blank? #7

puts "TEST8" if array1.present? && array2.present? #8

そうすると#1はarray1はblank?そうじゃないね。じゃあarray?はblank?そうだね。TEST1が表示されるね。

とわかる。個人的にはこちらの方がわかりやすい。

unless A && B

if !A || !B

にしたほうがわかりやすいと思う。
これは高校の数学Aで習うド・モルガンの法則というやつだ。

\overline{A \land B} = \overline{A} \lor \overline{B}
個人的には、unless A && Bとなるときはif !A || !Bとするようにルールを決めても良いくらいだと思っている。