日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

面向?qū)ο蠓椒ǖ幕舅枷?面向?qū)ο笤O(shè)計思想是什么

主流的編程范式有三種:面向過程、面向?qū)ο蠛秃瘮?shù)式編程 , 我們現(xiàn)在使用的主流編程語言 C# 或 Java , 都是面向?qū)ο笳Z言 , 所以常常說的設(shè)計模式也是在面向?qū)ο笳Z言這個前提之下 。
面向?qū)ο蟮幕A(chǔ)知識和一些設(shè)計原則 , 我認(rèn)為是學(xué)習(xí)設(shè)計模式的基礎(chǔ) , 本文就聊下這些基礎(chǔ)知識 。
在面試時 , 一問到面向?qū)ο?nbsp;, 幾乎每個人都能脫口而出:封裝、繼承、多態(tài) 。但大部分只能說出一個簡單的概念 , 而多態(tài)還有很多連概念都說不清楚 。我們學(xué)習(xí)面向?qū)ο?nbsp;, 不止需要了解概念 , 更需要知道每個特性存在的意義和目的 。
對于面向?qū)ο蟮奶匦?nbsp;, 面向?qū)ο蟮恼Z言都會給出相應(yīng)的支持 , 不同語言可能會有細(xì)微差別 , 下面的示例以 C# 語言為主 。
封裝我們先來思考下 , 平時寫代碼時有哪些是屬于封裝 , 是不是會有下面的一些場景:
1、將一些屬性字段放到一個類中;
2、將一些方法放到一個類中
3、將某些類組織到某個特定的命名空間下 。
而在 C# 9.0 版本中還提供了屬性的 init 特性 , 可以更方便地提供封裝性:
public class UserInfo{public string Name { get; init; }}UserInfo user = new UserInfo { Name = "oec2003" };//當(dāng) user 初始化完了之后就不能再改變 Name 的值user.Name = "oec2004";除了屬性、方法和類也有對應(yīng)的訪問修飾符 , 這些訪問修飾符的靈活運用就達(dá)到了封裝的目的 , 用來隱藏信息或進行數(shù)據(jù)的保護 。
試想一下 , 如果我們對類中屬性或方法全部都使用 public  , 調(diào)用方可以任意修改屬性和調(diào)用方法 , 這樣會使代碼變得不可控 , 屬性可能被很多地方以不同的方式進行修改 , 代碼難以維護 。而且不熟悉業(yè)務(wù)的開發(fā)人員如果隨意改動了一些關(guān)鍵屬性 , 可能引發(fā)嚴(yán)重的問題 。
從另一個方面來說 , 類的共有屬性和方法暴露的越多 , 對于調(diào)用者來說就會越復(fù)雜 , 越容易出現(xiàn)問題 , 合理地進行封裝 , 可以提高可讀性、可維護性 , 減少出錯 。
這時 , 你是不是可以想想 , 平時寫代碼時 , 屬性、方法、類如果要讓外部進行調(diào)用 , 都統(tǒng)一寫上 public 了呢?
繼承目前面向?qū)ο蟮恼Z言基本都支持繼承特性 , 只是語法上有些細(xì)微的差別 , 比如 C# 語言是使用冒號 , Java 語言使用 extends 關(guān)鍵字 。但都是標(biāo)識 is-a 的關(guān)系 。
在 C# 中一個類可以繼承多個接口 , 但只能繼承一個父類 , 我們通常說的 C# 只支持單繼承指的是 C# 只能繼承一個父類 , 但在 C++ 、Python 等語言中類是可以繼承多個類的 。
我們經(jīng)常會跟開發(fā)人員講 , 不要到處復(fù)制代碼 , 代碼要做到能夠復(fù)用 , 發(fā)現(xiàn)同一個邏輯在兩個不同的類中的時候 , 可以抽象出來一個父類 , 讓這兩個類繼承這個父類 。這個思路沒有問題 , 也確實能解決我們的實際問題 , 提升代碼質(zhì)量 。
但隨著功能的增加 , 我們需要對類的屬性和方法進行擴展 , 會發(fā)現(xiàn)需要新添加的屬性或方法放在父類或子類都不合適 , 只能繼續(xù)進行抽象 , 長此下去 , 繼承關(guān)系會變得非常復(fù)雜 , 變得難以維護 。有條設(shè)計原則是這么說的:組合優(yōu)于繼承 , 其實就是為了解決這個問題 。

推薦閱讀