首頁  >  文章  >  後端開發  >  javascript - 如何優雅的回答「什麼是物件導向」?

javascript - 如何優雅的回答「什麼是物件導向」?

WBOY
WBOY原創
2016-12-01 00:25:471082瀏覽

發現很多面試官都喜歡問這個問題(我是學生),然而每次覺得自己在這個問題上都答得不盡人意。
我的回答往往是

  • 它的設計上的特點是:繼承、封裝、多態;

  • 從具像到抽象。屬性變成變量,行為變成方法;

然而面試官似乎不是很滿意,不知各路大神有沒有相對優雅的回答?

回覆內容:

發現很多面試官都喜歡問這個問題(我是學生),然而每次覺得自己在這個問題上都答得不盡人意。
我的回答往往是

  • 它的設計上的特點是:繼承、封裝、多態;

  • 從具像到抽象。屬性變成變量,行為變成方法;

然而面試官似乎不是很滿意,不知各路大神有沒有相對優雅的回答?

先回答是一種程式設計範式

接著把你說的三個特性的具體描述說一下,例如:

  • 繼承:可以使子類別復用父類別公開的變數、方法;

  • 封裝:屏蔽一系列的細節。使外部呼叫時只要知道這個方法的存在;

  • 多態:父類別的方法繼承的到子類別以後可以有不同的實作方式;

接著你可以說一說物件導向的優點和缺點,那麼一件事情是沒有絕對的優點和缺點的,需要一個對比。故此,你得說一說面向過程的程式設計思想

回來丟文章了

看了lz的問題被踩了,我在社區裡看了一下,的確有相關的答案。我的文章算是小補充,如果有問題望各位指出。

面向對象的思想

再用我工作中的實例回答補充下,前段時間要做一個很簡單的功能,點讚,確實是一個很簡單的功能,但點讚的功能不只是一次,用戶可以給其他的評論點贊,可以給文章點贊,可以給問題點讚等等,而且點讚之後可能觸發一系列的事件(通知相關用戶等),最初我想的有三種寫法

<code>// 1.文章被用户点赞
$article->votedBy($user);
// 2.用户给某篇文章点赞
$user->voteArticle($article);
// 3.用户伸出大拇指给某篇文章点赞
$user->thumbUp()->voteToArticle($article);
//$user->thumbUp()->voteToDiscuss($discuss);</code>

最後我用了第三個寫法,具體怎麼實現,在你伸出大拇指的那一刻你就知道了。

這真的是個有趣的問題,哈哈。當然每個人都會有不同的理解,畢竟物件導向這個概念也是炒作起來的。

我的理解包含兩個面向:

  • 一個是物件導向設計;

  • 一個是物件導向程式設計。

物件導向設計的核心思想是模組化,而物件導向程式設計的核心思想是面向接口,物件導向程式設計還有一個親戚叫基於物件程式或叫原型程式設計(JavaScript就是)。所以說物件導向程式設計一般是需要語言層級支援的,就像你上面說的封裝、繼承和多型什麼的。

物件導向概念比較火熱的時候,人們常說軟體復用,繼承是軟體復用的直接體現。但是後來人們發現,應該更多的使用組合而不是繼承,接著面向介面程式設計就火了。

扯得有點遠了,到此打住吧。

萬物皆對象。

object-oriented

everything is object

一定用例子來
例如 動物-》furu動物-》 人, 獅子, 老虎

加上多態,例如都會叫

繼承,例如furu動物都是胎生的,等等

實作專案時,需要將業務抽象化為程式碼,這個抽象過程就是程式設計範式,而物件導向就是其中一種。類似的還有面向過程,函數式程式設計。

面向對象的特徵是繼承, 多態, 封裝

接著面試官就可以開始問繼承, 多態, 封裝了。

完美! ~~~

最好知道下什麼是面向過程,函數式編程,那就更好了。

self-contained, 如果他不懂, 你就可以直接走人了, 這個面試官太菜!

js說:萬物皆對象,對像也是對象--沒毛病

嗯 一切皆對象

記得在zhihu看過一個回答 他的理解是 (從實踐上來講)最重要的就是代碼的複用。

封裝:可以直接用封裝好的程式碼區塊,這是複用。

繼承:使用已有的屬性,這是重複使用。

多態:不同的細節,但是基礎上依然首先需要重複使用。

不討論高深的程式設計、範式等理論性強的東西,對於寫程式碼本身最直接的優勢和體驗就是,復用的多了,程式碼變得簡潔。

面向你的對象(俗稱男/女朋友),擺出一個優雅的姿勢,然後深情地告訴他/她,看著我……這就是優雅地面向對象

打包資料和相關聯的行為

有趣的問題。我也是學生,談一些自己的理解。

物件導向有個很大的特點是,它同時把資料和行為(對資料的操作)結合起來,和現實世界的運作邏輯更相似
為什麼這麼覺得,是和傳統的(面向過程等等)比較而得出來的。

打個比方, C 語言對數據和行為的處理其實有點割裂,更重視了行為。它裡面沒有叫「物件」的概念,而是個充滿動作(函數)的世界。主要都是函數呼叫函數,從頭執行到尾巴給出結果……這個世界裡最主要的東西就是各種動作。

而 C++ 的「物件」就特​​別像一個東西,比如說一個人。它的世界是充滿物體的世界。主要都是物體和物體(人和物體、人和人等等)之間發生關係,這些關係或說碰撞導致了最後的結果……這個世界裡最主要的東西就是各種物體。

物體本身是攜帶資料、攜帶功能的;物體之間發生關係,才有了世界的運作。這兩點,物件導向的程式設計和現實世界更為相像。

而上述「繼承、封裝、多型」等特點,便也可由此來模擬現實世界更了解。我隨便舉點例子…

  • 繼承:書 & 教材 & 電腦類教材 —— 這就是現實世界的繼承關係。

  • 封裝:手機 —— 它是封裝好的,當你使用它時,不必知道裡面的電路邏輯。

  • 多態:人.看(美女) & 人.看(強光) —— 參數類型不一樣,執行的也不一樣。

那面向對象的好處也很容易理解。一個是提高可理解性,因為物件以人類認識世界的規律呈現,符合常用思維方式;第二個就是更容易開發和維護,系統的最佳化很大程度上等於對物件資料和功能的重新認識,在原有基礎上修改一些東西。

哪裡說的不對懇請各位批評指正……!

不排除有些面試官本身就很水,這他媽是一個大的無比的話題,坐一起談幾天都談不完

少逛知乎,多寫程式碼

萬物皆對象。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn