Homework
這份作業主要由國立臺北科技大學 109 資工系黃漢軒所命題,若有任何的問題,非常歡迎使用以下的聯絡方式提問:
Email: t109590031@ntut.org.tw/MS Teams: 黃漢軒/Telegram: @xuan910625
⚠️ Due: 2023 / 12 / 19 11:59 p.m. ⚠️
這份作業主要希望你能夠熟悉以下的事項,以利於跟進未來課程的發展:
請清掉前一次的作業,確認提交是否符合以下的檔案架構,否則無法進行評分。
在這個任務中,你將嘗試描述郵件管理系統(Mail Management System)。
我們在臺灣的郵件主要可以分成:普通郵件、普通掛號、限時掛號。
對於這些郵件,我們除了知道他是郵件之外,我們也知道:
並且,對於掛號信來說,我們得要確保信件能夠交付到收件人的手上,我們需有一個確保交付的 Function 來讓掛號信實作。
在這個作業,你必須要嘗試使用組合與介面來完成一個郵件管理系統(Mail Management System)。
這個郵件管理系統可以以堆疊的方式放入郵件,晚放入的郵件會優先 POST
,早放入的郵件會較晚 POST
。
不用擔心!你可以假設郵差有無限的時間可以處理所有的郵件,不會有郵件被餓死(Starved)的情況。
這個郵件系統將信件分類成普通郵件與需要確保能夠送達至收件人手上的郵件(也稱作掛號郵件):
當限時掛號逾期(也就是本來應該在 2023-12-31
送達,但郵差在 2024-01-03
送達)時,你應該拋出例外。
這些任務當然可以使用繼承來完成,但使用組合與介面能夠讓你瞭解這玩意兒的使用方式,嘗試看看吧!
在這個任務中,我們已經幫你完成了一個介面
IDeliverable
、兩個類別MailInfo
與DeliveryResult
。
OrdinaryMail
、PromptDeliveryMail
與 RegisteredMail
OrdinaryMail
MailInfo mailInfo
OrdinaryMail(MailInfo mailInfo)
用於使用 Dependency Injection 來初始化 mailInfo
。MailInfo GetMailInfo()
用於取得 MailInfo
。mailInfo
中的郵件編號 mailId
為空。RegisteredMail
MailInfo mailInfo
。RegisteredMail(MailInfo mailInfo)
用於使用 Dependency Injection 來初始化 mailInfo
。MailInfo GetMailInfo()
用於取得 MailInfo
。PromptDeliveryMail
MailInfo mailInfo
。PromptDeliveryMail(MailInfo mailInfo, std::string promptDeliveryDate)
mailInfo
。promptDeliveryDate
為限時的日期。MailInfo GetMailInfo()
用於取得 MailInfo
。PromptDeliveryMail
與 RegisteredMail
具有 Delivery
函式PromptDeliveryMail
與 RegisteredMail
實作 IDeliverable
介面。PromptDeliveryMail
應實作 IDeliverable
中的 virtual DeliveryResult Delivery(std::string date) = 0;
。
date
。promptDeliveryDate
,你應該要拋出 std::invalid_argument
例外。DeliveryResult
物件,包含郵件資訊 mailInfo
與送達日期 deliveryDate
。RegisteredMail
應實作 IDeliverable
中的 virtual DeliveryResult Delivery(std::string date) = 0;
。
DeliveryResult
物件,包含郵件資訊 mailInfo
與送達日期 deliveryDate
。MailSystem
std::vector<OrdinaryMail> ordinaryMailStorage
用於儲存普通信件的 vector
。std::vector<std::shared_ptr<IDeliverable>> deliverableMailStorage
用於儲存掛號信件的 vector
。void AddOrdinaryMail(OrdinaryMail mail)
用於新增普通郵件至 ordinaryMailStorage
的尾端。void AddDeliverableMail(std::shared_ptr<IDeliverable> deliverableMail)
用於新增掛號郵件至 deliverableMailStorage
的尾端。void PostOrdinaryMail()
ordinaryMailStorage
的尾端 pop
掉(你可以使用 vector
中的 pop_back()
)DeliveryResult PostDeliverableMail(std::string date)
Delivery
函數。deliverableMailStorage
的尾端 pop
掉(你可以使用 vector
中的 pop_back()
)DeliveryResult
並回傳。std::invalid_argument
例外。size_t GetOrdinaryMailSize()
以取得目前用於儲存普通信件的 Stack
有多少封信。size_t GetDeliverableMailSize()
以取得目前用於儲存掛號信件的 Stack
有多少封信。std::invalid_argument
的資料nullptr
,這個特殊的指標可用於指向不存在的東西。ASSERT_EQ
來測試不會有精度誤差的值(例如:整數、字串等)ASSERT_NEAR
來測試具有精度的值ASSERT_THROW
來測試該函數會不會拋出例外ASSERT_FALSE
來測試該值是否為 false
bin
資料夾至專案上。
/bin
資料夾至專案庫,編譯結果不應該上傳至專案庫上,若在助教確認功課評分時 /bin
資料夾存在在專案庫中,扣除作業總分 5 分。debugger
工具來進行除錯,有利於尋找漏洞與理解漏洞為何會發生。