
1. 復合型別
1.1. 乘積型別
1.2. 組合一個或多個型別將得到一個新型別,其值為組成型別的全部可能的組合
1.3. 元組
1.3.1. 一組型別構成,通過它們在元組中的位置可以訪問這些組成型別
1.3.2. 一種特殊的分組資料的方式,允許我們將不同型別的多個值作為一個值進行傳遞
1.3.3. 使用out引數,也就是由函式來更新實參,但這會讓代碼更難理解
1.3.4. 按照分量值的位置來訪問值
1.3.5. 可以行內宣告它們
1.3.6. 自制元組
1.4. 記錄型別
1.4.1. 記錄或者結構
1.4.2. 與元組型別相似,可將其他型別組合在一起
1.4.3. 為分量設定名稱,并通過名稱來訪問值
1.4.3.1. 發生歧義的可能性較低
1.4.4. 最好定義帶命名分量的記錄,而不是傳遞元組
1.4.5. 提供一個單獨的定義
1.4.5.1. 為變數提供了額外的意義
1.5. 不變數
1.5.1. 確保值的格式正確的規則
1.5.2. 一組規則規定了什么樣的記錄是格式正確的記錄,則應該使用私有變數,并使用方法來更新這些變數,以確保規則得到實施
1.5.3. 使成員不可變
1.5.3.1. 初始化時能夠確保記錄是格式正確的,然后可以允許外部代碼直接訪問成員,因為外部代碼不能修改它們
1.5.3.2. 不需要使用函式讓它們保證不變數
1.5.3.3. 成員只有在構造時才會設定一次
1.5.3.4. 在不同的執行緒中并發訪問這些資料是安全的,因為資料不會改變
1.5.3.5. 缺點:每當需要一個新值時,就需要創建一個新實體
1.5.4. 成員宣告為私有,使所有訪問都通過方法進行
1.5.5. 使成員不可變,并在建構式中應用驗證
2. 多選一
2.1. 結果型別的值是一個或多個成員型別的值集合中的某一個
2.2. 列舉
2.2.1. 示例:一周中的第一天
2.2.1.1. 周日
2.2.1.1.1. 美國
2.2.1.1.2. 加拿大
2.2.1.1.3. 日本
2.2.1.2. 周一
2.2.1.2.1. ISO 8601標準
2.2.1.2.2. 大多數歐洲國家
2.2.1.3. 宣告一組常量值來代表一周中的各天
2.2.1.3.1. 不知道在某個模塊中定義了這些常量
2.2.1.3.2. 可能自行解釋這個數字
2.2.1.3.3. 采用列舉
2.3. 可選型別
2.3.1. 和型別
2.3.2. 另一個型別T的可選值
2.3.2.1. 型別T的一個值(任意值)
2.3.2.1.1. 其基本型別的值
2.3.2.2. 一個特殊值來指出不存在型別T的值
2.3.2.2.1. 不包含值
2.3.2.3. 可選型別與其基本型別不兼容
2.3.3. 自制可選型別
2.3.3.1. 封裝了作為泛型實參提供的另一個型別
2.3.3.2. hasValue()方法告訴我們是否有一個實際值
2.3.3.3. getValue()回傳該值
2.3.4. 用處
2.3.4.1. 大部分語言中,允許參考型別為null,來編碼“沒有可用值”的情形
2.3.4.1.1. 使用null容易出錯
2.3.4.1.2. 很難判斷一個變數什么時候可以為空
2.3.4.1.3. 什么時候不可以為空
2.3.4.1.4. 不要讓null(即沒有值)自身成為某個型別的一個有效的值
2.3.4.2. 將null與允許值的范圍拆分開
2.3.4.3. 看到一個可選型別,就會知道它可以不包含值
2.3.4.4. 該變數不會為null
2.4. 結果或錯誤
2.4.1. 不用結果和錯誤
2.4.2. 反模式
2.4.2.1. 同時回傳DayOfWeek和一個錯誤碼
2.4.3. 自制Either型別
2.4.3.1. 和型別
2.4.3.2. TLeft
2.4.3.2.1. 存盤錯誤型別
2.4.3.3. TRight
2.4.3.3.1. 存盤有效值型別
2.4.3.4. 沒有型別運算子|的語言
2.4.3.4.1. JAVA
2.4.3.4.2. C#
2.4.3.4.3. 自制
2.4.3.4.3.1. 使該值成為一個公有型別
2.4.3.4.3.2. getLeft()和getRight()方法負責轉換回TLeft和TRight型別
2.4.3.5. 不能使用例外
2.4.3.5.1. 優先選擇使用Either型別
2.4.4. 例外
2.4.4.1. 不能使用例外情況
2.4.4.1.1. 不能或者不希望拋出例外
2.4.4.1.2. 在行程間或執行緒間傳播錯誤時
2.4.4.1.3. 當錯誤本身算不上例外時
2.4.4.1.3.1. 通常發生在處理用戶輸入的時候
2.4.4.1.4. 當呼叫作業系統的API,而這些API使用錯誤碼時
2.4.4.1.5. 優先選擇使用Either型別
2.5. 變體型別
2.5.1. 標簽聯合型別
2.5.2. 包含任意數量的基本型別的值
2.5.2.1. 使我們能夠表示一個閉合型別集合的值
2.5.3. 標簽指的是即使基本型別有重合的值,我們仍然能夠準確說明該值來自哪個型別
2.5.4. 不要求這些型別之間存在任何關系
2.5.4.1. 不需要公共介面或基礎型別
2.5.5. 自制變體
3. 代數資料型別
3.1. Algebraic Data Type,ADT
3.2. 乘積型別
3.2.1. 幾乎所有編程語言都提供了定義記錄型別的方式
3.2.2. 例子
3.2.2.1. 元組型別
3.2.2.2. 記錄型別
3.3. 和型別
3.3.1. 相對少的主流語言為和型別提供了語法支持
3.3.2. 多個其他型別組合成為一個新型別,它存盤任何一個構成型別的值
3.3.3. 允許我們在一個變數中存盤來自不相關型別的值
3.3.4. 例子
3.3.4.1. 可選型別
3.3.4.1.1. Optional
3.3.4.2. 變體型別
3.3.4.2.1. Variant
3.3.4.3. Either
4. 訪問者模式
4.1. 在一個物件結構的元素上執行的操作
4.2. 允許在定義新操作時,不改變其操作的元素的類
4.3. 雙分派機制
4.3.1. 給定IDocumentItem,呼叫正確的accept()方法
4.3.2. 給定IVisitor實參,執行正確的操作
4.3.3. 經典實作
4.3.4. 把職責(如螢屏渲染和閱讀)拆分到單獨的組件(訪問者)
4.3.5. 并把職責從檔案項中抽象出來
4.4. 面向物件實作需要使用一個公共基類或介面
4.4.1. 擴展性不太好
4.4.2. 不同地方混搭不同的型別
4.4.2.1. 會有大量無法重用的介面或基類
4.5. 正確函式應用到變體的訪問者函式
4.5.1. 更好地進行職責劃分的一種訪問者模式實作
4.5.2. 變體和訪問者是泛型型別,可以在不同的問題域中重用
4.5.3. 訪問者只負責處理
4.5.4. 檔案項只負責存盤域資料
4.5.5. 型別之間并沒有關系
4.5.6. 不是經典的OOP實作
4.5.6.1. 優勢:域物件與訪問者完全分離開
4.5.7. 和型別
4.5.7.1. 提供了一種簡單、干凈的方式
4.6. 將易錯代碼封裝到一個可重用的組件中
4.6.1. 這是降低風險的一種好方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/541628.html
標籤:其他
