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

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

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

Re[5]: コーディングルール(C#とは限らず)


(過去ログ 95 を表示中)

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

■57034 / inTopicNo.1)  コーディングルール(C#とは限らず)
  
□投稿者/ TAKE (11回)-(2011/02/09(Wed) 14:11:05)

分類:[C#] 

基本的に同じようなコードが何度も書かれているのは
好ましくないと思いますが
たとえば帳票を出力するプログラムがあったとします。
以下のようなイメージです。



//総ページ数を取得する
PageCnt = 1;
Gyo = 0;
for (int i = 0; i < data.Count; i++)
{
Gyo ++;
//改ページ判定(キーまたはページ内最大行超えたら)
if (oldkey != newkey || (gyo % 20) == 1)
{
gyo = 0;
PageCnt ++;
}
}
TotalPage = PageCnt;



//帳票を出力する
PageCnt = 1;
Gyo = 0;
for (int i = 0; i < data.Count; i++)
{
Gyo ++;

//改ページ判定(キーまたはページ内最大行超えたら)
if (oldkey != newkey || (gyo % 20) == 1)
{
gyo = 0;
PageCnt ++;
NewPage();
}

ReportPrint();
}


総ページ数が知りたいためだけに
帳票出力部分があるないだけが違う
ロジックを続けて使用しています。
こういう場合どのように書くのが望ましいでしょうか?
帳票出力ロジックでは
改ページなどの判定する必要がないように
データ加工をする方法がよいのでしょうか?



引用返信 編集キー/
■57038 / inTopicNo.2)  Re[1]: コーディングルール(C#とは限らず)
□投稿者/ shu (423回)-(2011/02/09(Wed) 14:29:42)
No57034 (TAKE さん) に返信

帳票にもよりますがデータ量でページ数が簡単にわかるようなものなら
データ量/1ページ辺り量で 求めればいいと思います。

それに+グループ区切りによる改ページだとしたらグループ単位でデータをわけ
同様に求めるのがいいかと思います。

データ単位で印字幅、高さが変わるようなものだと用紙サイズのメモリイメージを渡し
印刷代わりに描画してみるとかすれば印字処理との共有化がはかれるかと思います。


引用返信 編集キー/
■57040 / inTopicNo.3)  Re[2]: コーディングルール(C#とは限らず)
□投稿者/ TAKE (13回)-(2011/02/09(Wed) 15:00:34)
SQL文でGROUP化した件数を持ってきて
ページ数で割って計算してみようと思いましたが
帳票用のデータを引っ張ってくるストアドプロシージャが
リレーションやら条件文やら複雑で
その方法は厳しいかもしれません。


引用返信 編集キー/
■57041 / inTopicNo.4)  Re[3]: コーディングルール(C#とは限らず)
□投稿者/ shu (425回)-(2011/02/09(Wed) 15:06:58)
No57040 (TAKE さん) に返信
> SQL文でGROUP化した件数を持ってきて
> ページ数で割って計算してみようと思いましたが
> 帳票用のデータを引っ張ってくるストアドプロシージャが
> リレーションやら条件文やら複雑で
> その方法は厳しいかもしれません。
>
>
引っ張ってきたデータをグループ分けすればよいかと思います。
データ取得を2重にする必要はないです。
引用返信 編集キー/
■57043 / inTopicNo.5)  Re[4]: コーディングルール(C#とは限らず)
□投稿者/ todo (117回)-(2011/02/09(Wed) 16:15:17)
共通化するとしたらこんな感じ

		private void Main()
		{
			//総ページ数を取得する
			int pageCnt = DoWork(null, null);

			//帳票を出力する
			DoWork(this.NewPage, this.ReportPrint);
		}

		private delegate void Action();

		private int DoWork(Action newPage, Action reportPrint)
		{
			int pageCnt = 1;
			int gyo = 0;
			for (int i = 0; i < data.Count; i++) {
				gyo++;
				if (oldkey != newkey || (gyo % 20) == 1) {
					gyo = 0;
					pageCnt++;
					if (newPage != null)
						newPage();
				}
				if (reportPrint != null)
					reportPrint();
			}
			return pageCnt;
		}

引用返信 編集キー/
■57047 / inTopicNo.6)  Re[5]: コーディングルール(C#とは限らず)
□投稿者/ TAKE (15回)-(2011/02/09(Wed) 17:30:04)
デリゲートが不慣れな自分には勉強になります。
ありがとうございます。

前のコードよりはよい感じになりますね。


引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -