初學必讀:61條面向對象設計的經驗原則

(1)所有數據都應該隱藏在所在的類的內部。
(2)類的使用者必須依賴類的共有接口,但類不能依賴它的使用者。

(3)盡量減少類的協議中的消息。
(4)實現所有類都理解的最基本公有接口[例如,拷貝操作(深拷貝和淺拷貝)、相等性判斷、正確輸出內容、從ASCII描述解析等等]。

(5)不要把實現細節(例如放置共用代碼的私有函數)放到類的公有接口中。
如果類的兩個方法有一段公共代碼,那么就可以創建一個防止這些公共代碼的私有函數。

(6)不要以用戶無法使用或不感興趣的東西擾亂類的公有接口。

(7)類之間應該零耦合,或者只有導出耦合關系。也即,一個類要么同另一個類毫無關系,要么只使用另一個類的公有接口中的操作。

(8)類應該只表示一個關鍵抽象。

包中的所有類對于同一類性質的變化應該是共同封閉的。一個變化若對一個包影響,則將對包中的所有類產生影響,而對其他的包不造成任何影響 .
(9)把相關的數據和行為集中放置。

設計者應當留意那些通過get之類操作從別的對象中獲取數據的對象。這種類型的行為暗示著這條經驗原則被違反了。

(10)把不相關的信息放在另一個類中(也即:互不溝通的行為)。

朝著穩定的方向進行依賴.

(11)確保你為之建模的抽象概念是類,而不只是對象扮演的角色。

(12)在水平方向上盡可能統一地分布系統功能,也即:按照設計,頂層類應當統一地共享工作。

(13)在你的系統中不要創建全能類/對象。對名字包含Driver、Manager、System、Susystem的類要特別多加小心。
規劃一個接口而不是實現一個接口。
(14)對公共接口中定義了大量訪問方法的類多加小心。大量訪問方法意味著相關數據和行為沒有集中存放。

(15)對包含太多互不溝通的行為的類多加小心。

這個問題的另一表現是在你的應用程序中的類的公有接口中創建了很多的get和set函數。

(16)在由同用戶界面交互的面向對象模型構成的應用程序中,模型不應該依賴于界面,界面則應當依賴于模型。

(17)盡可能地按照現實世界建模(我們常常為了遵守系統功能分布原則、避免全能類原則以及集中放置相關數據和行為的原則而違背這條原則) 。

(18)從你的設計中去除不需要的類。

一般來說,我們會把這個類降級成一個屬性。

(19)去除系統外的類。

系統外的類的特點是,抽象地看它們只往系統領域發送消息但并不接受系統領域內其他類發出的消息。

(20)不要把操作變成類。質疑任何名字是動詞或者派生自動詞的類,特別是只有一個有意義行為的類。考慮一下那個有意義的行為是否應當遷移到已經存在或者尚未發現的某個類中。

(21)我們在創建應用程序的分析模型時常常引入代理類。在設計階段,我們常會發現很多代理沒有用的,應當去除。

(22)盡量減少類的協作者的數量。
一個類用到的其他類的數目應當盡量少。
(23)盡量減少類和協作者之間傳遞的消息的數量。

(24)盡量減少類和協作者之間的協作量,也即:減少類和協作者之間傳遞的不同消息的數量。
(25)盡量減少類的扇出,也即:減少類定義的消息數和發送的消息數的乘積。

(26)如果類包含另一個類的對象,那么包含類應當給被包含的對象發送消息。也即:包含關系總是意味著使用關系。
(27)類中定義的大多數方法都應當在大多數時間里使用大多數數據成員。

(28)類包含的對象數目不應當超過開發者短期記憶的容量。這個數目常常是6。

當類包含多于6個數據成員時,可以把邏輯相關的數據成員劃分為一組,然后用一個新的包含類去包含這一組成員。
(29)讓系統功能在窄而深的繼承體系中垂直分布。

(30)在實現語義約束時,最好根據類定義來實現。這常常會導致類泛濫成災,在這種情況下,約束應當在類的行為中實現,通常是在構造函數中實現,但不是必須如此。

(31)在類的構造函數中實現語義約束時,把約束測試放在構造函數領域所允許的盡量深的包含層次中。

(32)約束所依賴的語義信息如果經常改變,那么最好放在一個集中式的第3方對象中。

(33)約束所依賴的語義信息如果很少改變,那么最好分布在約束所涉及的各個類中。

(34)類必須知道它包含什么,但是不能知道誰包含它。

(35)共享字面范圍(也就是被同一個類所包含)的對象相互之間不應當有使用關系。

(36)繼承只應被用來為特化層次結構建模。

(37)派生類必須知道基類,基類不應該知道關于它們的派生類的任何信息。

(38)基類中的所有數據都應當是私有的,不要使用保護數據。

類的設計者永遠都不應該把類的使用者不需要的東西放在公有接口中。
(39)在理論上,繼承層次體系應當深一點,越深越好。

(40)在實踐中,繼承層次體系的深度不應當超出一個普通人的短期記憶能力。一個廣為接受的深度值是6。

