我无法告诉您如何解决您的具体问题,因此我会与您分享一些提示,这些提示可能有助于您开始寻找实际适用于您的设计。
考虑配置对象的层次结构:
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