首頁>技術>

一個專注於web技術的80後

你不用拼過聰明人,你只需要拼過那些懶人 你就一定會超越大部分人!

前言

這一章節的內容不僅僅適合JavaScript 也適合其他面向物件程式語言!

第一節: 什麼是面向物件?

官方摘要

面向物件(Object Oriented): 是軟體開發當中的一種方法 或者說 方式,更加可以說成是一種思維方式、它是一種對現實世界理解和抽象的方法, 面向物件是相對於面向過程來講的,面向物件方法,把相關的資料和方法組織為一個整體來看待,從更高的層次來進行系統建模,更貼近事物的自然執行模式

它現在的應用領域也不僅僅侷限於程式設計和軟體開發了,它擴充套件到了資料庫、分散式系統、網路管理結構、互動式介面、等領域!

面向物件導論
 隨著計算機技術的不斷提高,計算機被用於解決越來越複雜的問題。      一切事物皆物件,透過面向物件的方式,將現實世界的事物抽象成物件, 現實世界中的關係抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。 透過面向物件的方法,更利於用人理解的方式對複雜系統進行分析、設計與程式設計。      同時,面向物件能有效提高程式設計的效率,透過封裝技術,訊息機制可以像搭積木的一樣快速開發出一個全新的系統。 面向物件也是指一種程式設計範型,同時也是一種程式開發的方法。      物件指的是類的集合。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。           面向物件的思想已經涉及到軟體開發的各個方面。     面向物件的分析   (OOA,Object Oriented Analysis)     面向物件的設計   (OOD,Object Oriented Design)     面向物件的程式設計實現(OOP,Object Oriented Programming) 
面向物件起源背景

面向物件是在結 構化設計方法 出現了很多問題之後 才應運而生的。

結構化設計方法求解問題的基本策略是從功能的角度審視問題! 也就是 解決“做什麼 怎麼做 從行為的角度出發!

結構化設計方法將應用程式看成實現某些特定任務的功能模組,在這個應用程式中的每一個模組,都是實現應用程式某項具體操作的底層功能和具體的操作過程! 如果說應用程式系統比較小那麼還好,如果是複雜的應用系統 那麼這種做法顯然是有弱點的,如下:

審視問題的視角

結構化設計方法所採用的設計思路是以功能為目標來設計構造應用系統,也就是行為, 比如說: 要做一個企業站系統,功能有釋出文章、顯示文章、新增文章、這些都是行為功能, 但行為是不穩定的! 因為這些每一樣功能所實現的過程有很多種 並且還有其他的功能 這些是不能確定的!

通俗點說就是:確定的功能、確定模組、以及每個模組演算法和編寫具體的程式碼就寫在一堆,或寫在一個函式中 直接使用! 初學者就習慣這樣幹!

結構化設計方法設計建立在不穩定的操作之上,使得應用程式的日後維護和擴充套件相當困難,甚至一個微小的變動,都會波及到整個系統, 所以這就是誕生面向物件程式設計的首要原因

抽象級別

好的抽象策略可以控制問題的複雜程度,增強系統的通用性和可擴充套件性

抽象主要分: 過程抽象和資料抽象

結構化設計方法應用的是過程抽象 就是將問題中具有明確功能定義的操作程式碼抽取出來 直接寫上 並看成一個整體

過程抽象級別對於軟體系統結構的設計顯得有些武斷,並且穩定性差

一旦某個表示方式發生了變化,就有可能牽扯到已有系統的很多部分。

資料抽象是,將描述主體[客體]的屬性和行為繫結在一起,實現統一的抽象,從而達到對現實世界主體物件的真正模擬。

封裝的體現

結構化設計方法沒有做到客觀事物主體的整體封裝,只是封裝了各種功能模組,就從程式碼書寫的角度來講, 比如你寫了很多功能獨立的函式一樣, 或者說就把一些程式碼裸露地寫在一個頁面上一行一行地執行下來!

而每個功能模組又有可能操作到沒有保護能力主體事物程式碼, 也就是說其他的功能程式碼的 屬性變數 或者執行流程被 實施操作覆蓋等等!!

並且結構化設計方法是把描述屬性的資料與行為被分割開的,

一旦某個主體事物屬性的表達方式發生了變化,或某個行為效果發生了改變,可能就是對整個系統產生巨大影響, 也就是改一個地方其他很多地方都需要改動的原因

面向物件就把封裝體現得很好,把該邏輯單元負責將所描述的屬性隱藏起來,外界對主體事物內部屬性的所有訪問只能透過提供的使用者介面來實現

這樣做既可以實現對主體物件屬性的保護作用,又可以提高軟體系統的可維護性。

只要使用者介面不改變,任何封裝體內部的改變都不會對軟體系統的其他部分造成影響!

