...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

メンバ変数へのアクセスを自重するメンバ関数はどこまで使われるべきか

Rayerd メンバ変数をメンバ関数の引数で渡してメンバ関数の独立性を高めるってどの程度まともなやり方でしょうか

http://twitter.com/Rayerd/status/3812033196


まずは普通にメンバ変数にアクセスをするとこんな感じ.

class Parser
{
	this(string[] tokens)
	{
		this.tokens = tokens;
	}
	void parse()
	{
		parseHeader();
		parseBody();
	}
	
	private:
	
	uint index;
	string[] tokens;
	void parseHeader()
	{
		//string token = tokens[index];
		//...
		//index++;
	}
	void parseBody()
	{
		//string token = tokens[index];
		//...
		//index++;
	}
}

次になるべく引数を介してメンバ変数にアクセスしないようにするとこんな感じ.

class Parser
{
	this(string[] tokens)
	{
		this.tokens = tokens;
	}
	void parse()
	{
		parseHeader(tokens, index); // メンバ変数だけど引数渡し
		parseBody(tokens, index); // ditto
	}
	
	private:
	
	uint index;
	string[] tokens;
	void parseHeader(string[] tokens, ref uint index)
	{
		//string token = tokens[index];
		//...
		//index++;
	}
	void parseBody(string[] tokens, ref uint index)
	{
		//string token = tokens[index];
		//...
		//index++;
	}
}

後者のメリットは前述のように独立性が高いこと.
もはや非メンバ関数でもかまわないほどである.


ところで,このケースではthis.indexを書き換えなければならないので,苦肉の策でref引数を使っている点が美しくない.
しかし,ここで言いたいことは非メンバ関数でもかまわないほど独立性が高くなっていることなので,今はそんなことはどうでもいいということにする.


で,ここまでやるならいっそのこと本当に非メンバ関数にしてしまえ?
それともこういうことはするな?
どういうときにやるべきで,どういうときにはやらざるべきなのかなー.