什么是面向?qū)ο缶幊趟枷耄?/h1>

一纯露、面向?qū)ο笫鞘裁?/h4>

面向?qū)ο? (Object Oriented,OO) 的思想對軟件開發(fā)相當重要,它的概念和應(yīng)用甚至已超越了程序設(shè)計和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng)、交互式界面瓶摆、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺性宏、分布式系統(tǒng)群井、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD 技術(shù)毫胜、人工智能等領(lǐng)域书斜。面向?qū)ο笫且环N 對現(xiàn)實世界理解和抽象的方法,是計算機編程技術(shù)發(fā)展到一定階段后的產(chǎn)物指蚁。

面向過程 (Procedure Oriented) 是一種 以過程為中心 的編程思想菩佑。這些都是以什么正在發(fā)生為主要目標進行編程,不同于面向?qū)ο蟮氖钦l在受影響凝化。與面向?qū)ο竺黠@的不同就是 封裝稍坯、繼承、類搓劫。無論是在軟件開發(fā)還是在實際工作中瞧哟,深入地理解軟件開發(fā)的思想都非常有必要。

二枪向、從一場比賽說起

在一個軟件村里勤揩,有一名資深「面向過程」程序人員(老過)和一名「面向?qū)ο蟆剐磐剑òΓ┩瑫r受雇于一家挨踢店有一天老板突發(fā)奇想決定讓這兩名程序員進行一次比賽獲勝者將獲得一個限量的 360 度全自動按摩椅編程比賽開始了:

image.png

不一會,他倆都寫出了幾乎相同的代碼

class Bill{

// 獲取總價
fun getPrice(): Double {
val unit = getUnit()
val number = getNumber()
val price = unit * number
return price
}

// 獲取單價
fun getUnit(): Double {
        ...
}

// 獲取數(shù)量
fun getNumber(): Int {
        ...
}
}

image.png

老過看到新需求秘蛔,微微一笑

class Bill{

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay()) {
            return price * 0.77
        }
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }
}

image.png

他決定讓新的收銀方式繼承 Bill 類

先在 Bill 類中新增 discount 方法

并將其開放

open class Bill{

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        return discount(price)
    }

    // 處理打折優(yōu)惠
    open fun discount(price: Double): Double{
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

}

普通的收費方式在 discount

函數(shù)中直接返回價格

七夕節(jié)的收費方式則繼承此類

在 discount 函數(shù)中實現(xiàn)打 77折

class LoversDayBill : Bill(){
    override fun discount(price: Double): Double {
        return price * 0.77
    }
}
image.png

老過已經(jīng)開始幻想自己將來

坐在按摩椅上的舒服日子


image.png

聽到新需求

老過一陣頭大

不由在群里吐槽

image.png

吐槽歸吐槽

老過在 getPrice 函數(shù)中

再次增加了條件判斷

作者:力扣(LeetCode)
鏈接:https://www.zhihu.com/question/31021366/answer/761614647
來源:知乎
著作權(quán)歸作者所有陨亡。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處深员。

class Bill {

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay()) {
            return price * 0.77
        }
        if (todayIsMiddleAutumn() && price > 399) {
            return price - 200
        }
        if (todayIsNationalDay() && price < 100) {
            // 生成 0 ~ 9 隨機數(shù)字负蠕,如果為 0 則免單。即:十分之一概率免單
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }

    fun todayIsMiddleAutumn(): Boolean {
        ...
    }
    
    fun todayIsNationalDay(): Boolean {
        ...
    }
}

看著越來越復(fù)雜的

Bill 類和 getPrice 方法

老過眉頭緊鎖

他深知事情遠沒有結(jié)束

中秋和國慶一過

他還需要到這個復(fù)雜的類中

刪掉打折的方法

天知道老板還會再提

什么天馬行空的需求

無論是新增或刪除代碼倦畅,在這個過長的類里做修改都是件不太愉快的事遮糖。為了在一個很長的函數(shù)中找到需要修改的位置,「面向過程」使得老過不得不瀏覽大量與修改無關(guān)的代碼叠赐,小心翼翼地修改后欲账,又要反復(fù)確認不會影響到類的其他部分。

老過在心底里默默地祈禱

這個類不再需要修改

提交了自己的程序

阿對收到新需求時

先是新增了中秋節(jié)支付類

class MiddleAutumePrice : Bill() {
    override fun discount(price: Double): Double {
        if (price > 399) {
            return price - 200
        }
        return super.discount(price)
    }
}

再增加了國慶節(jié)支付類:

class NationalDayBill : Bill() {
    override fun discount(price: Double): Double {
        if (price < 100) {
            // 生成 0 ~ 9 隨機數(shù)字芭概,如果為 0 則免單赛不。即:十分之一概率免單
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return super.discount(price)
    }
}

「面向?qū)ο蟆棺尠ψ钕矚g的一點是


image.png

有一個好消息要告訴大家!

當老板興高采烈地說出這句話時

老過和阿對都露出了心驚膽戰(zhàn)的表情

這句話往往意味著要更改需求


image.png

老過反抗道

但他并沒有說出心里另一個小九九

實在不想再去給 Bill 類添加代碼了


image.png

這次修改老過花了較長的時間才完成

class Bill {
    val gifts = listOf("flower", "chocolate", "9.9 discount")

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay() && isCouple()) {
            if (price > 99) {
                val lucky = Random().nextInt(gifts.size)
                println("Congratulations on getting ${gifts[lucky]}!")
            }
            return price * 0.77
        }
        if (todayIsMiddleAutumn() && price > 399) {
            return price - 200
        }
        if (todayIsNationalDay() && price < 100) {
            // 生成 0 ~ 9 隨機數(shù)字罢洲,如果為 0 則免單踢故。即:十分之一概率免單
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return price
    }
    
    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }

    private fun isCouple(): Boolean {
        ...
    }

    fun todayIsMiddleAutumn(): Boolean {
        ...
    }

    fun todayIsNationalDay(): Boolean {
        ...
    }
}

看著那個只屬于七夕節(jié)的 gifts 變量

老過像看著自己白襯衫上的油漬一樣難受

以后每次收費時都會生成一個

只有七夕節(jié)才會用到的變量

都是因為老板的需求太奇葩

才讓這個程序看起來亂糟糟的

由于這個類做了修改

本來已經(jīng)測試通過的代碼又得重測一遍

阿對打開了 LoversDayBill 類

將其修改如下

class LoversDayBill : Bill() {
    
    val gifts = listOf("flower", "chocolate", "9.9 discount")
    
    override fun discount(price: Double): Double {
        if (!isCouple()) return price
        if (price > 99) {
            val lucky = Random().nextInt(gifts.size)
            println("Congratulations on getting ${gifts[lucky]}!")
        }
        return price * 0.77
    }

    fun isCouple(): Boolean {
        ...
    }
}
image.png

當老板看完老過和阿對的代碼后

再次興奮地提出新需求時

老過頓時暈了過去......

比賽真是太焦灼了

最后贏得獎勵的是?

第三個參賽者

老板的傻兒子

他完全不會寫程序

但他使用 Ctrl+C,Ctrl+V

拷貝了阿對的代碼

3. 面試常見考點

在面試中畴椰,面向?qū)ο蟮某R娍疾禳c是三個基本特征:封裝臊诊、繼承、多態(tài)斜脂。

  • 封裝:也就是把客觀事物封裝成抽象的類抓艳,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏帚戳。
  • 繼承 :繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能玷或,并在無需重新編寫原來類的情況下對這些功能進行擴展。通過繼承創(chuàng)建的新類稱為「子類」或「派生類」片任,被繼承的類稱為「基類」偏友、「父類」或「超類」。 要實現(xiàn)繼承对供,可以通過 繼承和組合 來實現(xiàn)位他。
  • 多態(tài)性 多態(tài)性是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后产场,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作鹅髓。簡單說就是一句話:允許將子類類型的指針賦值給父類類型的指針。 實現(xiàn)多態(tài)京景,有兩種方式窿冯,覆蓋和重載。兩者的區(qū)別在于:覆蓋在運行時決定确徙,重載是在編譯時決定醒串。并且覆蓋和重載的機制不同。例如在 Java 中鄙皇,重載方法的簽名必須不同于原先方法的芜赌,但對于覆蓋簽名必須相同。

面向?qū)ο蟮木幊谭绞绞沟妹恳粋€類都只做一件事育苟。面向過程會讓一個類越來越全能较鼓,就像一個管家一樣做了所有的事椎木。而面向?qū)ο笙袷枪蛡蛄艘蝗郝殕T违柏,每個人做一件小事,各司其職香椎,最終合作共贏漱竖。

面向?qū)ο蟮淖龇ù_實是把屬性和功能封裝起來,但是其核心是歸類和抽象畜伐。

把相關(guān)的屬性和功能集中起來馍惹,把可以分離的部分隔絕開來立帖,從而把復(fù)雜的業(yè)務(wù)邏輯切割成互相之間可以相對獨立的部分,降低開發(fā)的難度急鳄。

所以面向?qū)ο蠼^對不僅僅是弄一個class然后把一堆東西往里面塞银酗,真正重要的是判斷需要構(gòu)造哪些class,它們之間的關(guān)聯(lián)良狈,以及把什么東西往哪一個里面塞后添。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市薪丁,隨后出現(xiàn)的幾起案子遇西,更是在濱河造成了極大的恐慌,老刑警劉巖严嗜,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粱檀,死亡現(xiàn)場離奇詭異,居然都是意外死亡漫玄,警方通過查閱死者的電腦和手機茄蚯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睦优,“玉大人第队,你說我怎么就攤上這事∨俑眩” “怎么了凳谦?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衡未。 經(jīng)常有香客問我尸执,道長,這世上最難降的妖魔是什么缓醋? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任如失,我火速辦了婚禮,結(jié)果婚禮上送粱,老公的妹妹穿的比我還像新娘褪贵。我一直安慰自己,他們只是感情好抗俄,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布脆丁。 她就那樣靜靜地躺著,像睡著了一般动雹。 火紅的嫁衣襯著肌膚如雪槽卫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天胰蝠,我揣著相機與錄音歼培,去河邊找鬼震蒋。 笑死,一個胖子當著我的面吹牛躲庄,可吹牛的內(nèi)容都是我干的查剖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼噪窘,長吁一口氣:“原來是場噩夢啊……” “哼梗搅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起效览,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤无切,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丐枉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哆键,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年瘦锹,在試婚紗的時候發(fā)現(xiàn)自己被綠了籍嘹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弯院,死狀恐怖辱士,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情听绳,我是刑警寧澤颂碘,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站椅挣,受9級特大地震影響头岔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鼠证,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一峡竣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧量九,春花似錦适掰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弯予,卻和暖如春戚宦,著一層夾襖步出監(jiān)牢的瞬間个曙,已是汗流浹背锈嫩。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工受楼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呼寸。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓艳汽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親对雪。 傳聞我的和親對象是個殘疾皇子河狐,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容