특정 문제를 해결하는 방법을 알려줄 수는 없으므로 실제로 사용할 디자인을 찾는 데 도움이되는 몇 가지 힌트를 알려 드리겠습니다. ConfigurationSettings
는 특정 섹션에 속하는/쓰기 설정을 읽을 기본적인 서비스를 제공
ConfigurationSettings
ApplicationSettings
UserSettings
DisplaySettings
...
추상 클래스 :
는 구성 개체의 계층 구조를 생각해 보자. 계층 구조를 사용하면 선택기를 다른 하위 클래스에서 다시 구현할 수 있으므로 명명 규칙이 단순 해집니다.
ApplicationSettings
서브 클래스는 다른 역할을한다 : 그것의 registry
인스턴스 변수에 모든 섹션을 등록하는 키가 섹션 이름과 값을 해당 서브 클래스의 인스턴스 Dictionary
:
이
ApplicationSettings current register: anEmailSettings under: `Email`
추상 클래스가 제공하는이 읽기 및 쓰기 설정을위한 기본 서비스 :
하위 클래스는이 서비스를 사용하여 개별 설정에 액세스하고 클라이언트가 현재 구성 is
, has
, supports
등의 특정 기능 또는 조합 여부를 테스트합니다. 이러한보다 구체적인 방법은보다 기본적인 (settingAt:for:
) 측면에서 구현됩니다.새 패키지는 자신의 서브 클래스를 등록 할 때 다음과 같이
는 시험 방법을 사용할 수있게 :
self <section>Settings isThisButNotThat
경우, 예를 들어,
emailSettings
^(ApplicationSettings current for: 'Email') isThisButNotThat
유사하게 다른 섹션
. 위에서 언급했듯이 하위 클래스의 구분을 사용하면 암시 적으로
#isEmailThisButNotThat
대신
#isThisButNotThat
섹션을 참조하는 간단한 선택기를 사용할 수 있습니다.
두 가지 방법에 의해 제공되는 설정을 수정할 수있는 사용자에 대한 대화 상자를 적용/취소 지원하는 것이 중요하다 또 다른 기능 : 당신이 GUI를 열 때,
ConfigurationSettings >> #readFrom:
하고 그래서
ConfigurationSettings >> #writeOn:
현재 인스턴스에서 사본을 열지 않은 설정을 표시합니다.
settings := ApplicationSettings new readFrom: ApplicationSettings current.
그런 다음 GUI에이 복사본을 사용자에게 제시합니다. 사용자가 대화 상자를 취소하면 사본을 잊어 버리게됩니다.
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]
가
패키지 이름을 변경할 수 있습니까? 즉, 모든 패키지에 포함 ('myPackageWithX')을 정의한 다음 n 개의 패키지를 혼합하여 구성에 맞게 혼합 할 수 있습니까? –
에서 myPackageWithXwithoutY 및 myPackageWithXwithY myPackageWithX라는 '부모'패키지를 만들고 일부 복제본을 제거 할 수 있지만 if 문이나 부모문에서 if 문을 사용하지 않으면 모든 하위 패키지 내용을 제거 할 수 없습니다. – Rivenfall