++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 12月 2009

INotifyPropertyChanged の実装

with 3 comments

追記: 色々更新した

前々から気になってはいたんだけども。

今の C# だと、手書きだけで INotifyPropertyChanged の実装をうまくやろうと頑張るのは厳しいと思うんですよね。コードスニペット使うのを前提に考えるのが一番いい妥協だと思います。

ということで、以下のようなものを作成。

  • ヘルパークラス(C#)
    • とりあえず同じプロジェクトにぶち込むなりライブラリ化するなり
  • コードスニペット
    • マイドキュメントの下の、Visual Studio のフォルダー以下、Code SnippetsVisual C#My Code Snippets にコピって置いてください

あとは、propnotify ってタイピングしてタブを押して、型名とプロパティ名を打つだけ。

例:

例えば、以下のような感じ(青いところがコードスニペットで生成した部分)になります。

public class CodeSnipet前提な実装 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get { return _fieldName; }
        set
        {
            if (_fieldName == value) return;
            _fieldName = value;
            PropertyChanged.Raise(this, PropertyNameName);
        }
    }

    private string _fieldName;
    private string _propertyNameName;
    private string PropertyNameName
    {
        get
        {
            if (_propertyNameName == null)
                _propertyNameName = PropertyChangedEventHandleExtensions.PropertyName(() => Name);
            return _propertyNameName;
        }
    }
}

public static partial class PropertyChangedEventHandleExtensions
{
    public static string PropertyName<T>(Expression<Func<T>> property)
    {
        var memberExp = property.Body as MemberExpression;
        if (memberExp == null)
        {
            throw new ArgumentException();
        }

        var senderExp = memberExp.Expression as ConstantExpression;
        if (senderExp == null)
        {
            throw new ArgumentException();
        }

        return memberExp.Member.Name;
    }

    public static void Raise(this PropertyChangedEventHandler handler, object sender, params string[] propertyNames)
    {
        if (handler == null)
        {
            return;
        }

        foreach (var name in propertyNames)
        {
            handler(sender, new PropertyChangedEventArgs(name));
        }
    }
}

ポイント

  • コードスニペットにしておけば、タイピング量は大したことない
    • 上のコードでいうと、string と Name しか打たない
  • プロパティ名はキャッシュしておく
    • 式木操作は結構重たいんで、毎回 exp.Member.Name を取得するのは避けたい
    • これを避けるだけで、普通の実装とほとんど変わらない性能が出る
  • コードスニペット使うのに OnPropertyChanged(“Name”) にしない理由
    • 文字列にしちゃうと、Name をリネームしても "Name" の部分は書き換わってくれない
    • C# の場合、ツールサポートが最大限得られるように作るのが一番実入りいい
      • なので、() => Name から式木経由でプロパティ名を取るのはなかなかいい案だと思う
  • Raise の propertyName は params にして複数受け取れるようにした方がいいかも
    • 1つ更新されたときに、他のプロパティ値も一緒に変化する場合も結構あるんで
広告

Written by ufcpp

2009年12月28日 at 03:00

カテゴリー: 未分類

.NET のクラスライブラリ設計

leave a comment »

年末休みはがっつり引きこもる予定でいるんですけども、引きこもりライフの最初2日はこの本を読みふけってました。

なかなか良書。「フレームワーク」なんてたいそうなものでなくても、ライブラリを書くことがあるなら読んでおいた方がいいと思う1冊。ある程度以上大きなアプリ作るなら、ほとんどの場合まずライブラリの整備からやると思うし、実質的にはみんな読んだ方がいいんじゃないかと思うくらい。

単純に、あの規模であれだけ一貫性を保ててる .NET Framework のクラスライブラリのガイドラインが書いてあるってだけでもそれなりに素晴らしいんですけど、開発者の生の声がかなり入ってるのが素敵(著者以外にも、ものすごい人数が注釈を寄稿してる)。

  • 失敗について書かれてる
    • 自分でライブラリを書くとき、既存のライブラリを参考にしたりするわけですが
    • 既存のライブラリは、後から失敗に気づいても互換性維持のために修正が効かないことも多々ある
    • そういう、直したくても直せない部分のことを素直に「失敗だった」って書いてるのはありがたい
      • DateTime.Now とか ICloneable とか
  • 実物触ってるだけだと意外と気づきにくいところの説明が載ってる
    • 例外の使い方
      • 例外についてまとまったガイドラインって案外少ないんで
    • インターフェース VS 抽象基底
      • API 作ってると過剰にインターフェース増やし過ぎる傾向にあるんで
        • インターフェースだと後からの追加に弱いとか、弱点もある
        • 過剰にインターフェース増やすとパフォーマンス落ちる
      • だから .NET Framework は抽象基底とか、IsReadOnly とか CanWrite とかが結構多いのね
  • 実際の経験やユーザビリティテストに基づいたルールがいろいろと
    • 例えば、↓みたいなガイドラインはユーザービリティテストやった結果としてそういう方針にしてるとか
      • new の数減らせ
      • コンストラクターの引数の数減らせ
      • コールバックの仕組みは、デリゲートをメソッドの引数に渡すよりイベント使え

Written by ufcpp

2009年12月27日 at 16:51

カテゴリー: .NET

Windows Azure 仕様コンテナ&トレーラーペーパークラフト

leave a comment »

10個いただいた。

とりあえず1台作ってみた。残りはみんなで作るオフ的なことやりたいです。matarillo さんも貰ったそうなので、合わせれば20台は揃うはず。やっぱデータセンターコンテナは数揃えてなんぼでしょう!

年明けくらいにどこかで。みんなでモクモクと作ってても怒られないところっていうと、ファミレスかカラオケ?あるいは、1月16日のわんくま東京勉強会#42に持ち寄るか。

Written by ufcpp

2009年12月24日 at 06:18

カテゴリー: .NET

Silverlight ケーススタディ

leave a comment »

「事例もずいぶん増えたなぁ」とか思うけど、どれも製品買うか登録するかしないと肝心の Silverlight が見れない残念さ・・・

あと、無駄に楽天セレクトウィジェットを試してみようかと

冗談抜きで朝飯毎日これ。

ほんとは、楽天セレクトウィジェットをこのページに直接張り込んでみたかったけど、それやろうとしたら Windows Live Writer が丸ごと落ちた。

Written by ufcpp

2009年12月23日 at 05:14

カテゴリー: .NET

クリスマス

leave a comment »

クリスマス

作画: Paese

最近、C++ たんの扱いがひどい気もするけど、気にしない方向で。

大丈夫、今年は巣ごもりクリスマスが流行りらしいから!

今日が誕生日の友達がいるんでメールしてみたら、今日は1日マリオ Wii やってるらしいですよ。お手軽無限1upの方法教えたら、「あとで嫁に手伝わせてやってみる」って言ってましたよ。

Written by ufcpp

2009年12月23日 at 04:56

カテゴリー: C#たん

PDCでのSilverlight 4デモ、behaviorでSilverlight 4新機能、TechSupport Marketplace

leave a comment »

Silverlight 4 デモ

Silverlight 4 demos from my PDC Keynote now available

PDC 2009 の2日目基調講演で ScottGu がデモしてたやつが自分でもできる!

behavior で Silverlight 4 の新機能

Camdoodle: showcasing Silverlight 4 new features as behaviors

behavior もちゃんと触ってみたいんだけどなぁ。なかなか機会がなく。

その他、WPF/Silverlight がらみ

TechSupport MarketPlace

Microsoft Answers Forum To Offer Paid Support – TechSupport Marketplace

  • 問題を抱えている人から、トラブルシューティングしてくれる人へ直接お金が行く仕組み
  • MS のサポートコストが減って、結果として顧客の払うサポート費用も減ってくれることを期待

うまく動けば面白そう。

Written by ufcpp

2009年12月19日 at 04:56

カテゴリー: .NET

誰が何と言おうとこれは室内着

with one comment

室内着

作画: Paese

あったかそうだから買ってみた

up主はリアルにこれを室内着にしてます。常軌を逸して寒がりなんで、毎年何かしら防寒用具を試してみてますが、これは久々に当たりな予感。

ガンガンに暖房付ければいい話ではあるんですけど、あんまり好きじゃないんですよねぇ。エネルギーって熱に変えるのは簡単だけど、熱を他のエネルギーに変換するのってものすごい大変なんで。なんかエントロピー的な意味でもったいない気がして。

ちなみにこれ、ガチで寝袋に使うにはちょっと薄いんじゃないかなぁ。せいぜい初秋用ってところか。やっぱ室内着が正しい用途ですよ。

室内着大流行

Written by ufcpp

2009年12月18日 at 17:07

カテゴリー: C#たん