(41)所有的抽象類都應當是基類。

(42)所有的基類都應當是抽象類。

(43)把數據、行為和/或接口的共性盡可能地放到繼承層次體系的高端。

(44)如果兩個或更多個類共享公共數據(但沒有公共行為),那么應當把公共數據放在一個類中,每個共享這個數據的類都包含這個類。

(45)如果兩個或更多個類有共同的數據和行為(就是方法),那么這些類的每一個都應當從一個表示了這些數據和方法的公共基類繼承。

(46)如果兩個或更多個類共享公共接口(指的是消息,而不是方法),那么只有他們需要被多態地使用時,他們才應當從一個公共基類繼承。

(47)對對象類型的顯示的分情況分析一般是錯誤的。在大多數這樣的情況下,設計者應當使用多態。

(48)對屬性值的顯示的分情況分析常常是錯誤的。類應當解耦合成一個繼承層次結構,每個屬性值都被變換成一個派生類。

(49)不要通過繼承關系來為類的動態語義建模。試圖用靜態語義關系來為動態語義建模會導致在運行時切換類型。

(50)不要把類的對象變成派生類。對任何只有一個實例的派生類都要多加小心。

(51)如果你覺得需要在運行時刻創建新的類,那么退后一步以認清你要創建的是對象。現在,把這些對象概括成一個類。

(52)在派生類中用空方法(也就是什么也不做的方法)來覆寫基類中的方法應當是非法的。

(53)不要把可選包含同對繼承的需要相混淆。把可選包含建模成繼承會帶來泛濫成災的類。

(54)在創建繼承層次時,試著創建可復用的框架,而不是可復用的組件。

(55)如果你在設計中使用了多重繼承,先假設你犯了錯誤。如果沒犯錯誤,你需要設法證明。

(56)只要在面向對象設計中用到了繼承,問自己兩個問題:(1)派生類是否是它繼承的那個東西的一個特殊類型?(2)基類是不是派生類的一部分?

(57)如果你在一個面向對象設計中發現了多重繼承關系,確保沒有哪個基類實際上是另一個基類的派生類。

(58)在面向對象設計中如果你需要在包含關系和關聯關系間作出選擇,請選擇包含關系。
(59)不要把全局數據或全局函數用于類的對象的薄記工作。應當使用類變量或類方法。
(60)面向對象設計者不應當讓物理設計準則來破壞他們的邏輯設計。但是,在對邏輯設計作出決策的過程中我們經常用到物理設計準則。

(61)不要繞開公共接口去修改對象的狀態。

轉載于:https://www.cnblogs.com/lc329857895/archive/2007/12/07/986109.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

棧,遞歸

棧的基本操作注意&#xff1a;是從后往前連接的 1 #include <stdio.h>2 #include <Windows.h>3 typedef struct sStack4 {5 int num;6 struct sStack* pnext;7 }Stack;8 void push(Stack **pStack,int num);9 int pop(Stack **pStack); 10 BOOL isEmpty(St…

mysql集群多管理節點_項目進階 之 集群環境搭建(三)多管理節點MySQL集群

多管理節點MySQL的配置很easy&#xff0c;僅須要改動之前的博文中提高的三種節點的三個地方。1)改動管理節點配置打開管理節點C:\mysql\bin下的config.ini文件&#xff0c;將當中ndb_mgmd的相關配置改動為例如以下內容&#xff1a;[ndb_mgmd]# Management process options:# Ho…

leetcode 767. 重構字符串(貪心算法)

給定一個字符串S&#xff0c;檢查是否能重新排布其中的字母&#xff0c;使得兩相鄰的字符不同。 若可行&#xff0c;輸出任意可行的結果。若不可行&#xff0c;返回空字符串。 示例 1: 輸入: S “aab” 輸出: “aba” 代碼 class Solution {public String reorganizeStri…

APK偽加密

一、偽加密技術原理 我們知道android apk本質上是zip格式的壓縮包&#xff0c;我們將android應用程序的后綴.apk改為.zip就可以用解壓軟件輕松的將android應用程序解壓縮。在日常生活或者工作中&#xff0c;我們通常為了保護我們自己的文件在進行壓縮式都會進行加密處理。這樣的…

亂花漸欲迷人眼-杜絕設計的視噪

視噪&#xff0c;又稱視覺噪音。我們每天接受來自外界的大量信息&#xff0c;這些信息有將近70&#xff05;是通過視覺感知獲得的。視噪會干擾我們對信息的判斷&#xff0c;影響到產品的易用性和可用性&#xff0c;與用戶體驗的好壞息息相關。(克勞德香農圖演示了噪音如何影響信…

超詳細windows安裝mongo數據庫、注冊為服務并添加環境變量

1.官網下載zip安裝包 官網地址https://www.mongodb.com/download-center/community?jmpnav&#xff0c;現在windows系統一般都是64位的&#xff0c;選好版本、系統和包類型之后點擊download&#xff0c;mongodb-win32-x86_64-2008plus-ssl-4.0.10.zip。 2.解壓zip包&#xff0…

