メンバ関数を使った場合
以下のコードを考える。
class Foo
{
public :
double Calc(){
Init() ;
// ※1
CaldParam_1() ;
CaldParam_2() ;
return param_2 ; // ※2
}
private:
void Init() { … }
void CaldParam_1() { … }
void CaldParam_2() { … }
private:
double base_value ;
double param_1 ;
double param_2 ;
} ;
このコードにおいて、戻り値の値は誤っているが、
※1
の時点での param_2
の値は正しかったとする。
この時、Init
の実装は正しく、CaldParam_1
,CaldParam_2
のどちらか(又は両方)が誤っていると考えられる。
フリー関数を使った場合
先程のコードを、フリー関数を用いて以下へ書き換えが出来たとする。
namespace {
pair<double,double> Init() { … }
pair<double,double> CaldParam_1( const double base_value, const double param_1, const double param_2 ) { … }
double CaldParam_2( const double base_value, const double param_2 ) { … }
} // namespace
class Foo
{
public :
double Calc(){
std::tie( base_value, param_2 ) = Init() ;
// ※1
std::tie( param_1, param_2 ) = CaldParam_1( base_value, param_1, param_2 ) ;
param_1 = CaldParam_2( base_value, param_2 ) ;
return param_2 ; // ※2
}
private:
double base_value ;
double param_1 ;
double param_2 ;
} ;
先程と同様に、戻り値の値は誤っているが、
※1
の時点での param_2
の値は正しかった場合、
フリー関数版であれば、CaldParam_1
の方が間違っていると分かる。
まとめ
フリー関数を使うことで、出入力が明確になります。
不具合を探るエンジニアは、犯人を探す探偵のようなものです。
例えば、出入り口が1つだけなら犯人が絞りやすいですが、
事が起こったのが公園のど真ん中であれば、犯人を絞るのも一苦労です。
変数を無為に public
とすべきで無いのと同様に、
無為にメンバ関数を使わ無いようにするのが良いでしょう。