1. 程式人生 > >面向物件基礎01

面向物件基礎01

程式語言共性:元素+語法+對映
元素:識別符號保留字元號
資料:型別物件值常量和變數
操作:運算運算子表示式語句
流程:流程控制順序選擇迴圈
函式:函式引數呼叫返回值
函式蘊含了1.(對映)簡化2.複用兩種非常重要的思想
函式其實是程式碼複用的一種最原始的體現。
簡化舉例:
1.一條呼叫語句代表了n條語句
2.吃蘋果代表了現實世界的吃蘋果
文字->現實世界
有窮集->無窮集
基本元素、規則(有窮集)->基本元素+規則(無窮集)->現實世界(無窮集)
例子1:自然數(元素+語法+對映)
最簡單的語言:自然數-最簡單的語言:自然數->現實世界數量的概念
基本元素:0,1,2,3,4,5,6,7,8,9
語法:形成一個n個字元的序列
對映:一一對映
基本元素10個、語法1條(有窮集)->自然數(無窮集)->現實世界數量的概念(無窮集)
程式碼複用3個級別:
1.本專案內程式碼複用。
2.多個專案的程式碼複用。
3.某一領域內程式碼複用。

---<面向物件>---5個核心詞:類、物件、封裝、繼承、多型
//是計算機程式設計技術發展到一定階段後的產物。

面向物件是一種軟體設計思想。是一種對現實世界理解和抽象的方法。
物件多如狗。核心是物件。物件是對現實世界事物的抽象。
封裝、繼承、多型是面向物件的3大特徵。3大特徵具有層次性。
3個特徵一起才能較好地反映客觀世界。

原因:面向過程的思想難以實現越來越複雜的系統。開發不高效。
優勢:面向物件通過不同層次抽象來簡化複雜系統設計,並提供不同級別的複用。

程式碼複用3個級別:
1.本專案內程式碼複用。函式,繼承。
2.多個專案的程式碼複用。類,繼承。
3.某一領域內程式碼複用。框架。


把現實世界的事物抽象成物件。相似的物件抽象成為類。
類被實現為一種資料型別,而物件是該資料型別的一個例項。
(或抽象資料型別,以示它和麵向過程中基本資料型別、結構體等型別的區別)
(如:我們一說抽象資料型別,就知道指的是類而不是結構體。)
類和物件關係:
(1)類是抽象,物件是具體。
(2)通過抽象的類定義具體的物件。
(3)1個類對應n個物件。
//具體和抽象都是相對的。類相對物件是抽象,物件相對現實世界的事物是抽象。

---<封裝>---
劃分邊界,物件成為獨立的個體,有了物件內和物件外。物件內高內聚,物件之間低耦合。
//劃分邊界,產生個體,有了內外。再談高內聚和低耦合。

封裝是通過物件實現和體現的。
裝:物件就像一個容器,將相關的資料和方法裝在一起。
封:物件作為一個整體,劃分了邊界,物件內和物件外。只對外提供必要的服務。
---<封裝的優點>
劃分邊界,高內聚,低耦合。
使用簡單:使用者只用關注物件提供的服務。(公有的部分)
便於管理,資訊隱藏,減少錯誤。

//---這導致很多人,比如以前的我以為面向物件的特徵還包括抽象或類、物件
//-1- 其實如果理解了物件和封裝的關係,類、物件和封裝意思差不多的。
//物件、封裝本來就是一種重複的說法,一般說特徵的時候我們只用封裝就可以了。
//-2- 至於抽象,抽象思想的應用範圍非常廣泛,應用於各種科學領域。
//抽象可不是面向物件的特有的,我們一般說面向物件使用了抽象思想。

結論:面向物件3大特徵是封裝,繼承和多型。物件多如狗。3個特徵具有層次性。
//面向物件的特徵包括物件或抽象這種說法當然也正確,3大特徵的說法更清晰易理解。

---非常重要:
怎麼說都正確。正確理解面向物件才是重點@

