我無法告訴您如何解決您的具體問題,因此我會與您分享一些提示,這些提示可能有助於您開始尋找實際適用於您的設計。
考慮配置對象的層次結構:
ConfigurationSettings
ApplicationSettings
UserSettings
DisplaySettings
...
抽象類ConfigurationSettings
提供基本服務,以讀取屬於任何特定的部分 /寫設置。該層次允許更簡單的命名約定,因爲選擇器可以在不同的子類中重新實現。
的ApplicationSettings
子類起到不同的作用:它註冊的所有部分在其registry
實例變量,一個Dictionary
,其中鍵是部分的名稱和值對應的子類實例:
ApplicationSettings current register: anEmailSettings under: `Email`
抽象類提供讀寫設置的基本服務:
settingsFor: section
settingAt: key for: section
settingAt: key for: section put: value
子類使用這些服務來訪問各個設置並實現所需的邏輯客戶端測試當前的配置是否爲is
,has
,supports
等,特定功能或組合。這些更具體的方法是根據更基本的settingAt:for:
來實施的。
當一個新的包註冊其自己的子類如下的測試方法可用:
self <section>Settings isThisButNotThat
,其中例如,
emailSettings
^(ApplicationSettings current for: 'Email') isThisButNotThat
,同樣用於其他任何部分。正如我上面提到的,子類中的分區將允許您更簡單的選擇器隱式引用該部分(#isThisButNotThat
而不是#isEmailThisButNotThat
)。
另外一個功能,重要的是要支持應用/取消對話框,爲用戶修改設置是通過兩種方法提供:
ConfigurationSettings >> #readFrom:
和
ConfigurationSettings >> #writeOn:
所以,當你打開GUI顯示的設置你不打開它在當前的實例,但在它們的副本上
settings := ApplicationSettings new readFrom: ApplicationSettings current.
然後在GUI中將此副本呈現給用戶。如果用戶取消對話框,您只需忘記該副本。否則,你將更改應用這種方式:
settings writeOn: ApplicationSettings current
這兩種服務的實施遵循一個簡單的模式:
ApplicationSettings >> readFrom: anApplicationSettings
registry keysAndValuesDo: [:area :settings | | section |
section := anApplicationSettings for: area.
settings readFrom: section]
和
ApplicationSettings >> writeOn: anApplicationSettings
registry keysAndValuesDo: [:area :settings | | settings |
section := anApplicationSettings for: area.
settings writeOn: section]
您是否允許更改軟件包名稱?也就是說,你是否允許只有n個包都定義了包含('myPackageWithX'),然後將這些包與你的配置相匹配? –
from myPackageWithXwithoutY and myPackageWithXwithY我可以創建一個名爲myPackageWithX的「父」包,並刪除一些重複內容,但我無法刪除所有子包內容,除非我使用if語句或父類中的某個內容。 – Rivenfall