Folks,
I have started to use AppRegistry for a significantly sized project and found and stumbled across a few odditities which I'd like to see addressed.
Most importantly, AppRegistry typically does not provide a user with even a hint about the interface that's expected. If you look at MailSender you can see its interface but for most of the others this is not true. That's problematic since we cannot simply create a new kind of app but rather need to find the original and faithfully copy its interface. If the original's interface changes (such as just happened for MailSender) it breaks other apps (MAPIClient for example) without even so much as a hint that the expected interface for that app has changed.
Secondly, AppRegistry has an obnoxiuous habit of telling the user every time anyone asks that there are "no applications registered". It is possible to ask for the default without that but then the client needs to handle the default choice itself. Thus instead of
(WebBrowser default ifNil: [^self]) doSomething.
(resulting in the obnoxious "no webbrowsers registered") one would need to write:
(WebBrowser defaultOrNil == nil and:[WebBrowser registeredClasses isEmpty]) ifTrue:[^self]. WebBrowser default doSomething.
It seems to me that AppRegistry would be more useful if it weren't used at all with the above "AppRegistry default" pattern but rather by, e.g.,
AppRegistry doSomething.
(without the "default") This serves the following purposes:
a) We are required to state the expected protocol for the app so if anyone else wants to implement a new kind of app she knows what is expected.
b) An application can implement the action appropriately depending on what is specifically requested in one of the following ways:
- silently substitute a suitable default if possible, e.g.,
WebBrowser class>>openOn: url self default ifNil:[ ^(StringHolder new contents: url retrieveContents) openLabel: url asString. ]. self default openOn: url.
- Give the user information about the fact it is missing, e.g.,
WebBrowser class>>openOn: url self default ifNil:[^self inform: 'No WebBrowser present']. self default openOn: url.
- raise an error if the requested service is crucial
WebBrowser class>>openUn: url self default ifNil:[^self error: 'Where is the web browser']. self default openOn: url.
c) There is no reason for AppRegistry>>default to give any warning whatsoever. Client code can use "AppRegistry default" to bypass the error handling provided the specific application and therefore the user need not be bothered with all of these notifications.
I had the need for pretty much all of the above and would like to see AppRegistry fixed in the way described above.
Comments?
Cheers, - Andreas
squeak-dev@lists.squeakfoundation.org