摘要:回來正題,繼續(xù)探究面向?qū)ο?。其實面向?qū)ο笫怯幸幌盗械睦^承關(guān)系,實現(xiàn)關(guān)系,依賴關(guān)系組成。希望這篇文章可以幫助到一些對這方面還有困惑,不解的小白。我也是一個一年多的小白
好,今天來給大家總結(jié)一下我覺得的面向?qū)ο蟆?/p>
首先,我們帶著問題去想。
問題就是:什么是面向?qū)ο?
過去一些學(xué)校老師每當(dāng)講到面向?qū)ο蟮恼鹿?jié),都會貓不猶豫的定義一些class(類)。那么,這就是面向?qū)ο罅嗣矗窟^去我也是這么認(rèn)為的,但現(xiàn)在看來,其不然。
那么到底什么才是面向?qū)ο竽兀?/b>相信到這里大家都有一些疑惑。那平時咱們寫那么多的類,難道都不是面向?qū)ο??我很遺憾的告訴你,并不全是。包括我一年前剛?cè)肼殞懥撕芏啻a,也維護(hù)過很多"前輩"的項目,當(dāng)時又傻又天真的以為:"哇,這代碼真特么牛逼,一個類就幾百幾千行"。
現(xiàn)在回頭一想,哎呀我去,我都沒眼看了,那些代碼,跑著跑著,是會出bug的,他們的質(zhì)量不過關(guān)就,那上去跑了,跑條毛啊,最終還不是返回來給我們改bug。
到目前為止,我已經(jīng)慢慢開始轉(zhuǎn)變了這些想法。其實那都不是叫面向?qū)ο?,因為他們把不同類本身該有的事情都綜合起來一個類里面,所以它本身只是個類,并不具備面向?qū)ο蟮幕咎刭|(zhì)。
回來正題,繼續(xù)探究面向?qū)ο?。想想我們?nèi)祟?。舉個簡單的例子:
/** * 抽象人類,人們說的人類,反正就是隨你想的 */ Interface Human { public function setLastName($last_name); public function getLastName(); public function setFirstName($first_name); public function getFirstName(); } /** * 我老爸 */ class Father implement Human { /** * 姓,在國內(nèi),姓是不能隨便改的,當(dāng)然也是可以改。所以這里修飾成保護(hù) */ protected $last_name; public $first_name; public function setLastName($last_name) { $this->last_name = $last_name; return $this; } public function getLastName() { return $this->last_name; } public function setFirstName($first_name) { $this->first_name = $first_name; return $this; } public function getFirstName() { return $this->first_name; } } /** * 兒子 - 我 */ class Son extends Father { } $father = new Father(); $father->setLastName("黃"); $son = new Son(); $son->setFirstName("總"); // 打印我的名字 echo $son->getLastName() , $son->getFirstName();
既然我繼承我老爸,當(dāng)然是跟我老爸姓的啦。要改姓也可以,得問問老爸是否同意先。
不過一般我們的做法是
直接定義一個"Son"類,然后里面各種方法,甚至一些人類不可以做到的方法,比如會飛(不借助工具),反正就是一個類里頭夾雜各種不可思議的方法,真的是萬萬沒想到。那么如果是這樣,那其實我就不認(rèn)為這是面向?qū)ο罅?,而是簡單的定義類而已。
其實面向?qū)ο笫怯幸幌盗械睦^承關(guān)系,實現(xiàn)關(guān)系,依賴關(guān)系組成。寫代碼,做開發(fā),其實和生活是息息相關(guān)的,多留意自己的生活,多拿生活例子在開發(fā)工作中舉例,其實,原理就一目了然了。
繼續(xù)回來上面的話題,繼續(xù)面向?qū)ο蟆?/p>
比如說,我老爸會使用工具,但是我也會,而且過程,結(jié)果大不相同,而且使用的工具也不一樣,而且這個工具是需要買,或者找別人借的,不是自己家的。結(jié)合上面的小例子稍微修改一下。
/** * 抽象人類,人們說的人類,反正就是隨你想的 */ Interface Human { ...... // 代碼省略 public function useTools(ToolInterface $toolInterface = null); } /** * 我老爸 */ class Father implement Human { /** * 姓,在國內(nèi),姓是不能隨便改的,當(dāng)然也是可以改。所以這里修飾成保護(hù) */ ...... // 代碼省略 public function useTools(ToolInterface $toolInterface = null) { $result = $toolInterface->useTool(); ......//代碼省略,自由發(fā)揮 // 用工具得到結(jié)果,經(jīng)過老爸一系列加工,變成了不一樣的東東 return $result } } /** * 兒子 - 我 */ class Son extends Father { ...... // 代碼省略 public function useTools(ToolInterface $toolInterface = null) { // 使用工具,我想調(diào)整一下這個工具再使用 ......// 調(diào)整中 $result = $toolInterface->useTool(); ......//代碼省略,自由發(fā)揮,加工結(jié)果 return $result } } Interface ToolInterface { public function useTool(); } class Nokia implements ToolInterface { // 代碼自己想想 public function useTool(); } class IPhone20Plus implements ToolInterface { // 代碼自己想想 public function useTool(); } $father = new Father(); $father->setLastName("黃"); $son = new Son(); $son->setFirstName("總"); // 打印我的名字 echo $son->getLastName() , $son->getFirstName(); // 使用工具, 我不管他們怎么使用,反正我就是給了他了。而且,只要是個工具(實現(xiàn)ToolInterface)就行了 $father->useTool(new Nokia()); $son->useTook(new IPhone20Plus());
那么其實到這里,你可以很清晰的看到,其實這,才算是"我理解"的面向?qū)ο?。每個類都有自己多帶帶,獨(dú)有的方法,不同的操作。
而且在后面工具的哪里,我并沒有強(qiáng)制的在內(nèi)部是使用工具,而是在外部通過注入的方式去實現(xiàn)想要的。
再想想現(xiàn)實中,我們用的iPhone,安卓,到底是哪里來的呢?就是買來的嘛,總沒有說自己出一款,就算是自己出的,零件也是需要依賴各個地方的吧。所以其實我們整個生活圈就是一個很大的生態(tài)系統(tǒng),你在編程世界里面有的,基本上在生活當(dāng)中都能找到影子。
而且這樣有一個很好的好處,就是你會不知不覺的,降低了類與類之間的耦合性了,我們面向?qū)ο?,要的不就是這個效果嗎?再結(jié)合學(xué)過的知識,面向?qū)ο蟮奶匦裕煤盟伎歼@些問題,不斷考量,改善自己的這些想法。
希望這篇文章可以幫助到一些對這方面還有困惑,不解的小白。有什么地方說的不足的,還請各位大大指點,感謝各位。
By Jan(我也是一個一年多的小白)文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/20907.html
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...
摘要:是一種典型的面向?qū)ο缶幊陶Z言。這篇文章主要是來初步理解一下面向?qū)ο蟮乃季S為下面的內(nèi)容先給一個基礎(chǔ)。針對面向?qū)ο缶幊痰母鄡?nèi)容,會在后面的文章里面詳細(xì)解釋。他們都稱之為對象。之后,我們再用編程語言,把這種映射編寫出來,就是的面向?qū)ο缶幊汤病? showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...
showImg(https://segmentfault.com/img/remote/1460000007103938?w=391&h=247); 文章最初發(fā)表于我的個人博客非典型性程序猿 對于剛接觸JAVA或者其他面向?qū)ο缶幊陶Z言的朋友們來說,可能一開始都很難理解面向?qū)ο蟮母拍钜约邦惡蛯ο蟮年P(guān)系。筆者曾經(jīng)帶過一個短期培訓(xùn)班教授java入門基礎(chǔ),在最后結(jié)束課程的時候,還有很多同學(xué)不太理解面向?qū)ο?..
摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無論哪種面向?qū)ο缶幊陶Z言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向?qū)ο缶幊?,是以類為基礎(chǔ)生成新對象。而原型模式的面向?qū)ο缶幊陶Z言沒有類這樣一個概念。 什么是面向?qū)ο螅窟@個問題往往會問到剛畢業(yè)的新手or實習(xí)生上,也是往往作為一個技術(shù)面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談?wù)勎宜斫獾拿嫦驅(qū)ο蟆?從歷...
摘要:用代碼可以這樣描述安全到達(dá)國外面向過程既然說了面向?qū)ο?,那么與之對應(yīng)的就是面向過程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^程,以及中對象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對面向?qū)ο笏枷氲囊粋€理解。先說說什么是對象,其實這個還真的不好說。我們可以把自己當(dāng)成一個對象,或者過年的時候相親,找對象,那么你未來的老婆也是一個對象。我們就要一些屬性,比...
閱讀 3268·2021-09-29 09:34
閱讀 3617·2021-09-10 10:51
閱讀 2013·2021-09-10 10:50
閱讀 7019·2021-08-12 13:31
閱讀 3059·2019-08-30 15:54
閱讀 1682·2019-08-30 15:44
閱讀 1484·2019-08-29 12:26
閱讀 2714·2019-08-26 18:36