[email protected]!..
---<繼承>
來源:現實事物間的繼承關係抽象成類之間的繼承關係。、
表現:類之間的繼承關係。子類繼承父類的東西。通過許可權控制繼承。
基礎:繼承基於類(沒有類哪來的類之間的繼承關係)。
//通過許可權控制,控制繼承和訪問。private不能被繼承,protected和public可以被繼承。

---<多型>
來源:相同的訊息,不同的物件有不同的行為。
表現:子類可以覆蓋父類的方法表現出多型,或者不覆蓋不表現多型。非常靈活。
基礎:多型基於繼承。

---<硬編碼和軟編碼>
硬編碼將程式風險部分寫在原始碼中,軟編碼將風險部分暴露在配置檔案中。
如果風險部分需要改變,則硬編碼必須修改原始碼,重新編譯整個程式並重新部署。
軟編碼只需要修改配置檔案中的引數,不需要修改原始碼。

優缺點:硬編碼效率低下,太麻煩。如果可以使用軟編碼,絕對不要使用硬編碼。

案例1:資料庫遷移。
1.將資料從舊庫遷移到新庫。//此期間程式能夠正常執行
2.修改程式,使用新庫。//此期間程式必須終止執行
硬編碼:
修改程式時,必須修改原始碼,重新編譯並部署程式。
佔用時間長,影響程式正常執行。太麻煩,效率低下。
軟編碼:
只需要修改配置檔案,設定成新的資料庫。佔用時間非常短,幾乎不影響程式正常執行。

1.什麼是面向物件?
面向物件是一種軟體設計思想,核心是物件,有封裝,繼承,多型三大特徵。

2.什麼是物件?
物件在程式碼中,指的是一種程式碼單元,它具有屬性和方法,是一種相對獨立的單位。

3.軟體設計?
軟體設計簡單來說,就是為滿足現實世界的需求,設計出相應的程式語言描述的邏輯。

軟體設計的起點:
現實世界
軟體設計的終點:
程式語言描述的邏輯。

為了提高開發效率,軟體設計的2個主要目標:1.簡化設計 2.程式碼重用
軟體的複雜程度:這裡簡單的用程式碼行數來表達。比方一個普通的專案需要10萬行程式碼

例子1:
2018年你從零開發了一個10萬行程式碼的專案,花了1年時間。
2019年你又從零開發了一個10萬行程式碼的專案,花了1年時間。
思考:
你在開發的過程中,發現2個專案,存在很多功能上重複的程式碼,顯然沒必要重複編寫。
關鍵在於,怎麼處理這些可能被再次使用的程式碼。
需要提供一種程式碼重用的機制。

例子2:
1.有一天你需要把地裡的雜草除掉。為此你做了一個鋤頭,用鋤頭把草除掉了。
2.又有一天你需要種樹。你發現自己需要挖坑,哦你想起來上次除草做了個鋤頭,
鋤頭可以挖坑,於是你把鋤頭拿了過來,挖坑種樹。
思考:
顯然我們為了種樹,只需要拿出上次的鋤頭,這樣極大的提高了生產效率。
沒必要再重新制作一個新的工具。因為鋤頭完全可以滿足我們的需求。

比喻:
這裡用現實世界和程式碼開發做了一個比喻。
注意:只有在2者之間存在相似的地方,比喻才是恰當的。

4.再談物件
物件,實現了軟體設計2個主要目標。1.簡化設計 2.程式碼重用。

1.簡化設計方面
軟體設計的起點,是現實世界,終點是程式碼。也就是說程式碼來源於現實世界。
我們很容易建立現實事物和程式碼世界中物件這種程式碼單元的對映。儘管有時候不是這樣的。
換種說法,我們很容易將現實事物,轉化為程式碼中的物件。
例子:
現實世界:員工,有工資,工齡,職位,可以加薪,升職。
---<我們非常容易就可以將現實世界中的員工對映到程式碼世界中>---
程式碼世界:
Employee類
屬性:salary,workYear,position
方法:riseSalary();risePosition();
注意:將現實事物對映到程式碼世界的結果並不唯一,我們想表達的只是物件的產生讓實現這種對映很容易。
儘管有時候不是這樣的。

2.程式碼重用方面
物件中的繼承,提供了一種程式碼重用的方法。