可重用性

重用性是衡量一個軟體產品成功與否的重要標誌!

然而,結構化程式設計方法的基本單位是模組,每個模組只是實現特定功能的過程描述, 因此,它的可重用單位只能是模組。

所以在軟體開發的時候必須要考慮程式碼的重用性是必然也是必須的!!

例如,在PHP語言編寫程式時使 寫一些標準函式或者自定義函式, 但對於今天的軟體開發來說,這樣的重用力度顯得微不足道,而且當參與操作的某些資料型別發生變化時,就不能夠再使用那些函數了 因為不夠靈活

因此,渴望更大力度的可重用構件是如今應用領域對軟體開發提出的新需求,

這些弱點驅使人們尋求一種新的程式設計方法, 來適應現代社會對軟體開發的更高要求, 因此面向物件由此誕生了!

面向物件 和 基於物件的區別

很多人在這個問題上是分不清楚的,甚至也可以說是他們已經是混淆概念

面向物件 必然有三大特點(封裝,繼承,多型)

基於物件 是使用物件, 就是無法利用現有的物件產生新的物件型別,繼而產生新的物件,也就是說基於物件沒有繼承的特點!

而且 “多型”表示為父物件的子物件例項,沒有了繼承的概念也就無從談論“多型”。

所以當你判斷一個新的技術是否是面向物件的時候,通常可以使用後兩個特性來加以判斷,也就是 繼承和多型

“面向物件”和“基於物件”都實現了“封裝”的概念,但是面向物件實現了“繼承和多型”,而“基於物件”沒有實現這些

面向物件 和 面向過程

面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了!

面向物件是把構成問題事務分解成各個方法行為,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。

面向物件的三大特性與五大原則三大特性

1、封裝 隱藏物件的屬性和實現細節,僅對外提供公共訪問方式,將變化隔離,便於使用,提高複用性和安全性。 2、繼承 提高程式碼複用性;繼承是多型的前提。 3、多型 父類 或 介面定義的引用變數可以指向子類或具體實現類的例項物件。提高了程式的拓展性

五大原則

1、單一功能原則SRP (Single Responsibility Principle) 類的功能要單一,不能包羅永珍,跟雜貨鋪似的

2、開放封閉原則OCP(Open-Close Principle)

開放封閉原則主要體現在兩個方面:

1、對擴充套件開放,意味著有新的需求或變化時,可以對現有程式碼進行擴充套件,以適應新的情況。

2、對修改封閉,意味著類一旦設計完成,就可以獨立完成其工作,而不要對其進行任何嘗試的修改。

3、里氏替換原則LSP(the Liskov Substitution Principle LSP) 子類可以擴充套件父類的功能,但不能改變父類原有的功能。

子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。

子類中可以增加自己特有的方法。

當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。

4、依賴反轉原則DIP(the Dependency Inversion Principle DIP) 高層次的模組不應該依賴於低層次的模組,他們都應該依賴於抽象。抽象不應該依賴於具體實現,具體實現應該依賴於抽象。

聽起來更像是“針對介面程式設計,而不是針對實現程式設計”

問題由來:類A直接依賴類B,假如要將類A改為依賴類C,則必須透過修改類A的程式碼來達成。這種場景下,類A一般是高層模組,負責複雜的業務邏輯;類B和類C是底層模組,負責基本的原子操作;假如修改類A,會給程式帶來不必要的風險。

解決方案: 將類A修改為依賴介面I,類B和類C各自實現介面I,類A透過介面I間接與類B或者類C發生聯絡,則會大大降低修改類A的機率。

在java、php中,抽象指的是介面或者抽象類,細節就是具體的實現類,使用介面或者抽象類的目的是制定好規範和契約,而不去涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。

依賴倒置原則的核心思想是面向介面程式設計

5、介面分離原則ISP(the Interface Segregation Principle ISP)

介面隔離原則的含義是:建立單一介面,不要建立龐大臃腫的介面,儘量細化介面,介面中的方法儘量少。

為什麼有人說JavaScript是基於物件的語言?

JavaScript不是面向物件的語言, 並且上面我也闡述了面向物件 和 基於物件的區別,

因為JavaScript沒有繼承的概念,進而也沒有多型的概念,缺少了繼承和多型的特性,所以我們就可以判定JavaScript就只是個基於物件的語言

簡單地講,“面向物件就是把現實中的事物抽象化”

面向物件方法是一種運用物件、類、封裝、繼承、多型和訊息等概念來構造、測試、重構軟體的方法。

簡言之,面向物件就是面向事情本身,面向物件的分析過程就是認識客觀世界的過程。

大家的支援就是我堅持下去的動力!

10
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 5 分鐘學懂 SSH 隧道技術