1 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 23:56:27 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 前スレ ふらっとC#,C♯,C#(初心者用) Part47 pc12.2ch.net/test/read.cgi/tech/1257067411/
232 名前:デフォルトの名無しさん [2009/11/22(日) 19:58:46 ] >>205 50項目のときは5秒でした。 サブルーチンの中で ※背景の塗りつぶしが必要ならFillRectangleを実行する。 ※文字列を囲むならばDrawRectangleを実行する。 ※文字列については常にRectangle構造体の中で水平垂直位置をパラメーターから与える …これを150項目分行うようにしています。 項目が増えれば増えるほど、倍以上に遅くなっています。 FontなどのオブジェクトのDisposeが足りないのかなと思って直しましたが、結果はやはり15秒弱です。
233 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:59:52 ] Font? 一項目ごとにフォント読み込んだりしてない?
234 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:06:57 ] >>231 そこまで考えてるのになんで ちょっとしたことするだけなのに Main なんて意味のないメソッドで囲まなければならないんだ!不便! まで発想が飛ばないのかねぇ。
235 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:08:29 ] どう見ても>>231 はわかってる奴の発想だな >>209 にはとても及ばない
236 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:16:45 ] >>181
237 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:24:43 ] >>229 え、多重ループの疑いがあったとして項目数減らしても計算量は線形でしか減らないキガス・・・ ああ、そもそもルーチンを何回も何回も呼び出している疑いか。あるね、そんな事。
238 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:25:44 ] >>227 用途は趣味で作っているメディアプレーヤーだから、1行の時もあれば100行近い場合もあるんですよ で、曲名のカラムを調整して縦スクロールバーが無い時はいっぱいまでカラムを延ばして バーが出たらバーの分だけ曲名を縮める。 そうしないと縦スクロールバーが無いとOwnerDrawしたカラムヘッダーの最後が真っ白けになっちまうし、 逆に縦スクロールバーが出ている時に伸ばしたら横スクロールバーが出るのがちょっとウザイ 現状、調整後に横スクロールバーが残っても、縦または横にスクロールした瞬間に消えるんですけどね
239 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:29:26 ] 一回5secとして三回回って15sec。項目半分に減らして2.5secとして三回回って7.5sec。 減らした比率でしか計算量は減らないから、237は勘違い。
240 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:30:52 ] >>235 しかしながらC++とかに慣れてるとは・・・とてもじゃないが思いにくい 不便とかを超えてもう当たり前になっている所だからぶっちゃけどうでもいい そして、そんな一か所がなんだってんだ もっといろいろあるだろう orz
241 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:34:40 ] >>232 1/3だと微妙だけど二重ループの可能性は高いな ありそうなのは、 項目1つ目の場合は1つ目を描画し、2つ目の時は1つ目と2つ目を描画し…のパターンと 項目1つ描画するつもりが全項目描画している関数を呼び出している…のパターン
242 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:36:07 ] >>232 disposeしたところでGCに回収してもらわないと意味がない そんで強制的に回収させてたら余計に遅くなるんではないかと・・・ メモリがないわけではないんなら ところで150項目てあるけどループ回数は何回? 単純に150? それとも違う? 1項目は そのサブルーチンを何回使う? フォントはでいるだけ使いまわしてる? (例えば明細用を最初に定義して使いまわす)
243 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:04:27 ] 描画するデータをその都度どこかから持ってきてるとかかな
244 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:09:01 ] スタティック変数使って、何回通ったか数えてみてから考えても良いかも
245 名前:241 mailto:sage [2009/11/22(日) 21:12:26 ] オレ算数できてなかったorz 1/3の数の描画で1/3の時間だったら、1項目の描画の途中で変に遅い部分があると言うだけだな
246 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:16:24 ] >>238 それなら、縦スクロールバーは常に出しっぱなしにして、 横スクロールバーは常に非表示にしておけば一番スッキリするんじゃないの? 少なくともカラムの幅に関係なく横スクロールバーは出ないようにしてしまえば かなり問題は簡単になると思うんだがなぁ
247 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:16:57 ] >>232 さっきから埒が明かないな。ソースコードさらしたほうが早いんじゃね? おそらく相当ひどい実装になってるんじゃないかと予想。
248 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:55:21 ] >>246 どうもListViewでは、スクロールバー自動と無ししか選択できないみたいです ShowScrollBarをテストしてみたんですが、無効化されるようですね 他にやり方有りましたら教えていただけませんか?
249 名前:デフォルトの名無しさん [2009/11/22(日) 22:01:17 ] FontオブジェクトやRectangleオブジェクトを生成するのって そんなに負荷がかかるものなのですか? 明朝体やゴシックが入り混じっているときも、 変更があるときだけ生成し直すのが良策なのかな。
250 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:03:28 ] Fontはアンマネージリソース抱えてるので特に生成が重い類 Rectangleは構造体だからほとんどノーコストで作れる
251 名前:デフォルトの名無しさん [2009/11/22(日) 22:10:22 ] >>250 アンマネージリソース…? はじめて聞いた。 クグルとするか (>_<;)。
252 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:20:52 ] Fontを150回作るだけで何秒もかかるものでもないんだから、気にするだけ無意味
253 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:22:20 ] 原因でないのは間違いないが普通は避ける
254 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:31:43 ] >>232 一度FillRectangle、DrawRectangle、DrawStringを全部外して時間を計測してみて それで1,2秒になるならそのどれが遅いかをどれか一つだけ描画するようにして試して さっぱり速くならないなら、描画処理以前の問題と言うことで。
255 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:53:47 ] 問題の切り分け方から説明しないといけないのか 言語以前の問題では?
256 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:56:53 ] >>181
257 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:02:23 ] >>256 あれ、単なる非矩形ウィンドウだろ。
258 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:06:31 ] form.FormBorderStyle = FormBorderStyle.None; form.ShowInTaskbar = false; はい終わり
259 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:09:35 ] >>248 ShowScrollBarするという基本的な方針は間違ってない 俺はこんな感じで制御してる(thisは独自のスクロールバークラス) どうしても分からなければメアド晒せばソースあげるよ protected void ShowScrollBar(bool show) { if (show != this.Visible){NativeMethods.ShowScrollBar(this.Handle, this.Orientation, show);} if (show == true) { SCROLLINFO info = new SCROLLINFO(); info.cbSize = Marshal.SizeOf(info); info.fMask = ScrollInfoFlags.RANGE | ScrollInfoFlags.PAGE; NativeMethods.GetScrollInfo(this.Handle, this.Orientation, ref info); this.Enabled = (info.nMax >= info.nPage); } }
260 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:27:12 ] >>255 まぁ初心者スレだから・・・・ 荒れているC#相談室では叩かれるかもしれんがw
261 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:31:29 ] >>258 それでWin+Dの時はどうなるのか分かる?w
262 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:39:45 ] そんな後出し言われてもなぁ・・・。
263 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:44:25 ] いやガジェットのようにって書いたじゃん・・・
264 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:58:18 ] でも、Win+D のときの話なんてひとつも書いてないじゃん。 ガジェットのように、なら、JavaScript で実装できること、とかも条件になんの?
265 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:08:19 ] 火病った きもちわるい
266 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:11:07 ] >>264 C#スレでJavaScriptとは? Vistaは使ってなくて、お聞きしたいのですがガジェットはWin+Dでデスクトップから見えなくなる、 つまりWindowStateはMinimizedになるのですか?
267 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:18:11 ] >>264 いい加減にしろオマエの知識じゃ無理
268 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:37:34 ] ネイティブC++のDLLを作成→C++/CLIでラップ→C#で参照しています。 ネイティブDLLに含まれる列挙型AをC#で変数宣言しようとすると、 "'AI.Schedule' はアクセスできない保護レベルになっています。"とエラーになります。 これを何とかC#上で利用できるようにする方法はないでしょうか?
269 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:40:21 ] そのAをどのように宣言しているのか・・・
270 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:47:16 ] ネイティブの型はC#では扱えない
271 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:00:21 ] >269 enum A{A1,A2,A3...}; このようなかんじです。 >270 やっぱりそうなりますね。C++/CLIで対応する列挙型を宣言し、 キャストして使うことにします。ありがとうございました。
272 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:34:30 ] aの文字列の中に、bの文字列が何回入っているか調べて intで回数を返すメソッドはどうやって作るんですか?
273 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:04:49 ] string A = "こんにちはああこんにちはあははこんにちは" ; string[] kugiri = { "こんにちは" }; int i = (A.Split(kugiri, StringSplitOptions.None).Length-1); //3 一例
274 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:31:56 ] a = "abaababa" b = "aba" の結果は普通に3でいいのか?
275 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:36:20 ] >>273 あー、配列で区切って長さを取得してるんですね。 とても参考になりました。ありがとうございます。 >>274 そうですね。
276 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:40:20 ] >>272 の見てて思いだしたけど もしString.IndexOf()使って処理する場合は気をつけた方がいいかもね。 blogs.wankuma.com/naka/archive/2009/11/11/182901.aspx d.hatena.ne.jp/siokoshou/20091112/p1
277 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:45:58 ] >>276 こっちのが良い d.hatena.ne.jp/siokoshou/20091111#p1
278 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:49:45 ] >>275 >>273 のやり方では>>274 は2になるのに気づいているか?
279 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 10:30:19 ] FxCop使ってないと絶対気付かんわな
280 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 10:58:45 ] >>277 デフォルトのIndexOfはなんであんな変な結果になるんだろな
281 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:05:30 ] String.ToLowerとかもカレントカルチャで動くから、そうおかしな琴ではないだろう
282 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:08:38 ] MS自身がおかしな挙動だと思ってるからFxCopで警告出たりするんだろう
283 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:09:00 ] Console.WriteLine( "AA".IndexOf("〇A") ); // 0 Console.WriteLine( "〇A〇A".IndexOf("AA") ); // 1 これは「〇」がなかったことにされるってことなのかね? やっぱりよくわかんない・・・
284 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:11:27 ] うおーうおー なんで同じことをするのにいくつもやり方があるんだよおおおおおおおおお
285 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:13:53 ] >>283 それはUnicodeの規格がおかしいのを忠実に実装したらそうなってるだけ
286 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:15:06 ] >>284 それぞれに顕著な差(状況毎の性能差とか)があればいいんだけど そんなでもないときは叫びたくもなるわなw
287 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:15:57 ] >>285 なるほど。実装がおかしいんじゃなくて規格がおかしいのか。 ありがとう!
288 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:21:15 ] これって最初からそろってるものが高性能すぎて自分で文法を覚えたりクラス作る必要ないね。 最初からそろってるフォーム等のクラスや構造体の使い方覚えるだけで十分そうだ。
289 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:27:14 ] >>288 いや文法は覚えないと書けないだろw あと、ポトペタで書く分にはそれでいいかもしれないけど ちょっと何かしようと思うとすぐクラス書きたくなると思うよ。
290 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:37:00 ] >>288 そうでもあるし、そうでもない。 またフォームのような基礎的な部品も時々アーキテクチャーが変わったりするから (System.Windows.Forms→Windows Presentation Foundation) いつまでも同じ部品を使い続ける、という方針はあまりお勧めできない。 クラスにせよメソッドにせよコードの仕切りに過ぎないので、 分ける必要のないコード量なら分けなくても別にいいし、 分けるべきだと判断すれば分ければいい。
291 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:48:10 ] >>288 やればわかるけどそれで出来ることには限界があるよ もっとも、教科書に載ってるようなアルゴリズムの実装なんかは ほとんどしなくてよくなったとは思う
292 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:48:45 ] ローカル変数とグローバル変数の中間みたいなのないの? class Test{ private int x; public void func1(){ } public void func2(){ } public void func3(){ } } func1とfunc2でxは共有したいけど func3などそれ以外の部分でxを書き換えられなくない みたいな。
293 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:50:47 ] そんなものはありません func3を別のクラスに移してください
294 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:50:51 ] 同一クラスの中で把握しきれないようなのならクラスの分割を考えた方がいいんじゃないか
295 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:53:10 ] >>292 なんでわけたいのかとか設計によるけど ■継承 class Test{ private int x; public void func1(){} .... } class Test2 : Test { public void func3(){} } とか ■移譲 class Test2 { Test test = new Test(); public void func1() { test.func1();} ... public void func3(){} } 実装を見せたく無い場合は普通はクラスをわける設計になるはず
296 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:55:05 ] ×移譲 ◯委譲 でした・・・
297 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:58:07 ] 基本的にはない。クロージャ使うとか、そういうテクニックはあるけど。
298 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:01:37 ] こういうことか class Test { public readonly Action func1, func2; public Test() { int x; func1 = () => { Console.WriteLine(x); }; func2 = () => { MessageBox.Show(x.ToString()); }; } public void func3(){ /*xは見えない*/ } } 「こういうこともできる」というだけに留めておいてくれ 絶対使うな
299 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:12:32 ] 委譲の変形パターンだな
300 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:42:21 ] それ int x; 大丈夫なのか?と思ったら、ラムダ式における変数のスコープって いう新しい規則で保証されてるのか・・・やっぱラムダ式は敵だ。
301 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:48:25 ] クロージャはその場限りのコールバックとして使うだけならきちんと理解して使えば全く問題ない >>298 みたいにローカル変数の寿命が延びるような使い方はあんまりよろしくない
302 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:25:33 ] オブジェクトが生存する限り生存するという、インスタンス変数と たいして変わんないものなんだけどなぁ。
303 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:32:23 ] スタックがそのまんま残るとでも思ってるんじゃね
304 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:33:14 ] クロージャは、俺にとってはあれば便利だけど、なけりゃないで困らない、 ってレベルだなぁ。
305 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:01:57 ] スレッド活用しようとすると無ければ困る。
306 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:25:11 ] >>259 色々ありがとうございました。原因がわかりましたので仮の修正で一応動き出しました 原因はItem追加をDrawItemで検出していたんですが、この時はBeginUpdateと EndUpdateの間である為、数値的にはカラムもクライアント領域の大きさも変更されているのに 描画が更新されないことでした。仮の処理ですがタイマー起動してEndUpdate後にカラムを弄ると 水平スクロールバーを消すことが出来ました まだ、不具合があるから色々煮詰めないと行けないけど何とかなりそうです
307 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:33:40 ] 研究室の先輩から引き継いだC#のプログラムがあるんですが、当方はQtでC++しか触ったことがありません。 それでこのプログラムを簡単にC++に変換できるのでしょうか? それとも諦めてC#を覚えた方がいいでしょうか?
308 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:34:42 ] あきらめた方がいい。
309 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:03 ] C++/QtからC#/WinForms or WPF・・・ 簡単にはいかないけど プログラムが綺麗に作られてるならクラス設計とかはそのまんま引っ越せるとは思う。
310 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:52 ] そういえばQt#ってあったな 今回の話とは一切関係ないだろうけど
311 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:59 ] 研究室ならどうせ中身はほとんどベターCだろ GUI周りだけちょっと練習すれば十分
312 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:59:39 ] まて、本人がC++の人でソースはC#だ。
313 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:01:05 ] 実際、C++はアセンブラ扱いだから、C#のほうが楽だよ。
314 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:02:26 ] 何を言っているんだ
315 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:28:56 ] >>306 よかったね 質問と関係ないけど、タイマー使うよりメッセージ投げた方がスッキリするよ const int LVEX_COLUMNRESIZE = WM_APP + 1; // 独自のメッセージ定義 PostMessage(this.Handle, LVEX_COLUMNRESIZE, 0, 0);
316 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:34:13 ] ・研究室の先輩から引き継いだC#のプログラム ・当方はQtでC++しか触ったことがない という状況で A.簡単にC++に変換できるのでしょうか? B.それとも諦めてC#を覚えた方がいいでしょうか? という質問に、 C#を覚えた方が楽と薦めてみたんだが・・・どっか勘違いしてるかな?
317 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:35:19 ] C++がアセンブラ扱いってのが問題発言だろ。
318 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:36:56 ] C++やっててJavaもやったことあるならすんなりいけるけど C++だけだとちょっとはまるかもね。 移植するにしてもC#の知識は必要になるから、そのままC#覚えたほうが早そう。
319 名前:デフォルトの名無しさん [2009/11/23(月) 16:39:36 ] 覚えたほうが早いに1票
320 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:47:30 ] >>315 WinForm的にはBeginInvokeだろう
321 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:58:10 ] クラスの設計がよくわからなくなってきたので助けてください。 ■前提 複数のミニブログ(例えばTwitterとはてなハイク)のタイムラインを一つのリストにまとめて表示する プログラムを作るとします。 基本的な機能は一緒なので、最大公約数的な抽象クラスを作り、画面の方でも抽象クラスで提供 されているプロパティに従って最大公約数的な画面表示を行なっていました。 例) 名前 - メッセージ - 日付 - システム ----------------------------- 太郎 - ほげほげ - 12 days ago in Twitter 次郎 - ふがふが - 30 days ago in HatenaHaiku ■質問 ここで、各ミニブログ特有の機能も画面上に反映させたくなった場合、画面側の方で 例えば if(message is TwitterMessage)... else if (message is HatenaHaikuMessage)みたいに どのサブクラスのインスタンスか一々調べて処理を書くしかないのでしょうか? 例) HatenaHaiku の場合、キーワードも表示されるようにする 名前 - メッセージ - 日付 - システム ----------------------------- 太郎 - ほげほげ - 12 days ago in Twitter 次郎 - [独り言] ふがふが - 30 days ago in HatenaHaiku
322 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:03:10 ] 制御のモデルを変える。 メッセージに描画させればいい。
323 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:03:30 ] 固有メッセージ追加とかカスタマイズ用のメソッドとかインターフェースとか そういうのを追加する。 細かいところのやり方はいろいろだけど。
324 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:04:46 ] それが一般的な機能なら、クラス側に機能(インターフェイス)を持たせちゃうな。 で。Twitter 用のクラスでは何もしない、と。 特殊な機能なら、UI 側での判定もありじゃない?
325 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:07:56 ] >>320 同期処理かつメインスレッドが所有するListViewを処理するのに わざわざ非同期のBeginInvokeはねえよw EndUpdateまで待つためにlockかWaitHandleまで必要になるぞ
326 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:09:30 ] >>321 Decorator パターンで考える。 Decorate する必要がない時は空の ConcreteDacorator で代用。
327 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:09:39 ] >>322 なるほど、各メッセージ自身が自分自身の描画方法を知っている形にするってわけですね。 そういった場合でモデルと画面描画を分離させたい場合は間にもう1クラスぐらいかませるようなやり方で 良いでしょうか? [データモデル] MessageModel + Name : string + Message : string TwitterMessageModel → MessageModel + HashCode : string HatenaHaikuMessageModel → MessageModel + Keyword : string [画面表示用のコンポーネント] MessageComponent + Draw() : bool TwitterMessageComponent → MessageComponent - model : TwitterMessageComponent HatenaHaikuComponent → MessageComponent - model : HatenaHaikuMessageComponent
328 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:13:32 ] そういうクラスを考えるのは楽しいんだけどさ。 あんまり役に立たないよね。
329 名前:307 mailto:sage [2009/11/23(月) 17:13:43 ] とりあえずC#をボチボチ勉強します。
330 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:15:23 ] >>326 すまん、空の ConcreteDacorator で代用する必要はないか。 ConcreteComponent をそのまま使えばいいんだ。 ・・・ってもう解決しそうだから、どうでもいいか
331 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:15:31 ] >>323 各システム固有の何かをする、ってメソッドを追加する、みたいな解釈でしょうか? なるほど・・・ >>324 抽象クラスにメソッドを持たせるということですよね。 この場合、特殊な機能が少ないうちは良さそうなんですが、 増えていくと抽象クラスが煩雑になりそうで・・・ #そもそもそんなに特殊機能がばらばらなのを抽象化して良いのか?って問題もあるけど。 >>326 Decoratorパターンを良く理解していないので調べてみます。 デザインパターンちゃんと勉強しないといけないなぁ・・・
332 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:16:36 ] interface IExtraMessageField { public ExtraMessageField Type { get; } // {Name,Message,Date,System} public string Message { get; } } class TwitterMessage{ } class HatenaHaikuMessage: IExtraMessageField { public ExtraMessageField { get{ return ExtraMessageField.Message; } } public string Message { get{ return ''[' +Keyword+ ']; } } }
333 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:16:53 ] >>328 switch とか if 連打の方がわかりやすかったり工数少なかったりするよなw
334 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:19:50 ] 初心者程抽象化したがるからなぁ
335 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:19:58 ] そこまで拡張する必要性に迫られたことないし
336 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:21:09 ] この場合の正しい解は、画面側で"is"使ってインスタンス判定、固有の処理をするだよ。
337 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:21:59 ] 仕事がありません 誰か下さい
338 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:24:22 ] 俺の仕事をあげようか 給料は俺がもらっとくけど
339 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:26:25 ] うーん、何が正しいんだかよくわからなくなってきました・・・ 設計難しいなぁ。 泥臭く書くだけならいくらでもできるんだけど 綺麗に書くとなるとさーっぱりだ・・・ こういう場合に >>336 みたいに「こういう場合はこれが正しい」って断言出来るようになるには どんだけ経験つめばいいんでしょうね。
340 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:27:58 ] 断言したいだけなら、今すぐにもできるだろw
341 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:32:01 ] >>336 は馬鹿すぎだろいくらなんでも。 オブジェクト指向言語使ってる意味ないよ。 Twitterがverupして機能増えた・・・なんて時に改修場所がいたるところにちらばるでしょ、それじゃ。 ちゅーことで断言するやつは疑ってかかった方がいいんじゃないかと思う。