這主要是一個函數式編程的問題,而不是一個藥劑的問題,但是因爲我在學習Elixir,如果有人能用這種語言回答它會很好。即使如此,如果有人想給出更一般的答案,它將不勝感激。藥劑 - 改變行爲
我自己是一個OO程序員,我無法圍繞如何根據配置文件(例如)更改組件的行爲。
例如: 我有一個從數據庫加載/保存用戶的應用程序。在生產環境中,我希望保存和檢索MongoDB數據庫中的用戶,而在開發和測試中我想使用內存映射。如果我使用面向對象編程語言編寫給定的系統(比如說Java),我只需要創建一個名爲「UserRepository」的Interface,其中包含2個實現:「MemoryUserRepository」和「MongoDBUserRepository」。然後,我會在啓動時及其之後實例化基於配置文件的相應Repository(或對其進行硬編碼,無所謂),所有與Repository交互的對象將永遠不會知道它的實現(它們將使用存儲庫,但永遠不會在意它是在內存還是在mongo)。 這給了我創建儘可能多的實現的能力,並且我需要做的改變系統行爲的唯一事情是實例化我想要使用的實現。
我想要相同的行爲,但在Elixir(讓我們使用相同的例子)。既然它不是面向對象的語言,我不能使用上面的方法。顯然我希望它是可擴展的(我可以很容易地傳遞一個字符串與我想要在每次調用中使用的存儲庫類型,並使用模式匹配來確定要使用的行爲,但這並不能很好地擴展,因爲每當我想要添加一個實現,我將不得不在每一段代碼中查找我匹配類型的模式並添加新的實現)。什麼是實現這一目標的最佳方法?
提前致謝!
一個修正。 OO和功能不相互正交。真正的Elixir沒有課程,但這並不意味着它不能。 –