強型別設計實踐

2022-02-07 16:32:44 字數 1616 閱讀 7020

何為強型別?

所謂強型別,用簡單點的話說就是可以.出來的型別,比如book.name, book.price。那什麼又是.不出來的型別呢?自然是比較間接的型別了,比如集合、表等其他結構的型別,對於這種型別,我們只能通過其索引找出物件來,比如books[0]。也許到現在為止讀者還看不出來有什麼不妥的,但對於這種.不出來的型別來說,呼叫不直觀是第一,操作多且難懂是第二,所以在某些時候很有必要將其強型別化,尤其是(也應當是)在我們知道這些.不出來的型別所擁有的結構時。可能我這樣說讀者都聽不太明白,讓我們來舉個例子。

很典型的例子就是當我們使用datatable時,我們通過datatable來儲存對某一張資料表的資料,我們只用這個datatable來儲存這張資料表,那麼我肯定知道這個datatable的結構,那為什麼我不能.出來呢?比如customerrow1.customername?這樣呼叫不是很方便嗎?要比.不出來方便很多,而且編譯時就可知道這個強型別的公開結構,不會寫錯,同樣也可以將它當作乙個真正的型別來處理(比如傳遞到乙個專門處理它的方法),總之一句話來說就是它是可預知的,型別安全的。以下是強型別的優缺點:

優點:呼叫簡單明瞭。

可預知的,型別安全的。

可以提高**的可閱度,使**邏輯更清晰。

缺點:與結構繫結的很緊,一旦**的結構改變,強型別就需要變動。

優點就不說了,大家也都看的出它的優點,光評簡化呼叫與清晰邏輯我想大家就都會考慮它一下了。我要談的是它的缺點,如何繞開它的缺點將它真正使用起來呢?眾所周知,強型別就是為了將一已知結構變做乙個型別,但這個已知結構是可能隨著時間而變化的,我們如何來應對這個結構上的變化呢?

**生成器的救援

現在我們知道結構很有可能變化,那麼重新手寫一遍**是不實際的,既然如此,我們何不利用**生成器這個工具呢?利用**生成器,我們可以動態的生成強型別,每次結構變動後我們只需再重新生成一次就好了,不必手寫了,這樣就運用了強型別的優點,又克服了它的缺點,不是一舉兩得嗎?不過,等等,**生成器也並沒有那麼好用,**生成器的運用的確是好的思路,但因為應用**生成器,也就帶來了**生成器的缺點,那就是,生成後的任何改動都將會在重新生成時被抹掉。這點是非常殘酷的,很影響**生成器的效率而產生懷疑**生成器是否能夠真正提高效率?怎麼辦呢?有沒有什麼解決方法呢?作者的解決方法是基於作者自己的**生成器dcg的,我為dcg增加了這個變動保留的功能,具體大家可以看關於dcg版本1.4.1.1的文章。這樣我就可以從一定程度上,注意是一定程度上解決**生成器的問題了。另乙個根據具體情況可以使用的辦法是如果你的輸出是一種oop語言,那麼可以考慮應用設計模式中的結構模式(structural patterns)來使**生成器生成的部分永遠保持一樣,而具體方法的實現部分在**生成器的範圍之外,這樣就不怕每次改動會被**生成器給沖掉了。但我必須宣告,這並不是乙個很好的辦法,原因很簡單,這樣做會導致程式設計走向歪路,我個人建議oo設計要偏向於職責導向,而非問題導向。所以我還是建議使用dcg的變動保留功能,但決定權仍在大家的手中。

總結

強型別有許多獨特的優點,但是也有缺點,它的缺點我們可以通過**生成器來克服,而**生成器也有缺點,但某些**生成器提供了克服其相應缺點的功能值得考慮,例如dcg。所以作者覺得利用好的動態**生成器來生成強型別的確可以在設計中給予考慮,尤其是這種做法所帶來的價值和它的高效比!

強靜態型別

c 是一門靜態型別語言,在編譯時會作型別檢查。在大多數語言中,物件的型別限制了物件可以執行的操作。如果某種型別不支援某種操作,那麼這種型別的物件也就不能執行該操作。在c 中,操作是否合法是編譯時檢查的。當在編寫表示式時,編譯器檢查表示式中的物件是否按照該物件的型別定義的使用方式使用。如果不是的話,那...

強型別的DataSet

dataset大家都比較熟悉了,它就是我們所說的離線資料集。但是不能儲存大量的資料,我們可以使用強型別的dataset也可以使用弱型別的dataset.弱型別的dataset使用如下 dataset dataset new dataset 建立乙個dataset 取得連線字串 string conn...

C 強列舉型別

為了解決c c 中的enum型別的一系列缺點,比如 非強型別,允許隱式轉換為int型,占用儲存空間及符號性不確定。c 11引入了列舉類 又稱為 強列舉型別strong typed enum 語法格式 enum class 型別名 如 enum class people 這樣就成功的定義了乙個強型別的...