あるシステムのリファクタリングを行った際、ショートサーキット処理に気づかず、単体テストにも漏れ、システムエラーで障害を起こしたので備忘録としてメモ
ショートサーキットとは
ショートサーキットとは一部のプログラミング言語での論理演算子の意味論を示す用語であり、演算子の第一引数を評価した段階で式全体の値が定まらない場合のみ第二引数を評価する方式を意味する。(Wikipediaより)
簡単に言うと
if ( A == 1 || A == 2 )
にて、Aの値が「1」の場合、「A == 1」の結果はTrueとなるため、「A == 2」の処理を行わなくてもTrueになります。
そのため、「A == 1」の結果がTrueと判定した場合、「A == 2」の処理をせず、高速に処理を行わおうという考えになります。
こういった評価方法を短絡評価(ショートサーキット)と呼びます。
標準演算子と短絡演算子
ショートサーキット演算子(短絡演算子)は使える言語はC、JAVA、PHP、VB.net等、最近の言語ではすべての言語で標準搭載されております。
逆に ショートサーキットではない演算子(標準演算子) も使える言語はありますが、PythonやPHPは使えない模様
VB関連のAnd、Orは他言語と違い、標準演算子となるので注意すること。
ExcelマクロではVBAとなるため、短絡演算子は使えない模様
言語 | 標準演算子 | 短絡演算子 |
---|---|---|
C | なし | &&、|| |
C# | &、| | &&、|| |
JAVA | &、| | &&、|| |
JavaScript | なし | &&、|| |
Perl | なし | &&、||、and、or |
PHP | なし | &&、||、and、or |
Python | なし | and、or |
VB.net | And、Or | AndAlso、OrElse |
VB6 | And、Or | なし |
VBA | And、Or | なし |
VBScript | And、Or | なし |
ショートサーキット利用例
List<Integer>
list = null;
//処理
if(list != null){
if(list.size() > 0){
//処理~
}
}
//これくらいなら1行にまとめたほうが見やすい
if(list != null && list.size() > 0){
//処理~
}
標準演算子、短絡演算子両方使える言語の注意点
コーディングが悪い!・・・というのは置いといて
標準演算子を使う場合、場合によっては想定しない値になる場合があります。
import java.util.*;
public class Main {
public static void main(String[] args){
Formula formula = new Formula();
if(formula.Formula1() || formula.Formula2()){
System.out.println("評価:"+formula.i);//結果は5
}
if(formula.Formula1() | formula.Formula2()){
System.out.println("評価:"+formula.i);//結果は3
}
}
}
class Formula{
int i = 0;
public boolean Formula1(){
i = 5;
return true;
}
public boolean Formula2(){
i = 3;
return false;
}
}
https://paiza.io/projects/lxze5PL_IUzS9oYwWLuyxw
JavaやC#は「|」、「&」の数で処理結果が変わる場合があるので注意
言語によって短絡演算子、標準演算子が異なる
PerlやPHPではand、orの演算子は短絡演算子ですが、VB系では標準演算子なので注意が必要です。(VBの短絡演算子はAnd、Orだと思って作成しまいとあとで大変な目にあったことがあります。)
総評
例えばよく使う処理を最初に評価するなど、短絡演算子をうまく使えばシステム処理の速度向上が期待できるので、うまく使っていきたいですね。