[表示 : 全て 最新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/

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して機能増えた・・・なんて時に改修場所がいたるところにちらばるでしょ、それじゃ。

ちゅーことで断言するやつは疑ってかかった方がいいんじゃないかと思う。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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