0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

メンバ関数を使った場合

以下のコードを考える。

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 とすべきで無いのと同様に、
無為にメンバ関数を使わ無いようにするのが良いでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?