[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 09/27 14:11 / Filesize : 83 KB / Number-of Response : 342
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ふらっとC#,C♯,C#(初心者用) Part48



1 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 23:56:27 ]
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

前スレ
ふらっとC#,C♯,C#(初心者用) Part47
pc12.2ch.net/test/read.cgi/tech/1257067411/

231 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:56:13 ]
なんでいちいちちょっとしたことするだけなのに
Mainを意味のないクラスで囲まなければならないんだ!不便!

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パターンを良く理解していないので調べてみます。
デザインパターンちゃんと勉強しないといけないなぁ・・・







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<83KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef