++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#たん

Bing キャンペーン

leave a comment »

何だこれ・・・

なかなか日本ローカルな斜め上のキャンペーンやってきますねぇw

今の日本じゃ萌えキャラ使ったキャンペーンは避けては通れない道だと思ってるんで、こういうキャンペーンがあること自体は、まあ、至って普通なことだと思いますけど。

ただ、ちょっと残念な部分がちらほら・・・

  • Flash かよ!
  • イラスト担当者のお名前(「しゅー」さん)を Bing っても当人のページ見つからなかったけど、Google だったら一発で見つかった orz
  • 彩色間に合ってないのが残念すぎる・・・

Written by ufcpp

2009年12月18日 at 12:29

カテゴリー: 未分類

C# 温泉合宿

with one comment

もう1個、C# ユーザー会忘年会で出た話。

3次会(始発まで遊ぶ組)辺りで 「C# 温泉合宿とかどう?」とかいう話が出たり。

反響ありそうなら本当に考えてみます。

Written by ufcpp

2009年12月13日 at 14:51

カテゴリー: 未分類

C# ユーザー会忘年会 お疲れ様でした

leave a comment »

気が付けば25名も集まっていただいて、なかなか濃い忘年会ができました。参加者の皆様ありがとうございます。

参加者一覧は、@matarillo さんが twitter リスト化してくれたのでそちらを → csharp-dec2009party

以下、出た話題で覚えてる辺りをいくつか。

Silverlight

  • 4 でカメラ使えるようになったことだし、さっそく AR か?
  • mixi アプリとかにするには、Silverlight で作るとページ遷移ないのが不利か
    • (mixi アプリは PV に対してお金もらえる。性格診断的なアプリで、1問1遷移とかやってるあこぎなやつも多い)
  • Azure に乗せると通信帯域で課金されるから、xap ファイルがでかくなるの嫌
    • HTML だけってのはなんだかんだ言って強い・・・

Azure

  • やっぱ個人で使うには高い
    • やるならマルチテナントな SaaS を Azure 上に作って・・・ってのでないと割に合わないか
  • Worker Role の方に期待か
    • というか、Azure よりも、Dryad みたいな大規模データ並列計算プラットフォームが簡単に利用できるようになるなら論文締め切り前の研究者がこぞって使うかも
  • Azure VM まだー?
    • VM 借りできるんなら、例えば、デイリービルド時にテスト走らせるので、いろんな環境を VM 上に作ってそれぞれで実行テストしてみるとかやりたい
    • 1日1回、1時間だけの稼働とかなら安く収まりそう

痛 IDE

初音さんの痛 IDE に、次から C# たんが標準で同梱されるよ!

その他

  • クラウドサービスによって、インフラのスケールはするようになったけど・・・
    • ユーザー数の増加、帯域や計算量は VM 増やして対応できるけども
    • 開発人員はそう簡単にスケールしないよ
      • 出てくる要望の数もユーザー数に比例したり
      • さらに言うと、出てる要望が伝搬して、「早く対応してよ」的な声の多さはユーザー数の何乗かに比例するんじゃないかという
  • プログラマーに専門知識仕込むより、専門家をなんとなくプログラム書けるように仕込む方が簡単
    • 例えば、Google のやってることは、自然言語処理の専門家が割と簡単に使える並列計算プラットフォームを用意して、専門家にがんばってもらってる
    • 今後、ますますプログラミングの敷居は下がっていくはず
      • C# 3.0 辺りからやたらと出てくる「how から what へ(どうするかは気にせず、何をしたいかを素直に実現)」って方向性も
      • Vedea の「非プログラマー向けのデータ駆動な可視化言語」ってのも
  • なんというか、初めてお会いする方々がことごとく「割と普通」という言葉を覚えて帰ったり
    • 「割と」の部分がポイントですねとか、疑問口調で読むのが正解ですか?とか

Written by ufcpp

2009年12月13日 at 14:34

カテゴリー: 未分類