[Mono-osx] mobj discussion

Jesse Jones jesjones at mindspring.com
Tue May 19 19:48:17 EDT 2009

On May 19, 2009, at 10:48 AM, Miguel de Icaza wrote:

> Hello,
>   [ I changed the subject line to make it easier to spot the threads ]
>> * Objective-C method names are really weird and don't map well  
>> to .NET
>> naming conventions. For example, the objective-c method
>> observeValueForKeyPath:ofObject:change:context: is mapped to
>> ObserveValueForKeyPathOfObjectChangeContext in Monobj which is a
>> really confusing name to read. I originally did the same in mcocoa  
>> but
>> I wound up changing them to
>> observeValueForKeyPath_ofObject_change_context which is much easier  
>> to
>> read.
> The MonObjc version is closer to the .NET design guidelines.
> But when it comes to naming of methods, they are both terrible  
> options.

Yes, neither one is a good option, but I think it is a lot better for  
the wrapper classes to preserve the real method names in so far as  
possible instead of trying to torture them into fitting the .NET  
> In MonObjc it seems that the source is that this is auto-generated  
> code,
> is the code also autogenerated in mcocoa?

There's a little bit of hand-written code in mcocoa for stuff  
like .NET-style enumeration support in the collections or BeginInvoke  
in NSApplication, but pretty much all of it is autogenerated.
> It seems to me that these APIs need to be thought out in terms of what
> they do and expose the proper name and pattern, something that follows
> the Framework Design Guidelines.
> For example, after reading the docs for it seems like this should be
> exposed as an event with a signature like this:
> 	public ValueChangedEventArgs : EventArgs {
> 		public string KeyPath { get; }
> 		public object ChangedObject { get; }
> 		public Hashtable Changes { get; }
> 	}
> 	delegate void Change (object sender, ValueChangedEventArgs vc)
> So code that consumes this would then do:
> 	class.Changed += delegate (s, args){
> 		Console.WriteLine ("Change at {0}", args.KeyPath);
> 	}

That's a difficult question. There's clearly value in providing a  
limited number of alternatives like enumeration via IEnumerable in  
addition to the normal cocoa mechanisms, but flat-out hiding cocoa  
functionality behind a .NET style wrapper seems wrong to me. It's a  
lot simpler if the managed code is simply a bridge into cocoa so you  
can continue to use apple's documentation and examples without  
worrying about how they map onto your semi-cocoa wrapper.
>> This also allows for a nice separation between methods which wrap
>> cocoa and those added by the bridge (which can use the standard .NET
>> naming conventions). In addition it allows mobj to automatically
>> register methods with the objective-c runtime so you don't have to
>> litter your code with
>> [ObjectiveCMessage 
>> ("observeValueForKeyPath:ofObject:change:context:")]
>> like you have to do in Monobj.
> I appreciate this direction: exposing the full API, and then providing
> wrappers, but I am not sure that it is a good idea to expose the
> low-level API.

Maybe I wasn't clear. I was making two points there:

1) Using names_like_this allows them to be automatically registered  
with the objective-c runtime so you don't need to force this with an  
attribute as you do in Monobj.

2) If the Cocoa wrapper methods are_named_like_this and methods added  
by the managed framework are named BeginInvoke then it is crystal  
clear which is which and where people need to look for documentation.

   -- Jesse

More information about the Mono-osx mailing list