2013年5月31日 星期五

一秒看破 LINQ & Lambda Expressions

最近有人問我 令Q 跟 浪打 到底是在玩什麼花招的? 可以吃嗎? 非用不可?

我就在此稍微回答一下

1.令Q 跟 浪打 都可以用來對付 [可列舉型態型別的查詢] 浪打花招更多一點點 還能用來建立 委派 跟 註冊事件

2.可以吃唷 前者有點 QQ 的 後者 有點辣辣的

3.就民主立場而言 沒有非用不可 跟你有沒有非要 非死不可 差不多

 但是專制獨裁的微軟要推他就會使出各種陰謀稱作技術主流





如果這張圖你很懂在幹嘛 你可以關閉這個網頁 試著啟動 OO聯盟

影像節錄自 跟著 Wade 哥哥 學習ASP.NET MVC + NHibernate - Day 5 16:43



如果 你覺得 花惹發科 就繼續看下去

其實上圖跟等下的內容沒有關係 呵呵 但是證明了 微軟會無所不用其極的在任何地方使用他





首先 非關DB 非關Query List 的 方法

如果你不認識 泛型先生 跟 委派小姐 的話 請拜估狗大神

生死格鬥之浪打委派 第一彈 List Sort()、Find()、FindAll()、Exist() 豬走路範例
public void Sort(Comparison<T> comparison);

public T Find(Predicate<T> match);

public List<T> FindAll(Predicate<T> match);

public bool Exists(Predicate<T> match);





發現了什麼了嗎? 沒錯 浪打 就是一個委派 委派就是一個方法 所以使用浪打 跟使用一般的方法只差在多寫一個 方法

(這句話其實不完全正確 但是暫時這麼想會比較好理解)





以前老師說 一般的 = 在C# 是向左指派的意思 而 => 則是 向右指派 所以 x 可以被 => 右邊所用...

恩 完全正確 但是當時我也 完全不知道這是在講沙米碗糕 真是給他打敗啦 還是說只有我比較笨 聽不懂上面這句話





實際玩弄很久之後 才大徹大悟 哎呀 他不過是濃縮寫法的方法

=> 的左邊 就是方法傳入參數 會由叫用委派的地方提供

而且會自動推斷型別 所以不像一般方法需要 給傳入參數標明型別

=> 的右邊 就是方法要執行的內容

一行寫法 可以省略 { } return 跟 ;

整個浪打本身 就是一個匿名方法 所以不像一般方法需要命名


沒傳入參數 沒回傳型別 浪打
        private void Foo()
        {
            Action Fn = () => { };
        }
沒傳入參數 沒回傳型別 方法
        private void Fn()
        {
        }

有傳入參數 沒回傳型別 浪打
        private void Foo()
        {
            Action<int> Fn = i => { };
        }
有傳入參數 沒回傳型別 方法
        private void Fn(int i)
        {
        }

沒傳入參數 有回傳型別 浪打
        private void Foo()
        {
            Func<bool> Fn1 = () => true;
            Func<bool> Fn2 = () => { return true; };
        }
沒傳入參數 有回傳型別 方法
        private bool Fn()
        {
            return true;
        }

有傳入參數 有回傳型別 浪打
        private void Foo()
        {
            Func<int, bool> Fn1 = i => i > 0;
            Func<int, bool> Fn2 = i => { return i > 0; };
        }
有傳入參數 有回傳型別 方法
        private bool Fn(int i)
        {
            return i > 0;
        }




什麼? 你說 LINQ 跟查詢在哪? 下回分曉 哈哈

2013年5月22日 星期三

AngularJS Overview

警告:內容可能包含個人偏見及部分認知錯誤,請警慎評估再相信其內容





飯粒檔:http://www.mediafire.com/download/5tf9r1dij99ah8z/AngularJS_Overview.zip



2013.05.24 修正 Part II 後半影像重複 -.-



2013.05.27 修正 Part II 展開顯示 -.-



2013.05.28 修正 Part I 最後一小段消失 -.-

2013年5月11日 星期六

一秒看破 裝飾者模式 Decorator Pattern

設計模式 (design patterns) 有人覺得很難 有人覺得很神秘

其實他是一種 在特定情境下 使用一些別具巧思的物件導向技巧 的方法

往往直接看定義說明 根本難以理解到底在幹嘛

