iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

Effective C++ 讀書筆記系列 第 26

[Day 26] Treat class design as type design

  • 分享至 

  • xImage
  •  

前言

今天的守則有點像是一個check list,列了各種設計class時應該要思考的問題,就來看看有哪些要注意的吧!

設計class前不得不自問的 11+1 大問題

今天的守則是:

Treat class design as type design

在物件導向的程式語言中,定義一個class就等於是定義一個new type,設計type要做的事情都要做:overload functions跟operators、控制memory的分配與釋放、初始化與完善物件...等等,所以設計一個好的class也跟設計一個好的type同具挑戰性。

好的type有哪些特性呢?自然的語法、直覺的語意、有效率的實作...等等。那要怎麼設計出有這些特性的class呢?首先必須先了解現在要解決的問題,才知道怎樣的設計才回符合使用場景需求。以下列了11+1大問題,在設計class時,把這些問題都好好想一遍吧!

  1. Q: 它的物件該如何被create跟destroy?
    • 這會影響 constructordestrcutor的設計,與memoryallocation與deallocation
  2. Q: 它的物件的initialzation與assignment該有何區別?
    • 這會影響 constructorassignment operator的設計區別。要注意這兩者不相等,因為使用的時機不同!
  3. Q: 它的物件被passed by value的話具有什麼意義?
    • copy constructor的定義決定pass-by-value的實作。
  4. Q: 它的value有限制嗎?
    • 通常一個class的member有它分別合理的值域,這就需要 error checking的機制來管控,包含在constructor、assignment operator、setter functions等的member function中設計。
  5. Q: 它有符合繼承家族的特性嗎?
    • 如果是從既有的class去繼承,要注意它原本有的限制與特性,包含是否 virtual與是否能被繼承,也要思考現在這個class是否需被繼承以及對應的設計。
  6. Q: 它應該可以轉換為那些type?
    • 是否要可以被 implicitly轉型?那就需要相應的operator。若僅想要 explicitly轉型,就需要寫出對應的轉型function。
  7. Q: 哪些operators跟functions對它而言是有意義的?
    • 這就決定要declare那些functions,是否是member functions。
  8. Q: 有哪些預設函式是要被禁止的嗎?
  9. Q: 誰應該有權限access member?
    • 這會決定members分別要是 pulic, protected or private or friends,以及是否應該要有 class裡面的class。
  10. Q: 它具有那些隱藏特性?
    • 它具有哪些效能限制、資源上的使用,這會影響你實作時應有哪些限制。
  11. Q: 它的用途多廣?
    • 如果他的泛用性超廣,說不定應該是定義一個 class template才對。
  12. Q: 你真的有需要它??
    • 最後一個大哉問!如果你發現你只是為既有的class加上一些額外功能,那說不定你只需要多定義一些 non-member functions就好了!

這些問題都不是那麼好回答,所以設計一個class沒有那麼簡單。但如果做的好,讓使用你的class跟使用一個built-in type一樣輕鬆寫意,一切就值得了。

總結

貼心重點提醒:

  • Class design is type design. Before defining a new type, be sure to consider all the issues discussed in this Item.

總而言之,你必須對待new class像對待new type,可以藉由思考以上11+1大問題來完善class的設計,設計出一個的類別~


上一篇
[Day 25] Make interfaces easy to use correctly and hard to use incorrectly (2)
下一篇
[Day 27] Prefer pass-by-reference-to-const to pass-by-value (1)
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言