面向對象--抽象化

面向對象–抽象化

​ 今天我們上了數據結構課,老師給我們講了面向對象的思想,其中關於面向對象思想方面的內容,我有很大的疑惑。問了老師一些問題,才發現自己的理解有些偏差。於是整理了一些資料,歸納一下什麼纔是面向對象。

從問題開始

我原來理解的面向對象被老師批判了,老師說了一句話:面向對象是在抽象層面構建概念的 。我對此有些不解,便以此爲關鍵,搜索了一下。

起源

​ 最早的彙編語言中使用的子例程到結構化編程(C語言),然後到面向對象(C++,java,等)、面向組件(面向組件開發)以及面向服務(面向服務架構)。其實都是不斷地提升抽象的層次。在彙編時代問題規模都很小,所以我們需要的抽象能力不需要太強。而現代的軟件項目,問題的規模非常龐大,需要考慮的事情非常多(雖然純粹的技術含量不一定有彙編時代的高),我們就必須使用抽象層次更高的方法來匹配我們的問題規模。於是,我們來看看面向對象的相關資料。

文章引用:https://blog.csdn.net/chenlycly/article/details/8656348

首先,瞭解一下什麼是OO?

​ OO(Object–Oriented )面向對象,Object Oriented是建立在“對象”概念基礎上的方法學。對象是由數據和容許的操作組成的封裝體,與客觀實體有直接對應關係,一個對象類定義了具有相似性質的一組對象。所謂面向對象就是基於對象概念,以對象爲中心(我在此處犯迷,老是無法理解以對象爲中心的抽象性.接下來會詳細說一下),以類和繼承爲構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟件系統。

什麼是OOP?

​ 面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。OOP核心思想:封裝,繼承,多態。

文章引用:https://blog.csdn.net/hai__chen/article/details/79836467

oop的特點:

1、識認性,系統中的基本構件可識認爲一組可識別的離散對象;

2、類別性,系統具有相同數據結構與行爲的所有對象可組成一類;

3、多態性,對象具有惟一的靜態類型和多個可能的動態類型;

4、繼承性,在基本層次關係的不同類中共享數據和操作。

關於第二點,我詳細說明一下。我原來把OOP的類別性理解爲面向對象,其實不是。這也是我爲什麼把‘以對象爲中心’當作面向對象。此處,再談一個問題:高內聚,低耦合

高內聚,低耦合

高內聚:儘可能類的每個成員方法只完成一件事(最大限度的聚合)。這一點也是把代碼提升抽象化層次的關鍵。

此處有代碼分解的過程,請大家參考原博客的代碼:

https://blog.csdn.net/chenlycly/article/details/8656348

我的理解就是把一個代碼塊的功能實現後,把這個功能用到的對象繼續抽象,剝離原來的主體,單獨封裝成一個類,有點類似,一個代碼塊只實現一個小功能,從側面也體現了低耦合

低耦合:減少類內部,一個成員方法調用另一個成員方法。

此處,我產生了疑問:爲什麼會這樣呢?java不就是靠着不同的類之間的相互調用實現強大的功能呢嗎?於是百度了一下什麼是耦合。

耦合:是對模塊間關聯程度的度量。耦合的強弱取決與模塊間接口的複雜性、調用模塊的方式以及通過界面傳送數據的多少。 模塊間的耦合度是指模塊之間的依賴關係,包括控制關係、調用關係、數據傳遞關係。模塊間聯繫越多,其耦合性越強,同時表明其獨立性越差。

從百度的結果來看,這個耦合它並不是說,不能耦合。只是說要盡少量的耦合來方便以後代碼模塊甚至一個小功能的修改。什麼意思呢?我理解是這樣的:既然要實現一個獨立的工程,那麼就得分很多小的功能模塊,這些小的功能模塊啊,它難免會有些關聯。怎麼樣才能使他們的關聯性最小呢?我們就把一個功能不斷的細化。把用到這個功能的主體繼續抽象,就類似於高內聚的方法。這樣的話,減少這個功能模塊對於其他功能模塊的依賴。也就體現了這一段代碼的耦合性比較低,假如你把它幹掉引用它的功能比較少,其他的代碼模塊受影響也比較小。

​ 看一下博主的代碼,郵件這個對象最後單獨成爲一個類。他爲什麼要這麼寫呢?人這個對象不也是調用了這個郵件嗎?耦合度不是增加了嗎?其實不然。假如說現在遇到了問題,人不單單發郵件了,人還能發短信。這樣我們在改的時候,只能對着人這個類去改。我們爲什麼不單獨做一個短信類出來讓人去調用它呢?如果我們把短信這個東西寫在了人這個類裏面。假如某天短信要增加一點屬性呢,我們就還得把人這個類裏面的短信給它改掉。而且凡是涉及到人使用短信的,你都得改。到時候就會亂成一團麻,不如直接創建一個短信的類,想增加什麼屬性就增加什麼屬性,想怎麼改就怎麼改,就讓人去調用就行了。反過來思考。郵件單獨成爲一個類也是因爲這個原因。在對郵件不斷細化的過程中,自然而然要用到結構化的語言,也就是數據結構方面的內容。這就是一個簡單的封裝。那麼它和人這個主體使用郵件又有什麼關聯呢?關聯其實不大。發郵件這個功能也可以被其他的角色所調用。就相當於這樣,我們把一個一個的物品都細分成類。他們之間相互調用來觸發成一個大的功能。然而我們要在最小的範圍內來使他們相互調用的次數更少。假如人一生下來就能發郵件,那麼他應該當做一個屬性封裝在人這個類裏面。但事實是一個人他生成之後就沒有什麼特殊的東西。所以我們不斷的創建對象,不斷的調用,不斷的封裝。就形成了一個很大的程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章