開源 數據倉庫_使用這些開源工具進行數據倉庫

開源 數據倉庫by Simon Spti西蒙斯派蒂(SimonSpti) 使用這些開源工具進行數據倉庫 (Use these open-source tools for Data Warehousing) These days, everyone talks about open-source software. However, this is still not common in the Data Warehousing (DWH) field. W…

.netcore mysql_.netcore基于mysql的codefirst

.netcore基于mysql的codefirst此文僅是對于netcore基于mysql的簡單的codefirst實現的簡單記錄。示例為客服系統消息模板的增刪改查實現第一步、創建實體項目&#xff0c;并在其中建立對應的實體類&#xff0c;以及數據庫訪問類須引入Pomelo.EntityFrameworkCore.MySql和Microso…

leetcode 34. 在排序數組中查找元素的第一個和最后一個位置(二分查找)

給定一個按照升序排列的整數數組 nums&#xff0c;和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。 進階&#xff1a; 你可以設計并實現時間復雜度為 O(log n) 的算法解決此問題嗎&#xff1…

CentOS6.7上使用FPM打包制作自己的rpm包

自定義rpm包&#xff0c;還是有逼格和實際生產環境的意義的。 (下面的文檔有的代碼由于博客排版的問題導致擠在了一起&#xff0c;需要自己判別&#xff09; 安裝FPM fpm是ruby寫的&#xff0c;因此系統環境需要ruby&#xff0c;且ruby版本號大于1.8.5。 # 安裝ruby模塊 yum -y…

漢堡菜單_開發人員在編寫漢堡菜單時犯的錯誤

漢堡菜單by Jared Tong湯杰(Jared Tong) 開發人員在編寫漢堡菜單時犯的錯誤 (The mistake developers make when coding a hamburger menu) What do The New York Times’ developers get wrong about the hamburger menu, and what do Disney’s and Wikipedia’s get right?…

android 漲潮動畫加載_Android附帶漲潮動畫效果的曲線報表繪制

寫在前面本文屬于部分原創&#xff0c;實現安卓平臺正弦曲線類報表繪制功能介紹&#xff0c;基于網絡已有的曲線報表繪制類(LineGraphicView)自己添加了漲潮的漸變動畫算法最終效果圖廢話少說&#xff0c;直接上源碼一、自定義View LineGraphicView&#xff0c;本類注釋不算多&…

使用css3屬性transition實現頁面滾動

<!DOCTYPE html> <html><head><meta http-equiv"Content-type" content"text/html; charsetutf-8" /><title>慕課七夕主題</title><script src"http://libs.baidu.com/jquery/1.9.1/jquery.min.js">&…

leetcode 321. 拼接最大數(單調棧)

給定長度分別為 m 和 n 的兩個數組&#xff0c;其元素由 0-9 構成&#xff0c;表示兩個自然數各位上的數字。現在從這兩個數組中選出 k (k < m n) 個數字拼接成一個新的數&#xff0c;要求從同一個數組中取出的數字保持其在原數組中的相對順序。 求滿足該條件的最大數。結…

Oracle Study之--Oracle等待事件(5)

Db file single write這個等待事件通常只發生在一種情況下&#xff0c;就是Oracle 更新數據文件頭信息時&#xff08;比如發生Checkpoint&#xff09;。當這個等待事件很明顯時&#xff0c;需要考慮是不是數據庫中的數據文件數量太大&#xff0c;導致Oracle 需要花較長的時間來…

兩臺centos之間免密傳輸 scp

兩臺linux服務器之間免密scp&#xff0c;在A機器上向B遠程拷貝文件 操作步驟&#xff1a;1、在A機器上&#xff0c;執行ssh-keygen -t rsa&#xff0c;一路按Enter&#xff0c;不需要輸入任何內容。&#xff08;如有提示是否覆蓋&#xff0c;可輸入y后按回車&#xff09;2、到/…

jsp導出數據時離開頁面_您應該在要離開的公司開始使用數據

jsp導出數據時離開頁面If you’re new in data science, “doing data science” likely sounds like a big deal to you. You might think that you need meticulously collected data, all the tools for data science and a flawless knowledge before you can claim that y…

分步表單如何實現 html_HTML表格入門的分步指南

分步表單如何實現 htmlby Abhishek Jakhar通過阿比舍克賈卡(Abhishek Jakhar) HTML表格入門的分步指南 (A step-by-step guide to getting started with HTML tables) 總覽 (Overview) The web is filled with information like football scores, cricket scores, lists of em…

laravel mysql pdo,更改Laravel中的基本PDO配置

My shared web host have some problems with query prepares and I want to enable PDOs emulated prepares, theres no option for this in the config\database.php.Is there any way I can do that in Laravel?解決方案You can add an "options" array to add o…

Java多線程-工具篇-BlockingQueue

Java多線程-工具篇-BlockingQueue 轉載 http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html 這也是我們在多線程環境下&#xff0c;為什么需要BlockingQueue的原因。作為BlockingQueue的使用者&#xff0c;我們再也不需要關心什么時候需要阻塞線程&#xff0c;什…