【什麼是對象,爲何要面向對象,怎麼才能面向對象?】

093417dodt02xocoonm22x.jpg 

1、 面向對象,這個對象究竟是什麼?程序員

  這個對象不是C#中的實例,C#中咱們把一個類的實例也叫作對象,這種對象嚴格的說應該是面向對象的編程實現(OOP)中的對象,面向對象編程,也不是面向類的實例編程。對象的定義是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等都可看做對象,它不只能表示具體的事物,還能表示抽象的規則、計劃或事件。也有的定義爲「一切都是對象」然而面向對象也不能簡單的等價理解成面向任何事物編程,面對一切編程?開玩笑,呵呵。數據庫

  所以面向對象這個對象,指的是客體。所謂客體是指客觀存在的對象實體和主觀抽象的概念。編程

  2、 爲何要面向對象設計模式

  面向對象是爲了解決系統的可維護性,可擴展性,可重用性,咱們再進一步思考,面向對象爲何能解決系統的可維護性,可擴展性,可重用性?架構

  面向對象產生的歷史緣由有下面兩點:ide

  一、 計算機是幫助人們解決問題的,然而計算機終究是個機器,他只會按照人所寫的代碼,一步一步的執行下去,最終獲得告終果,所以不管程序多麼的複雜,計算機老是能輕鬆應付。結構化編程,就是按照計算機的思惟寫出的代碼,可是人看到這麼複雜的邏輯,就沒法維護和擴展了。模塊化

  二、 結構化設計是以功能爲目標來設計構造應用系統,這種作法致使咱們設計程序時,不得不將客體所構成的現實世界映射到由功能模塊組成的解空間中,這種轉換過程,背離了人們觀察和解決問題的基本思路。工具

  可見結構化設計在設計系統的時候,沒法解決重用、維護、擴展的問題,並且會致使邏輯過於複雜,代碼晦澀難懂。因而人們就想,能不能讓計算機直接模擬現實的環境,用人類解決問題的思路、習慣、步驟來設計相應的應用程序?這樣的程序,人們在讀它的時候,會更容易理解,也不須要再把現實世界和程序世界之間來回作轉換。spa

  與此同時,人們發現,在現實世界中存在的客體是問題域中的主角。所謂客體是指客觀存在的對象實體和主觀抽象的概念,這種客體具備屬性和行爲,而客體是穩定的,行爲是不穩定的,同時客體之間具備各類聯繫,所以面向客體編程,比面向行爲編程,系統會更穩定。在面對頻繁的需求更改時,改變的每每是行爲,而客體通常不須要改變,因此咱們就把行爲封裝起來,這樣改變時候只須要改變行爲便可,主架構則保持了穩定。設計

  因而面向對象就產生了。

  然而人們追求的系統可維護性,可擴展性,可重用性又是怎麼在面向對象中體現出來的呢?

  首先看看面向對象的三大特徵:

  封裝:找到變化而且把它封裝起來,你就能夠在不影響其它部分的狀況下修改或擴展被封裝的變化部分,這是全部設計模式的基礎,就是封裝變化,所以封裝的做用,就解決了程序的可擴展性。

  繼承:子類繼承父類,能夠繼承父類的方法及屬性,實現了多態以及代碼的重用,所以也解決了系統的重用性和擴展性。可是繼承破壞了封裝,由於他是對子類開放的,修改父類會致使全部子類的改變,所以繼承必定程度上又破壞了系統的可擴展性,因此繼承須要慎用。只有明確的IS-A關係才能使用,同時繼承在在程序開發過程當中重構獲得的,而不是程序設計之初就使用繼承,不少面向對象開發者濫用繼承,結果形成後期的代碼解決不了需求的變化了。所以優先使用組合,而不是繼承,是面向對象開發中一個重要的經驗。

  多態:接口的多種不一樣的實現方式即爲多態。接口是對行爲的抽象,剛纔在封裝提到,找到變化部分並封裝起來,可是封裝起來後,怎麼適應接下來的變化?這正是接口的做用,接口的主要目的是爲不相關的類提供通用的處理服務,咱們能夠想象一下。好比鳥會飛,可是超人也會飛,經過飛這個接口,咱們可讓鳥和超人,都實現這個接口,這就實現了系統的可維護性,可擴展性。

  所以面向對象能實現人們追求的系統可維護性,可擴展性,可重用性。面向對象是一種編程思想,起初,「面向對象」是專指在程序設計中採用封裝、繼承、多態等設計方法,但面向對象的思想已經涉及到軟件開發的各個方面,好比如今細分爲了面向對象的分析(OOA),面向對象的設計(OOD),面向對象的編程實現(OOP)

  3、面向對象編程,分爲幾個步驟?

  面向對象是一種思想,他讓咱們在分析和解決問題時,把思惟和重點轉向現實中的客體中來,而後經過UML工具理清這些客體之間的聯繫,最後用面向對象的語言實現這種客體以及客體之間的聯繫。它分爲面向對象的分析(OOA),面向對象的設計(OOD),面向對象的編程實現(OOP)三個大的步驟。

  一、首先是分析需求,先不要思考怎麼用程序實現它,先分析需求中穩定不變的客體都是些什麼,這些客體之間的關係是什麼。

  二、把第一步分析出來的需求,經過進一步擴充模型,變成可實現的、符合成本的、模塊化的、低耦合高內聚的模型。

  三、使用面向對象的實現模型

  4、面向過程到面向對象思惟如何轉變?

  當咱們習慣了面向過程編程時,發如今程序過程當中處處找不到須要面向對象的地方,最主要的緣由,是思惟沒有轉變。程序員一般在拿到一個需求的時候,第一個反應就是如何實現這個需求,這是典型的面向過程的思惟過程,並且很快可能就實現了它。而面向對象,面對的倒是客體,第一步不是考慮如何實現需求,而是進行需求分析,就是根據需求找到其中的客體,再找到這些客體之間的聯繫。所以面向過程和麪向對象的思惟轉變的關鍵點,就是在第一步設計,拿到需求後,必定先不要考慮如何實現它,而是經過UML建模,而後按照UML模型去實現它。這種思路的轉變,可能須要個過程。

  5、面向對象和基於對象的區別

  「面向對象」「基於對象」都實現了「封裝」的概念,可是面向對象實現了「繼承和多態」,而「基於對象」沒有實現這些。所以在咱們進行Web開發,普通三層開發中,基本上是基於對象的實現,由於只是實現了封裝,可是沒有使用繼承和多態。不過這也正常,Web開發,大部分功能就是簡單的增刪改查,中間的BLL層基本就是直接New一個DAL的實例就return了,關係數據庫已經爲咱們作了不少工做,因此大部分的工做,就是簡單讀取而後顯示了。所以沒有複雜的需求的時候,基於過程也沒什麼不對,面向過程也沒什麼不對,實用是壓倒一切的因素。

相關文章
相關標籤/搜索