
1: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:39:58.38 ID:o1sCFwtj0.net
明細を集計するきれいな方法についてアドバイス欲しい。
オブジェクトが保持する明細のアイテムごとに集計したい。
商品の注文みたいなのを想像してもらえればイメージしやすいかと。
注文オブジェクトがあって、複数の明細オブジェクトを持っている。
明細オブジェクトは注文された商品オブジェクトを指す属性と注文個数を示す属性を持つ。
商品オブジェクトは商品IDだったり、単価だったりを持っている。
で、商品ごとに注文された個数と金額を合計したい。
以下は前提となる。
1. DBには登録されていないからDBで集計することはできない。
2. 明細は個別に保持する必要があって明細を追加する時に集約してはいけない。
いろいろ理由があってこれが前提になっている。
そこの設計を変えればいいだろうとかって書き込みは求めていない。
実際は注文オブジェクトじゃないし、設計の議論をしたい訳じゃないから。
どうするとすっきりした分りやすいコードになるだろうか?
オブジェクトが保持する明細のアイテムごとに集計したい。
商品の注文みたいなのを想像してもらえればイメージしやすいかと。
注文オブジェクトがあって、複数の明細オブジェクトを持っている。
明細オブジェクトは注文された商品オブジェクトを指す属性と注文個数を示す属性を持つ。
商品オブジェクトは商品IDだったり、単価だったりを持っている。
で、商品ごとに注文された個数と金額を合計したい。
以下は前提となる。
1. DBには登録されていないからDBで集計することはできない。
2. 明細は個別に保持する必要があって明細を追加する時に集約してはいけない。
いろいろ理由があってこれが前提になっている。
そこの設計を変えればいいだろうとかって書き込みは求めていない。
実際は注文オブジェクトじゃないし、設計の議論をしたい訳じゃないから。
どうするとすっきりした分りやすいコードになるだろうか?
4: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:42:21.44 ID:OgiM2Zk10.net
レジのコードを引きちぎって繋ぐ
5: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:44:11.70 ID:o1sCFwtj0.net
>>4
プログラムで実装できるロジックで頼む。
プログラムで実装できるロジックで頼む。
10: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:53:32.79 ID:S2B1E2uf0.net
オブジェクトオブジェクト言い過ぎィ
11: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:54:49.65 ID:o1sCFwtj0.net
>>10
すまん。オブジェクトコンポジションがマイブームなもので。
すまん。オブジェクトコンポジションがマイブームなもので。
9: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:51:24.66 ID:o1sCFwtj0.net
ロジック自慢のプログラマはおらんのか?
それじゃあ現在の実装を書こう。
今のところ製品をキーとするハッシュに格納して集約している。同じ製品は同じキーになるから集約するのは簡単。
でも、毎回ハッシュを生成するのはどうかと思ってる。
これよりいい方法はどうすればいいだろ?
それじゃあ現在の実装を書こう。
今のところ製品をキーとするハッシュに格納して集約している。同じ製品は同じキーになるから集約するのは簡単。
でも、毎回ハッシュを生成するのはどうかと思ってる。
これよりいい方法はどうすればいいだろ?
12: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:56:52.85 ID:71AEWJMM0.net
>>9
クズアプリの途中経過なんていらん
アイテムの明細はどう保存されてるんだ?
クズアプリの途中経過なんていらん
アイテムの明細はどう保存されてるんだ?
13: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:58:27.91 ID:o1sCFwtj0.net
>>12
注文オブジェクトの属性として明細オブジェクトの配列があって、そこで保持している。
注文オブジェクトの属性として明細オブジェクトの配列があって、そこで保持している。
14: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 13:59:55.93 ID:i3a8Upjsd.net
言語は?
16: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:00:53.49 ID:o1sCFwtj0.net
>>14
Perlだが、他の言語ならこうやってできるっていうのがあれば教えて欲しい。アイデアは参考にできる。
Perlだが、他の言語ならこうやってできるっていうのがあれば教えて欲しい。アイデアは参考にできる。
15: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:00:27.33 ID:S2B1E2uf0.net
オブジェクト語
17: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:01:32.66 ID:o1sCFwtj0.net
>>15
オブジェクトはすばらしいぞ。やっと分かった。
オブジェクトはすばらしいぞ。やっと分かった。
18: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:02:21.63 ID:71AEWJMM0.net
オブジェクトにずーっと入れとくわけにはいかんから、CSVなりなんなりで保存しとるんちゃうんかい
19: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:04:43.16 ID:o1sCFwtj0.net
>>18
今書いてるプログラムはデータを読み込んだらメモリ上にオブジェクト構造を生成して、処理して、処理結果を出力して終了する。
だからDBもファイルも使ってない。
他のアプリでもDBから読み込んだデータをメモリ上で集計したいことはあると思う。
今書いてるプログラムはデータを読み込んだらメモリ上にオブジェクト構造を生成して、処理して、処理結果を出力して終了する。
だからDBもファイルも使ってない。
他のアプリでもDBから読み込んだデータをメモリ上で集計したいことはあると思う。
20: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:05:29.27 ID:o1sCFwtj0.net
>>19
ちょっと不正確だった。
ファイルから読み込むけど、ファイルやDBに書き込んで保存することはない。
ちょっと不正確だった。
ファイルから読み込むけど、ファイルやDBに書き込んで保存することはない。
23: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:07:38.41 ID:71AEWJMM0.net
お前みたいな能無しのクズのせいはおれはもう5年もの間、地獄のような日々を送っている
お前みたいな能無しがいるから、ユーザーはもだえ苦しみ、それを理解できるアイデアマンは泣きながらユーザーのために苦しむんだ
お前みたいな能無しがいるから、ユーザーはもだえ苦しみ、それを理解できるアイデアマンは泣きながらユーザーのために苦しむんだ
24: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:09:24.43 ID:o1sCFwtj0.net
>>23
八つ当たりされても困るわ…。
八つ当たりされても困るわ…。
34: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:15:06.36 ID:71AEWJMM0.net
>>24
お前、取引先オブジェクトの詳細オブジェクトの1属性みたいな仕様にするじゃん?
取引先オブジェクト開いて、詳細オブジェクト開いて、属性開いてっ修正て実装してるじゃん?
1万件修正ようなことがあるじゃん?
1回修正するのに、3回オブジェクトひらいて1回入力して、3回閉じてやらないといけないじゃん?
エクセルで1万行のデータをうまく処理して作っても、6万回クリックして1万回コピペしないといけない作りじゃん?
ふざけんなよ
お前、取引先オブジェクトの詳細オブジェクトの1属性みたいな仕様にするじゃん?
取引先オブジェクト開いて、詳細オブジェクト開いて、属性開いてっ修正て実装してるじゃん?
1万件修正ようなことがあるじゃん?
1回修正するのに、3回オブジェクトひらいて1回入力して、3回閉じてやらないといけないじゃん?
エクセルで1万行のデータをうまく処理して作っても、6万回クリックして1万回コピペしないといけない作りじゃん?
ふざけんなよ
37: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:18:08.98 ID:o1sCFwtj0.net
>>34
動作が正確に理解できんが、オブジェクト指向が間違っているんじゃなくて設計した奴がくそなだけだと思うぞ。
動作が正確に理解できんが、オブジェクト指向が間違っているんじゃなくて設計した奴がくそなだけだと思うぞ。
22: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:07:33.81 ID:j/SuxwwDM.net
パールを使ってるあたり、親近感を覚える
と同時に古臭い感。。。
と同時に古臭い感。。。
26: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:10:50.89 ID:o1sCFwtj0.net
>>22
Javaも使えるけど正規表現が使いたい処理があって今回はPerlで書いてみた。
小さめのプログラムだったらJavaよりPerlのほうが簡単に作れるよな。
Javaも使えるけど正規表現が使いたい処理があって今回はPerlで書いてみた。
小さめのプログラムだったらJavaよりPerlのほうが簡単に作れるよな。
25: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:09:38.37 ID:71AEWJMM0.net
取引情報残さないの?
それなら、最初から紙に書いといてあとでエクセルでプチプチ入力したらピボットテーブルで簡単に集計できるよ
糞プログラムもオブジェクトも何もいらない。
エクセルでもっと効率的で便利なものが簡単にできちゃうぞ
それなら、最初から紙に書いといてあとでエクセルでプチプチ入力したらピボットテーブルで簡単に集計できるよ
糞プログラムもオブジェクトも何もいらない。
エクセルでもっと効率的で便利なものが簡単にできちゃうぞ
29: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:12:35.06 ID:o1sCFwtj0.net
>>25
実際は注文情報ではない。
注文情報を使って要件を説明した。
属性情報はいろいろあるからエクセルはちょっと。
実際は注文情報ではない。
注文情報を使って要件を説明した。
属性情報はいろいろあるからエクセルはちょっと。
27: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:11:18.90 ID:gSu/um490.net
アクセスで読み込めば一発じゃないかとおじさんは思うよ
21: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:06:55.57 ID:gSu/um490.net
data work.trst;
set [明細]
by [商品名]
retain sum sno;
if first.[商品名] then do;
sum = 0;
sno+1;
end;
sum=sum+[明細金額]
if last.[商品名]
syohin2 = compress(put(sno,1,z2.)||"_"|||[商品名]));
run;
proc means data = work.test sum;
var [明細金額]
class syohin2;
output out=out sum ([明細金額]);
run;
set [明細]
by [商品名]
retain sum sno;
if first.[商品名] then do;
sum = 0;
sno+1;
end;
sum=sum+[明細金額]
if last.[商品名]
syohin2 = compress(put(sno,1,z2.)||"_"|||[商品名]));
run;
proc means data = work.test sum;
var [明細金額]
class syohin2;
output out=out sum ([明細金額]);
run;
ほれ
31: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:14:19.45 ID:o1sCFwtj0.net
>>21
何語だろ?
FORTLAN?
FORTLANは知らないけどレコードを操作するとは聞いたな。
読んでる最中なので。しばしお待ちを。
何語だろ?
FORTLAN?
FORTLANは知らないけどレコードを操作するとは聞いたな。
読んでる最中なので。しばしお待ちを。
33: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:14:50.20 ID:gSu/um490.net
>>31
SAS
SAS
30: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:13:47.34 ID:YvKW2o+Y0.net
>>1まで具体的なら同じくアクセスとかでいいと思った。
perl に sqlite のような DB ライブラリがあるならそれ使えば
その文章を SQL で書くだけでいけそうな気がする
perl に sqlite のような DB ライブラリがあるならそれ使えば
その文章を SQL で書くだけでいけそうな気がする
35: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:16:15.39 ID:o1sCFwtj0.net
>>30
DBはなしで頼むよ。
件数は少ないし、わざわざ使うのはちょっと。
DBは得意なんでやり方は分かるしDB以外のアイデアを聞きたい。
DBはなしで頼むよ。
件数は少ないし、わざわざ使うのはちょっと。
DBは得意なんでやり方は分かるしDB以外のアイデアを聞きたい。
39: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:19:23.92 ID:71AEWJMM0.net
>>35
データも残さない、件数は少ない
そんなもん正の字でも書いとけよ
データも残さない、件数は少ない
そんなもん正の字でも書いとけよ
48: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:28:37.08 ID:o1sCFwtj0.net
>>39
科学計算とかテキスト検索とかDBに格納しないし、ファイルにも記録しない処理だってあるだろ。
科学計算とかテキスト検索とかDBに格納しないし、ファイルにも記録しない処理だってあるだろ。
36: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:16:36.73 ID:gSu/um490.net
DBにするか否かじゃなくてトランザクションをちゃんとサマリするんならそれなりのDB設計もどきは必要なんだよ
単純なつくりにすると後々大変なことになる
単純なつくりにすると後々大変なことになる
38: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:19:04.43 ID:o1sCFwtj0.net
>>36
メモリ上で計算して結果を出力するだけだからトランザクションはない。
データ構造を説明するためにイメージしやすい注文オブジェクトを例にした。
メモリ上で計算して結果を出力するだけだからトランザクションはない。
データ構造を説明するためにイメージしやすい注文オブジェクトを例にした。
41: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:20:33.17 ID:gSu/um490.net
>>38
人に聞く前にinputとoutputを明確にしてこいとしか言えない
人に聞く前にinputとoutputを明確にしてこいとしか言えない
49: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:29:11.96 ID:o1sCFwtj0.net
>>41
DBは利用しないって前提に明記したが。
DBは利用しないって前提に明記したが。
46: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:27:08.08 ID:o1sCFwtj0.net
>>21
なんとなく分かった。
確かに俺が書いた1の要件だと明細オブジェクトを走査して、属性を読み込んで、集計を保持するデータ構造に合計すればそれで満たせるな。
ただ、オブジェクトをまとめたいときもあるんだよな。
同一の商品の明細を分けて保持したいときと、それを集約したいときもある。でも、これは全然説明してなかったことだな。
ありがとう。もしかしたらこのアイデアを使って実装することができるかもしれない。
じっくり考えてみる。
なんとなく分かった。
確かに俺が書いた1の要件だと明細オブジェクトを走査して、属性を読み込んで、集計を保持するデータ構造に合計すればそれで満たせるな。
ただ、オブジェクトをまとめたいときもあるんだよな。
同一の商品の明細を分けて保持したいときと、それを集約したいときもある。でも、これは全然説明してなかったことだな。
ありがとう。もしかしたらこのアイデアを使って実装することができるかもしれない。
じっくり考えてみる。
42: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:20:35.60 ID:RcfMX+a00.net
先に要件定義して人間に分かりやすいようにER図書け
そこからテーブルに起こして最後はプログラム書けば意味不明なことにはならんだろ
マニュアルも無いような業務ならそれを作るところから頑張れ
何はともあれ人間が理解出来るように整理出来なきゃ機械に理解させるのは難しい
そこからテーブルに起こして最後はプログラム書けば意味不明なことにはならんだろ
マニュアルも無いような業務ならそれを作るところから頑張れ
何はともあれ人間が理解出来るように整理出来なきゃ機械に理解させるのは難しい
51: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:30:12.43 ID:o1sCFwtj0.net
>>42
すでにちゃんと実装できてるよ。ただもっといいロジックにできる気はしてるから改善したい。
すでにちゃんと実装できてるよ。ただもっといいロジックにできる気はしてるから改善したい。
45: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:25:52.68 ID:h0W//Ux20.net
>>1が何したいかよく分からん
商品の注文を例に上げたのにオブジェクト連呼してるだけで意味不明
商品の注文を例に上げたのにオブジェクト連呼してるだけで意味不明
50: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:29:37.74 ID:lh3Bu46j0.net
単価に個数をかけるだけだろアホか
53: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:36:27.73 ID:o1sCFwtj0.net
>>45
>>50
確かに読み直すとそうだな。要件の説明が良くなかったな。悩んだポイントを書く。
明細オブジェクトの配列から1つ取り出して残りの要素と比較してマッチしたら集約するという方法はあるだろ。
でも、集約するということは配列の要素を消して、同じ製品を持つ別の要素と合算するから配列自体が変化する。
そうすると
foreach element (elements) {集約する}
みたいに単純に次の要素を順番に取ってくるという訳には行かない。
それでどうするときれいに処理できるんだろうって悩んでる。
分かりにくいかもな。もう一度整理する。
>>50
確かに読み直すとそうだな。要件の説明が良くなかったな。悩んだポイントを書く。
明細オブジェクトの配列から1つ取り出して残りの要素と比較してマッチしたら集約するという方法はあるだろ。
でも、集約するということは配列の要素を消して、同じ製品を持つ別の要素と合算するから配列自体が変化する。
そうすると
foreach element (elements) {集約する}
みたいに単純に次の要素を順番に取ってくるという訳には行かない。
それでどうするときれいに処理できるんだろうって悩んでる。
分かりにくいかもな。もう一度整理する。
54: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:37:54.94 ID:lh3Bu46j0.net
コード晒せ
お前が日本語で何言っても絶対理解させるのは無理
お前が日本語で何言っても絶対理解させるのは無理
55: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:43:15.59 ID:o1sCFwtj0.net
まずやりたいことは明細オブジェクトを集計したい。
以下のような注文があったとする。
ORDER-001
DETAIL
PRODUCT-100 10個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-100 50個
DETAIL
PRODUCT-210 20個
DETAIL
PRODUCT-100 30個
これを製品ごとに集約したい。
ORDER-001
DETAIL
PRODUCT-100 90個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-210 20個
で、この状態でいろいろ操作したい。
以下のような注文があったとする。
ORDER-001
DETAIL
PRODUCT-100 10個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-100 50個
DETAIL
PRODUCT-210 20個
DETAIL
PRODUCT-100 30個
これを製品ごとに集約したい。
ORDER-001
DETAIL
PRODUCT-100 90個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-210 20個
で、この状態でいろいろ操作したい。
57: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:49:23.36 ID:o1sCFwtj0.net
集約するために
foreach detail (order.details) {他のdetailとマッチしたら集約する}
とした場合、最初の要素である
DETAIL
PRODUCT-100 10個
は3番目とマッチするから3番目に加算して1番目の要素を削除したとすると
配列の要素がずれるからそのまま次の要素を走査するとおかしくなるよなってことに気が付いた。
それでどうするのがいいんだろうと悩んでいる。
foreach detail (order.details) {他のdetailとマッチしたら集約する}
とした場合、最初の要素である
DETAIL
PRODUCT-100 10個
は3番目とマッチするから3番目に加算して1番目の要素を削除したとすると
配列の要素がずれるからそのまま次の要素を走査するとおかしくなるよなってことに気が付いた。
それでどうするのがいいんだろうと悩んでいる。
58: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:53:16.69 ID:g2zGcPS40.net
そんなの新しく変数作って足してくだけだろ
元のオブジェクトは変更しない
元のオブジェクトは変更しない
60: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:55:25.51 ID:o1sCFwtj0.net
>>58
>>1の説明が悪かった。確かに>>1の要件を実装するにはそれが正しい。
ただ、正しくはオブジェクトを集約したい。
>>55
>>57
>>1の説明が悪かった。確かに>>1の要件を実装するにはそれが正しい。
ただ、正しくはオブジェクトを集約したい。
>>55
>>57
59: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:55:02.29 ID:lh3Bu46j0.net
for(@order){
$hash->{$_[0]} += $product->{$_->[0]}->{tanka} * $_[1];
}
$hash->{$_[0]} += $product->{$_->[0]}->{tanka} * $_[1];
}
62: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:57:02.36 ID:o1sCFwtj0.net
>>59
すまん。>>1の説明が悪かった。>>1に対してはそれが正しい。
ただ、正しくはオブジェクトを集約したかった。
すまん。>>1の説明が悪かった。>>1に対してはそれが正しい。
ただ、正しくはオブジェクトを集約したかった。
63: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:58:44.66 ID:lh3Bu46j0.net
>>62
何が違うのか全くわからない
ちゃんとコード理解してるの?
してるなら説明してくれ
何が違うのか全くわからない
ちゃんとコード理解してるの?
してるなら説明してくれ
68: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:06:19.63 ID:o1sCFwtj0.net
>>63
オブジェクトとハッシュが違う。
Perlでもblessでオブジェクトを生成できるし、Mooseを使って生成することもできる。
ただ、オブジェクトから取得した情報を集計した値を変数で保持するって考えを十分に精査できていなかった。もしかしたらそれが使えるかもしれない。
じっくり考えてみる。ありがとう。
オブジェクトとハッシュが違う。
Perlでもblessでオブジェクトを生成できるし、Mooseを使って生成することもできる。
ただ、オブジェクトから取得した情報を集計した値を変数で保持するって考えを十分に精査できていなかった。もしかしたらそれが使えるかもしれない。
じっくり考えてみる。ありがとう。
61: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:56:44.42 ID:lOiPWnAm0.net
加算するときは要素削除する代わりに数量に0を代入する
要素を見るとき数量が0ならcontinueみたいなので飛ばす
それだけちゃうの
要素を見るとき数量が0ならcontinueみたいなので飛ばす
それだけちゃうの
67: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:02:02.41 ID:o1sCFwtj0.net
>>61
なるほど。
いったん0にして集計した後に注文個数が0の明細は削除するって方法はあるな。
集計のための走査と0を削除するための走査の2回が必要になるっていところは何かもう少しうまい方法がありそうだけど
アイデアとしてはよさそう。
メモっておいた。ありがとう。
なるほど。
いったん0にして集計した後に注文個数が0の明細は削除するって方法はあるな。
集計のための走査と0を削除するための走査の2回が必要になるっていところは何かもう少しうまい方法がありそうだけど
アイデアとしてはよさそう。
メモっておいた。ありがとう。
70: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:08:04.47 ID:lOiPWnAm0.net
>>67
最初に要素数を変数に代入しておく
foreachループ内で加算をするときには,
前の例では3番目でなく1番目のほうに加算し,
3番目のほうに配列の最後の要素をコピーし,
最後の要素を消して配列の最大数も1減らしておく
↑これならループ1回ですむやろ
ただ,正直に配列のほかに集計用の変数か何かを持ったほうが速いよ
最初に要素数を変数に代入しておく
foreachループ内で加算をするときには,
前の例では3番目でなく1番目のほうに加算し,
3番目のほうに配列の最後の要素をコピーし,
最後の要素を消して配列の最大数も1減らしておく
↑これならループ1回ですむやろ
ただ,正直に配列のほかに集計用の変数か何かを持ったほうが速いよ
75: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:19:39.38 ID:o1sCFwtj0.net
>>70
できなくはなさそうだけどだいぶごちゃごちゃしちゃいそう…。
いったん0にして、後でまとめて0の要素を消すって最初に教えてもらったやり方のほうが好みだな。
そこは好みの問題だろうけど。
でもわざわざ考えてくれてありがとう。
できなくはなさそうだけどだいぶごちゃごちゃしちゃいそう…。
いったん0にして、後でまとめて0の要素を消すって最初に教えてもらったやり方のほうが好みだな。
そこは好みの問題だろうけど。
でもわざわざ考えてくれてありがとう。
64: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 14:58:54.34 ID:g2zGcPS40.net
オブジェクトの集約と新しくオブジェクト作るのでは何が違うの?
72: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:12:08.30 ID:o1sCFwtj0.net
>>64
オブジェクトのコピーを新たに生成した場合、ほとんどの言語では元のオブジェクトとは別のオブジェクトとして扱われると思う。
==で比較したら別であるという結果になると思う。そこは比較の仕方次第とか、クラスで比較の動作を上書きできたりもするけど。
すべてのアプリケーションがオブジェクトを==で比較する訳じゃないのでオブジェクトのコピーを新たに生成しても問題がないことも多いとは思う。
実際、今回のプログラムだとコピーしても問題はなさそうな気はする。
オブジェクトのコピーを生成することについても十分に検討できていなかった部分はあるから再検討する。ありがとう。
自分で考えてると同じことをぐるぐる考えちゃうことが多くて視点を見直すことができるのはほんと助かる。
オブジェクトのコピーを新たに生成した場合、ほとんどの言語では元のオブジェクトとは別のオブジェクトとして扱われると思う。
==で比較したら別であるという結果になると思う。そこは比較の仕方次第とか、クラスで比較の動作を上書きできたりもするけど。
すべてのアプリケーションがオブジェクトを==で比較する訳じゃないのでオブジェクトのコピーを新たに生成しても問題がないことも多いとは思う。
実際、今回のプログラムだとコピーしても問題はなさそうな気はする。
オブジェクトのコピーを生成することについても十分に検討できていなかった部分はあるから再検討する。ありがとう。
自分で考えてると同じことをぐるぐる考えちゃうことが多くて視点を見直すことができるのはほんと助かる。
73: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:13:47.99 ID:xKq8Zy3Y0.net
>>72
参照使えよアホ
参照使えよアホ
76: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:22:01.72 ID:o1sCFwtj0.net
>>73
それが基本だと思う。
でも、参照を使ったとしても配列の要素自体が削除したらおかしくならない?
走査中に要素が変動することをサポートしているIteratorを使うってこと?
言語によってはありそうだな。
それが基本だと思う。
でも、参照を使ったとしても配列の要素自体が削除したらおかしくならない?
走査中に要素が変動することをサポートしているIteratorを使うってこと?
言語によってはありそうだな。
78: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:23:55.19 ID:g8JbS6oF0.net
やろうとしてる事がDBなのに既存のDB使いたくないなら自分でDB書くしかない
ほんと阿呆の考える事って阿呆らしい
ほんと阿呆の考える事って阿呆らしい
80: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:26:10.01 ID:o1sCFwtj0.net
>>78
科学計算とか、テキスト検索とか、DBを使わない処理もあるんだぜ。
科学計算とか、テキスト検索とか、DBを使わない処理もあるんだぜ。
77: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:22:26.57 ID:lh3Bu46j0.net
明細オブジェクトのperlでの実装を示せ
79: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:25:23.70 ID:o1sCFwtj0.net
>>77
実際のコードは出せないのでイメージが伝わる程度のコードで。
Productはこんな感じ。
実際のコードは出せないのでイメージが伝わる程度のコードで。
Productはこんな感じ。
package Product;
use Moose;
has 'name' => (
is => 'rw',
isa => 'Str'
);
has 'id' => (
is => 'rw',
isa => 'Num'
);
has 'price' => (
is => 'rw',
isa => 'Num'
);
use Moose;
has 'name' => (
is => 'rw',
isa => 'Str'
);
has 'id' => (
is => 'rw',
isa => 'Num'
);
has 'price' => (
is => 'rw',
isa => 'Num'
);
83: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:30:25.36 ID:o1sCFwtj0.net
>>77
注文明細はこんな感じ。
注文明細はこんな感じ。
package OrderDetail;
use Moose;
has 'product' => (
is => 'rw',
isa => 'Product'
);
has 'unit' => (
is => 'rw',
isa => 'Num'
);
use Moose;
has 'product' => (
is => 'rw',
isa => 'Product'
);
has 'unit' => (
is => 'rw',
isa => 'Num'
);
88: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:38:54.39 ID:o1sCFwtj0.net
>>77
注文はこんな感じ。
実際はもっと多くの属性があるけど構造はあげたコードと変わらない。
注文はこんな感じ。
実際はもっと多くの属性があるけど構造はあげたコードと変わらない。
package Order;
use Moose;
has 'details' => (
is => 'rw',
isa => 'ArrayRef[OrderDetail]',
traits => ['Array'],
default => sub { [ ] },
handles => {
all_details => 'elements',
add_detail => 'push',
add_details => 'push'
}
);
use Moose;
has 'details' => (
is => 'rw',
isa => 'ArrayRef[OrderDetail]',
traits => ['Array'],
default => sub { [ ] },
handles => {
all_details => 'elements',
add_detail => 'push',
add_details => 'push'
}
);
82: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:29:02.91 ID:xKq8Zy3Y0.net
参照変数があるのに参照先が削除されたからって参照がおかしくなるのはC++くらい
perlなら最後の参照が削除されるまでインスタンスの寿命は伸びる
perlなら最後の参照が削除されるまでインスタンスの寿命は伸びる
86: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:35:51.92 ID:o1sCFwtj0.net
>>82
要素の数が変動したらおかしくならない?
あと、明細の注文個数も更新されるんだからそれも大丈夫?
って思っていたんだが、言われてよくよく考えると大丈夫かも。
少なくてもPerlはforeachを評価した時点で要素が展開されるからその後で配列の要素が増減しても走査する対象はかわらなさそうだし
注文個数が変わるのはまさに望んでいる動作だよな。
いけるかもしれない。
思い込みのせいで間違って認識していたかもしれん。ありがとう。
要素の数が変動したらおかしくならない?
あと、明細の注文個数も更新されるんだからそれも大丈夫?
って思っていたんだが、言われてよくよく考えると大丈夫かも。
少なくてもPerlはforeachを評価した時点で要素が展開されるからその後で配列の要素が増減しても走査する対象はかわらなさそうだし
注文個数が変わるのはまさに望んでいる動作だよな。
いけるかもしれない。
思い込みのせいで間違って認識していたかもしれん。ありがとう。
81: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:27:54.11 ID:g2zGcPS40.net
やっぱ集計用の変数を持つのが一番いいな
そもそも
>>1に
>2. 明細は個別に保持する必要があって明細を追加する時に集約してはいけない。
ってあるのにオブジェクトを集約していいのか?
そもそも
>>1に
>2. 明細は個別に保持する必要があって明細を追加する時に集約してはいけない。
ってあるのにオブジェクトを集約していいのか?
84: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:31:14.68 ID:o1sCFwtj0.net
>>81
説明が悪かったのは反省している。>>1の要件だったら変数に集計するのが正解だと思う。
説明が悪かったのは反省している。>>1の要件だったら変数に集計するのが正解だと思う。
85: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:32:20.09 ID:xKq8Zy3Y0.net
>>84
つまり結局何をしたいんだ
つまり結局何をしたいんだ
87: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:36:56.56 ID:o1sCFwtj0.net
>>85
これです。
>>1の説明が悪かった。
ただ、正しくはオブジェクトを集約したい。
>>55
>>57
これです。
>>1の説明が悪かった。
ただ、正しくはオブジェクトを集約したい。
>>55
>>57
89: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:44:38.55 ID:lh3Bu46j0.net
>>87
「オブジェクトを集約」
の意味が分からない
「オブジェクトを集約」
の意味が分からない
90: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:46:58.33 ID:o1sCFwtj0.net
>>89
同じ製品の注文明細をまとめることです。
5つの明細オブジェクトを
ORDER-001
DETAIL
PRODUCT-100 10個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-100 50個
DETAIL
PRODUCT-210 20個
DETAIL
PRODUCT-100 30個
3つにまとめる。
ORDER-001
DETAIL
PRODUCT-100 90個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-210 20個
同じ製品の注文明細をまとめることです。
5つの明細オブジェクトを
ORDER-001
DETAIL
PRODUCT-100 10個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-100 50個
DETAIL
PRODUCT-210 20個
DETAIL
PRODUCT-100 30個
3つにまとめる。
ORDER-001
DETAIL
PRODUCT-100 90個
DETAIL
PRODUCT-110 20個
DETAIL
PRODUCT-210 20個
91: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:47:01.48 ID:ewGrYqXL0.net
Map countMap = new HashMap();
Map kingakuMap = new HashMap();
for(int i = 0 ; i < 明細.注文数 ; i++){
String syouhinID = 明細.get商品ID(i);
int kingaku = 明細.get金額(i);
int count = 明細.get個数(i);
if(countMap.containsKey(syouhinID)){
int c = countMap.get(syouhinID);
c += count;
countMap.put(syouhinID , c);
}
else{
countMap.put(syouhinID , count);
}
if(kingakuMap.containsKey(syouhinID)){
int k = kingakuMap.get(syouhinID);
k += kingaku;
countMap.put(syouhinID , k);
}
else{
countMap.put(syouhinID , kingaku);
}
}
Map kingakuMap
for(int i = 0 ; i < 明細.注文数 ; i++){
String syouhinID = 明細.get商品ID(i);
int kingaku = 明細.get金額(i);
int count = 明細.get個数(i);
if(countMap.containsKey(syouhinID)){
int c = countMap.get(syouhinID);
c += count;
countMap.put(syouhinID , c);
}
else{
countMap.put(syouhinID , count);
}
if(kingakuMap.containsKey(syouhinID)){
int k = kingakuMap.get(syouhinID);
k += kingaku;
countMap.put(syouhinID , k);
}
else{
countMap.put(syouhinID , kingaku);
}
}
92: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:51:37.49 ID:o1sCFwtj0.net
>>91
わざわざ作ってくれてありがとう。
集計の時にはハッシュを使うのが本筋か。
わざわざ作ってくれてありがとう。
集計の時にはハッシュを使うのが本筋か。
93: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 15:58:42.40 ID:o1sCFwtj0.net
自分が見落としていた視点に気付くことができた。
いいコードが書けそうな気がする。
みんな、ありがとう。まじで助かった。
いいコードが書けそうな気がする。
みんな、ありがとう。まじで助かった。
94: 以下、\(^o^)/でVIPがお送りします 2014/11/15(土) 16:05:19.93 ID:o1sCFwtj0.net
出かけてきます。
皆様、良い週末を。
皆様、良い週末を。
引用元 https://viper.2ch.sc/test/read.cgi/news4vip/1416026398/
コメントする