C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

【レビュー依頼】匿名関数の使用方法について

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■95338 / inTopicNo.1)  【レビュー依頼】匿名関数の使用方法について
  
□投稿者/ NET実装者 (1回)-(2020/07/17(Fri) 01:12:11)

分類:[.NET 全般] 

2020/07/17(Fri) 01:21:10 編集(投稿者)
お世話になっております。

匿名関数の使用方法について
以下プログラムをレビュー頂きたく投稿致しました。

匿名関数を使用することにより、
通常の関数定義をした関数を使用する場合と比べ、
コード量の削減は実現できましたが、反面、可読性が落ちたように感じております。

当方は匿名関数を使用したコードを読み書きする機会が今回が初めてで、
可読性が落ちたと感じる原因が、経験や知識の不足によるものか、
またはそもそも使い方が不自然なためなのか意見を募らせて頂きたいです。

どうかよろしくお願い致します。

Class Sample

	private deligate function MethodSample() as string

	public function main() as ArrayList

		dim ret    as new ArrayList
		dim param  as string = "あ"
		ret.add(sampleSubA(param, Function(param as string) sampleSubC(param, "い")))
		
		ret.add(sampleSubA(param, Function(param as string) sampleSubC(param, "お")))

		main = ret

		' 結果
		' main(0) ⇒ あいうえ
		' main(1) ⇒ あおうえ
		'
		'
	end sub 

	'	
	' 処理フレームA 
	'
	' 仕様上、定型処理Aは変更が入らない想定の処理です
	' 処理A-1で引数から受け取った関数を実行します
	' 処理A-2では処理A-1で加工した結果をさらに加工します。
	' 処理A-2は変更が入らない想定の処理です
	'
	private function sampleSubA(param as string, methodSample as MethodSample) as string

		'
		' 改修が入る可能性が非常に低い定型処理A(開始処理)
		'

		・・・
		

		'
		'処理A-1
		'
		dim paramA as string 
		dim str as string 
		str = sampleSubB(param, methodSample(param))


		'
		'処理A-2
		'
		sampleSubA = sampleSubB(str, Function(param as string) param & "え")
		
		'
		' 改修が入る可能性が非常に低い定型処理A(終了処理)
		'

		・・・

	end function 

	'	
	' 処理フレームB 
	'
	' 仕様上、定型処理Bは変更が入らない想定の処理です
	' 処理Bで引数から受け取った関数を実行します
	'
	private function sampleSubB(param as string, methodSample as MethodSample) as string

		'
		' 改修が入る可能性が非常に低い定型処理B(開始処理)
		'

		・・・

		'
		'処理B
		'
		sampleSubB = methodSample(param)

		
		'
		' 改修が入る可能性が非常に低い定型処理B(終了処理)
		'

		・・・

	end function 
		
	'	
	' 処理C 
	'
	private function sampleSubC(param1 as string, param2 as string) as string

		sampleSubC = param1 & param2 & "う"

	end function

end class

引用返信 編集キー/
■95344 / inTopicNo.2)  Re[1]: 【レビュー依頼】匿名関数の使用方法について
□投稿者/ ぶなっぷ (233回)-(2020/07/17(Fri) 10:16:14)
「可読性が落ちた」というのは主観なので、人によりけりな気がします。
というのを前提条件として、

広い意味ではラムダ式なども匿名関数です。

以下のような例も、
  list.Where(x => x.Score < 30);  // 赤点(30点未満)を抽出

ラムダ式登場以前は、
  bool IsBlackScore(Student x)
  {
      return x.Score < 30;
  }
などと、関数定義して、
  list.Where(IsBlackScore);
と呼んだわけです。

ラムダ式では、IsBlackScoreという名称が不要になったわけです。
どっちが分かりやすく感じますか?

正直、私的には、上記内容で可読性だけを論ずるなら甲乙つけがたいかなと。

ただ、後者ではWhere呼び出しと、そのフィルタ内容であるIsBlackScore()関数が、
コード上で離れた場所になる可能性があるので、そうなったときに追いづらいかなと。
あと、圧倒的にタイピング量が多いので面倒かなと。

逆に前者では、フィルタ内容に対して、純粋なコードとしては「x => x.Score < 30」
しか記載がないため、
  「30点未満ってなんなの?」
となってしまうと、「// 赤点(30点未満)を抽出」のコメントがない限り、
何のためのフィルタ処理なのかが分かりません。

後者なら、IsBlackScore()という関数名がヒントになって、
「あぁ、赤点の人を抽出してるのか」
となり得ます。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