91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

程序員過關斬將--你的面向接口編程一定對嗎?

發布時間:2020-07-17 09:02:34 來源:網絡 閱讀:234 作者:菜V菜 欄目:編程語言

程序員過關斬將--你的面向接口編程一定對嗎?

妹子開始抱怨起來

業務背景

妹子的游戲是個對戰類的游戲,其中有一個玩家的概念,玩家可以***,這個業務正是妹子開始撓頭的起點

第一次需求

產品經理:玩家有很多屬性,例如:身高,性別 blalalala ,玩家可以***其他玩家。

YY妹子寫程序也是很利索,一天就把程序搞定了,而且還抽象出一個palyer的基類出來,堪稱高級程序員必備技能。

 //玩家的基礎抽象類
   abstract class Player
    {
        public string Name { get; set; }
        //.
        //.
        //.

        //玩家的***
       public abstract void Attack();
    }
    //真實玩家
    class PersonPlayer : Player
    {
        public override void Attack()
        {
            //to do something 
            return;
        }
    }

第二次需求

產品經理:游戲里我需要增加機器人玩家來增加游戲在線的人數,機器人屬性和真實玩家一樣,但是***不太一樣

這個需求修改還是難不住YY妹子,沒過幾天代碼改好了,增加了一個機器人玩家的類,用到了OO的繼承。在這里為玩家抽象類點贊

class RobotPlayer : Player
    {
        public override void Attack()
        {
            //修改***內容等 to do something 
            return;
        }
    }

第三次需求

產品經理:我要創建一批類似玩家的怪物,沒有真實玩家的那些屬性,但是和真實玩家一樣有***行為

這個時候YY妹子終于意識到***是一種行為了,需要抽象出接口來了。

 //***接口
    interface IAttack
    {
        void Attack();
    }
    //玩家的基礎抽象類
   abstract class Player
    {       
        //其他屬性代碼省略一萬字
    }
    //真實玩家
    class PersonPlayer :Player, IAttack
    {
        public  void Attack()
        {
            //to do something 
            return;
        }
    }
    //機器人玩家
    class RobotPlayer :Player, IAttack
    {
        public  void Attack()
        {
            // to do something 
            return;
        }
    }
    //怪物玩家
    class MonsterPlayer : IAttack
    {
        public  void Attack()
        {
            // to do something 
            return;
        }
    }

到了這里,我們遇到了大家耳熟能詳的面向接口編程,沒錯,這個做法是對的。這也是設計的一大原則:程序依賴接口,不依賴具體實現。這里要為YY繼續點贊。順便說一下,在多數情況下,很多同學就到此為止了

第四次需求

產品經理:我現在要設計玩家的***方式了,目前有遠程***,近程***,貼身***這三類,其他需求 blalalalala。

據說此刻YY妹子的心里是一萬頭羊駝飄過的狀態。這次要怎么設計呢?這也是菜菜要說的重點部分。
現在我們需要靜下心來思考一番了,為什么我們使用了面向接口編程,遇到這次需求,程序還是需要修改很多東西呢?

設計原則:找出應用中將來可能變化的地方,把他們獨立出來,不需要和那些不變的代碼混在一起。

這樣的概念很簡單,確是每個設計模式背后的靈魂所在。到目前為止,設計中不斷在變的是Attack這個接口,更準確的應該是Attack這個行為。面向接口這個概念沒有問題,是大多數人把語言層面和設計層面的接口含義沒搞明白,真正的面向接口編程更偏向于面向架構中行為的編程,另外一個角度也可以看做是利用OO的多態原則。

說到這里,我們可以更系統的給Attack行為定義成一類行為,而具體的行為實現可以描述為一簇算法。想想看,Attack行為其實不止作用于player的類型,改日產品經理新加一個XX對象也具有***行為,理想的情況是我只需要讓這個xx對象有Attack行為即可,而不需要改動以前的任何代碼。你現在是不是對這個行為的定義理解的更深刻一些。

兩外一點,到目前為止YY妹子的代碼中一直是以繼承的方式來實現行為,這會有什么問題呢?假如要想在程序運行時動態修改player的Attack行為,會顯得力不從心了。

談到這里又引入了其他一個設計理念:一般情況下,有一個可能比是一個更好。具體概念為:多用組合,少用繼承。繼承通常情況下適用于事物本身的一些特性,比如:玩家基類具有姓名這個屬性,繼承類完全可以繼承這個屬性,不會發生任何問題。而組合多用于行為的設計方面,因為這個行為類型,我可能會在多個事物中出現,用組合能實現更大的彈性設計。

面向行為編程(千言萬語不如10行.Net Core代碼)

封裝行為一簇
 //***行為接口
    interface IAttack
    {
        void Attack();
    }

    class RemoteAttack : IAttack
    {
        public void Attack()
        {
            //遠程***
        }
    }
    class ShortAttack : IAttack
    {
        public void Attack()
        {
            //近程***
        }
    }
事物包含行為組合
 //玩家的基礎抽象類
    abstract class Player
    {       
        //其他屬性代碼省略一萬字
    }
    //真實玩家
    class PersonPlayer : Player
    {
        //玩家可以有***的行為
        IAttack attack;
        public PersonPlayer(IAttack _attack)
        {
            attack = _attack;
        }

        public  void Attack()
        {
            //調用行為一簇算法的實現
            attack.Attack();
            return;
        }
        //玩家可以運行時修改***行為
        public void ChangeAttack(IAttack _attack)
        {
            attack = _attack;
        }
    }   

寫在最后

接口是一種規范和約束,更高層的抽象更像是一類行為,面向接口編程只是代碼層體現的一種格式體現而已,真正的面向接口設計更貼近面向行為編程


添加關注,查看更精美版本,收獲更多精彩

程序員過關斬將--你的面向接口編程一定對嗎?

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇文区| 黔西县| 铁岭市| 商洛市| 即墨市| 高安市| 安吉县| 中阳县| 石柱| 永顺县| 神农架林区| 沁水县| 紫阳县| 湖北省| 江永县| 海城市| 定州市| 通榆县| 固原市| 永济市| 恩平市| 颍上县| 紫金县| 永仁县| 新竹县| 柘荣县| 桦川县| 黎城县| 博爱县| 佛山市| 盐边县| 宁津县| 松江区| 上栗县| 贵南县| 金阳县| 永顺县| 酒泉市| 桦南县| 梁山县| 高阳县|