那不如直接回歸原點 一開始就從[情境]來看看怎麼玩





這回要來玩弄的是 裝飾者模式 (Decorator Pattern)

先拜讀神人文

神人文 其實已經說明得很清楚了 小弟我也不必在此 裝很懂

我的心得是:

當有一群 [本質相近]但又個有些[不盡相同]的東西 的時候 適合使用 裝飾者模式





那就來玩一下吧 我們這麼宅 又覺得 不吃早餐才是一件很嘻哈的事

所以神人舉例的早餐 改成我們熟悉的東東





弄個 武器 抽象類 跟 一些武器


    //武器 抽象類
    public abstract class Weapon
    {
        public string Name = "砂鍋大的鐵拳";

        public virtual string GetName()
        {
            return Name;
        }

        public abstract double AttackPower();
    }

    //
    public class Sword : Weapon
    {
        public Sword()
        {
            base.Name = "";
        }

        public override double AttackPower()
        {
            return 10;
        }
    }

    //
    public class Knife : Weapon
    {
        public Knife()
        {
            base.Name = "";
        }

        public override double AttackPower()
        {
            return 5;
        }
    }




再弄個 強化武器 抽象裝飾者類 跟 一些強化功能


    //強化武器 抽象裝飾者類
    public abstract class StrengthenDecorator : Weapon
    {
        public abstract override double AttackPower();
    }

    //加長
    public class Long : StrengthenDecorator
    {
        private Weapon _weapon;

        public Long(Weapon weapon)
        {
            _weapon = weapon;
        }

        public override double AttackPower()
        {
            return _weapon.AttackPower() + 5;
        }

        public override string GetName()
        {
            return "加長的" + _weapon.GetName();
        }
    }

    //鋒利
    public class Sharp : StrengthenDecorator
    {
        private Weapon _weapon;

        public Sharp(Weapon weapon)
        {
            _weapon = weapon;
        }

        public override double AttackPower()
        {
            return _weapon.AttackPower() + 20;
        }

        public override string GetName()
        {
            return "鋒利的" + _weapon.GetName();
        }
    }

    //劇毒
    public class Toxic : StrengthenDecorator
    {
        private Weapon _weapon;

        public Toxic(Weapon weapon)
        {
            _weapon = weapon;
        }

        public override double AttackPower()
        {
            return _weapon.AttackPower() + 100;
        }

        public override string GetName()
        {
            return "劇毒的" + _weapon.GetName();
        }
    }

    //傳說
    public class Legendary : StrengthenDecorator
    {
        private Weapon _weapon;

        public Legendary(Weapon weapon)
        {
            _weapon = weapon;
        }

        public override double AttackPower()
        {
            return _weapon.AttackPower() + 9999;
        }

        public override string GetName()
        {
            return "傳說的" + _weapon.GetName();
        }
    }




最後 拉些 可有可無的 UI 看看效果



    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Weapon weapon;

        private void Sword_rb_CheckedChanged(object sender, System.EventArgs e)
        {
            weapon = new Sword();
            Log(weapon.GetName(), weapon.AttackPower());
            Knife_rb.Enabled = Sword_rb.Enabled = false;
        }

        private void Knife_rb_CheckedChanged(object sender, System.EventArgs e)
        {
            weapon = new Knife();
            Log(weapon.GetName(), weapon.AttackPower());
            Knife_rb.Enabled = Sword_rb.Enabled = false;
        }

        private void GetLong_Click(object sender, System.EventArgs e)
        {
            weapon = new Long(weapon);
            Log(weapon.GetName(), weapon.AttackPower());
        }

        private void GetSharp_Click(object sender, System.EventArgs e)
        {
            weapon = new Sharp(weapon);
            Log(weapon.GetName(), weapon.AttackPower());
        }

        private void GetToxic_Click(object sender, System.EventArgs e)
        {
            weapon = new Toxic(weapon);
            Log(weapon.GetName(), weapon.AttackPower());
        }

        private void GetLegendary_Click(object sender, System.EventArgs e)
        {
            weapon = new Legendary(weapon);
            Log(weapon.GetName(), weapon.AttackPower());
        }

        private void Log(string name, double attackPower)
        {
            Log_lb.Text +=
                "勇者OO拾取了 [" + name + "]" +
                "攻擊力:" + attackPower + "" +
                Environment.NewLine;
        }
    }





定番截圖