
1. 避免基本型別偏執
1.1. 把值宣告為基本型別,并對其意義做一些隱含的假定時
1.1.1. 例如:使用number表示郵編
1.1.2. 例如:使用string表示電話號碼
1.2. 定義型別來顯式捕捉值的含義,從而避免錯誤解釋值
1.2.1. 新型別只是簡單地封裝了一個數字或字串
1.2.2. 消除由于不兼容的假定而導致的眾多問題
1.2.3. 使代碼的可讀性變得更好
2. 實施約束
2.1. 通過建構式實作
2.1.1. readonly,可以保證在構造之后,值會始終有效
2.1.2. 宣告為private,并通過一個getter來訪問,這樣就只能獲取該值,不能設定該值
2.1.3. 強制使值有效
2.1.4. 建構式不回傳值
2.1.4.1. 要么完成初始化
2.1.4.2. 要么拋出例外
2.1.5. 應該僅初始化物件的成員
2.2. 通過工廠實作
2.2.1. 場景
2.2.1.1. 不想拋出例外
2.2.1.2. 想回傳表示失敗的值
2.2.1.3. 建構式做不到
2.2.1.4. 構造和驗證物件的邏輯很復雜
2.2.1.4.1. 建構式不應該做太繁重的作業
2.3. 基本型別不允許我們直接施加某些限制
2.3.1. 創建新的型別
2.3.1.1. 封裝額外的約束
2.3.1.2. 保證不會包含無效的值
3. 添加型別資訊
3.1. 型別轉換
3.1.1. 一個運算式的型別轉換為另一個型別
3.1.2. 有些必須使用額外的代碼來完成
3.1.2.1. 顯式型別轉換
3.1.3. 有些能夠由編譯器自動完成
3.1.3.1. 隱式型別轉換
3.2. 在型別系統之外跟蹤型別
3.2.1. Eithe型別
3.2.1.1. 在賦值后,型別檢查器不再知道實際的value被存盤為TLeft還是TRight
3.2.1.2. 檢查this.isLeft()是否為true
3.2.1.3. getLeft()實作執行必要的檢查
3.2.1.4. 并按照需要處理無效呼叫
3.2.1.5. 把值強制轉換為對應的型別
3.2.1.5.1. 型別檢查器忘記了我們在賦值時提供的型別
3.2.1.5.2. 正確使用時,強制轉換是一種很強大的技術,允許我們改進值的型別
3.3. 常見型別轉換
3.3.1. 向上轉換
3.3.1.1. 將派生類解釋為基類
3.3.2. 向下轉換
3.3.2.1. 從父類轉換到派生類
3.3.2.2. 大多數強型別語言不會自動完成
3.3.2.3. 不是安全的
3.3.3. 拓寬轉換
3.3.3.1. 從固定位數的整數型別轉換為另外一個更多位數的整數型別
3.3.3.1.1. 如:8位無符號整數轉為16位無符號整數
3.3.3.2. 安全的
3.3.4. 縮窄轉換
3.3.4.1. 將位數更多的整數轉換為位數更少的整數
3.3.4.2. 具有危險性
3.4. 在運行時存盤額外的型別資訊
3.4.1. 包含一個is運算子
3.4.1.1. 檢查某個值是否是特定型別的實體
3.4.2. 其代價是為每個物件實體在記憶體中存盤額外的資料
3.5. 隱藏和恢復型別資訊
3.5.1. 同構集合
3.5.1.1. 包含相同型別的項的集合
3.5.1.2. 不需要隱藏型別資訊
3.5.2. 異構集合
3.5.2.1. 包含不同型別的項的集合
3.5.2.2. 需要隱藏一些型別資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/541774.html
標籤:其他
