假設我們有一個返回我們的倉庫蘋果列表的功能:正確的方式來修改公共接口
List<Apple> getApples();
,我們已經發現了一個bug應用程序的某些生命週期後 - 在極少數情況下客戶此功能會導致中毒,因爲返回的一些蘋果尚未成熟。
然而,另一組客戶絕對不關心成熟度,他們只是用這個功能來了解所有可用的蘋果。
解決這個問題的天真的方法是將'成熟'成員添加到蘋果,然後找到所有成熟度可能導致問題並進行檢查的地方。
const auto apples = getApples();
for (const auto& apple : apples)
if (apple.isRipe())
consume(apple)
然而,如果我們相關具有途中類接口通常被設計成熟的蘋果的這項新規定,我們可能會發現,我們需要新的接口,它是一個更通用的一個子集:
它基本上通過過濾那些不成熟的擴展getApples()接口。
所以問題是:
- 是這種思維正確的方式?
- 舊界面(getApples)應該保持不變嗎?
- 如果稍後我們發現某些顧客對紅/綠/黃蘋果(getRipeNonRedApples)過敏,它將如何處理縮放?
- 是否有任何其他替代方法來修改API?
但是有一個限制:我們如何最大限度地減少沒有經驗/不注意開發者調用getApples而不是getRipeApples的概率?使用RipeApple子類Apple?在getRipeApples中沮喪?
一個(更高級的)的變化到上述溶液中。將具有標準對象,而不是標誌。標準對象將包含需要應用於所需解決方案的所有過濾器。 – MaxZoom