當我看到你您這篇回覆的時候,要不是您使用語言是 Golang,我差點以為您是我的同事。
事實上,我正在做著您說的事情,而且恰巧也是在封裝 RabitMQ 的套件,只不過我用的語言是 Java。
其實您所說的案例,我認為其問題在於「封裝時並沒有考慮太多」;封裝,是一個很常見的技法,幾乎所有的設計模式都涉及封裝;但封裝,是需要「目的」以及明確的「職責」;而你文章中所說的,讓它變得更「好用」,充其量它只能算是「目的」,而沒有「職責」。
什麼意思呢?
我同樣以「RabbitMQ」作為例子來說明,假若,我們系統的 Email 是 MQ 來寄送,示意圖如下:
Backend -> MQ -> 郵件寄送系統(例如 BH)
在「RabbitMQ」的使用上,如果我們要把消息丟到指定的「Queue」中,我們就必須知道,我們要將消息丟到哪個「Exchange」以及其「Exchange」的模式,需不需要「Routing Key」,又或它是「Fanout」、「Headers」?
甚至是我們有多座的「郵件寄送系統」;如此,對於一個 CRUD,他想要發送一封電子郵件,他可能要就會需要清楚的知道整體包含「RabbitMQ」的架構,否則,它幾乎無法使用原生的「RabbitMQ Library」,是吧?
因此,若我們規劃一個 Servcie,提供一個 sendEmail(Params...) 方法,這時候,我們是不是可以很有限度的讓 CRUD 去使用。
但讓 CRUD 更容易的寄送 Email 只是目的,那職責呢?
事實上,它的職責就是寄送 Email 的這個業務,而他的「Actor」就是 CRUD 們;我們透過這層封裝,讓業務與機制解耦,讓 CRUD 可以在不知道 RabbitMQ 架構與機制的情況下,簡單根據自己需求寄送電子郵件。
在這個情況下,這個封裝就有意義,至於這個 EmailSendService 是否在未來是否用好,會不會設計不夠彈性,該挖空的參數寫死,這就與封裝本身無關,而是與封裝的品質有關。
封裝的過程中,能要注意解耦,譬如,讓最基本的,要面向切面,讓業務邏輯與機制邏輯分離,若該職責包含多個,那就需要將其分離,以組合代替聚合,注意介面隔離,注意方法層次。
其實如果您也對 Java 有所涉略,您可以參考一下 Spring Framework 也對 RabbitMQ 有一層封裝,它將 RabbitMQ 套上了 Template,可以試著想想看,它的目的跟職責是什麼。
很高興您的反饋,希望我的說明能對您有一些些幫助,若還是疑問,我很樂意能與您繼續討論。