日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员过关斩将--你的面向接口编程一定对吗?

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员过关斩将--你的面向接口编程一定对吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

菜菜哥,出大事啦

怎么了,你和男票分手了?很正常,誰讓你男票是產經經理呢

不是啦,是我做的一個小游戲,需求又變了,程序我快改不動了

說來讓我歡樂一下?

菜菜哥,咱兩還能不能好好相處了

玩笑 玩笑,show? time

妹子開始抱怨起來

01業務背景

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

02第一次需求


玩家有很多屬性,例如:身高,性別 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;
????????}
????}


01第二次需求游戲里要增加機器人玩家來增加在線的人數,屬性和真實玩家一樣,但是攻擊不太一樣產品狗

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

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


02第三次需求我要創建一批怪物,沒有真實玩家的那些屬性,但是和真實玩家一樣有攻擊行為產品狗

這個時候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繼續點贊。順便說一下,在多數情況下,很多同學就到此為止了

01第四次需求我要設計玩家的攻擊方式了,目前有遠程攻擊,近程攻擊,貼身攻擊這三類,其他需求 blalalalala。產品狗

據說此刻YY妹子的心里是一萬頭羊駝飄過的狀態。這次要怎么設計呢?這也是菜菜要說的重點部分。

現在我們需要靜下心來思考一番了,為什么我們使用了面向接口編程,遇到這次需求,程序還是需要修改很多東西呢?


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


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


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


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


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

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

封裝行為一簇

//攻擊行為接口
????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;
????????}
????}???


寫在最后

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



程序員修神之路--高并發下為什么更喜歡進程內緩存

程序員修神之路--高并發優雅的做限流(有福利)

程序員過關斬將--快速遷移10億級數據

程序員修神之路--分布式緩存的一條明路(附代碼)

程序員修仙之路--把用戶訪問記錄優化到極致

互聯網之路,菜菜與君一同成長

長按識別二維碼關注

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的程序员过关斩将--你的面向接口编程一定对吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。