[Nepomuk] Re: SimpleResource rcgen redesign draft
Christian Mollekopf
chrigi_1 at fastmail.fm
Tue Jul 26 17:06:08 CEST 2011
On Tue, 26 Jul 2011 13:26:20 +0200, Sebastian Trüg <trueg at kde.org> wrote:
> On 07/25/2011 09:43 PM, Christian Mollekopf wrote:
>> On Mon, 25 Jul 2011 21:20:45 +0200, Sebastian Trüg <trueg at kde.org>
>> wrote:
>>
>>> On 07/25/2011 07:52 PM, Christian Mollekopf wrote:
>>>> On Mon, 25 Jul 2011 18:30:05 +0200, Sebastian Trüg <trueg at kde.org>
>>>> wrote:
>>>>
>>>>> Now that the SimpleResource rcgen is in git master[1] some people
>>>>> used
>>>>> it (mostly for Akonadi feeders and the web extractor framework) and
>>>>> found it to be a bit strange.
>>>>>
>>>>> This is true. Current usage is as follows:
>>>>>
>>>>> SimpleResource r;
>>>>> NCO::PersonContact(&r).setFullname("foobar");
>>>>>
>>>>> The reason for this is simple: due to multi-inheritance problems I
>>>>> cannot derive the generated classes from SimpleResource. Thus, we
>>>>> need
>>>>> wrappers.
>>>>>
>>>>> Now some ideas were floating around and I would like to settle on one
>>>>> better solution.
>>>>>
>>>>> One idea would be to have a hybrid thing where you could do this:
>>>>>
>>>>> NCO::PersonContact pc;
>>>>> pc.setFullname("foobar");
>>>>> SimpleResource r = rc.resource();
>>>>>
>>>>> and this:
>>>>>
>>>>> SimpleResource r;
>>>>> NCO::PersonContact pc(r);
>>>>> pc.setFullname("foobar");
>>>>> r = pc.resource();
>>>>>
>>>>> (The last line would be required since all SimpleResources would be
>>>>> copies.)
>>>>
>>>> Why can't you just take the reference to r, and the last copy wouldn't
>>>> be
>>>> needed?
>>>> Of course the accessor is still needed for the NCO::PersonContact pc;
>>>> usecase.
>>>
>>> I cannot use refs for security reasons. Imagine someone returns a
>>> generated class from a method after putting in a ref to a local
>>> SimpleRes. Anyway, SimpleRes is implicitly shared.
>>
>> Thats the same as with pointers, and it's c++ after all, developers have
>> to think a bit.
>> I just think that forgetting r = pc.resource() is more likely than
>> returning a generated class
>> containing a local reference, because that is a problem you should be
>> used
>> to as c++ developer
>> (although a bit nasty I admit) and
>>
>> SimpleResource r;
>> NCO::PersonContact pc(r);
>> pc.setFullname("foobar");
>>
>> doesn't really look "wrong" at all (unless you have a close look at the
>> header).
>
> Actually I think this only looks quite correct to you since you have
> been using the old rcgen. If you look at pretty much all other Qt/KDE
> APIs you will see that this is a typical copy situation.
>
Except if you think the class is a wrapper.
The copying seems to me more java style.
> And I would really prefer not to use references. Aside from the
> unwritten policy in Qt and KDE code to not do it it is so very error
> prone since people tend to overlook the little "&". That is also why I
> chose to use a pointer in the original version. It forces one to add the
> "&" ones self and, thus, think about what one it doing.
>
Ok, my intuition is different, also before using the old rcgen.
Also I happen to like references =)
Further, just disable the copy constructor in the wrapper classes and all
problems are gone (I reckon).
>> Anyways, no strong preference from my side.
>
> So not get me wrong: I like the idea of making it fast. But I am also
> very concerned about usability of the API. I would rather have it be
> pretty than super-fast. And in the end the overhead of copying a few
> pointers or primitives is nothing compared to the actual calling of
> storeResources. ;)
Agreed, it's not really a performance issue.
I just don't like that last "r = pc.resource();", which is imo
unnecessary, error prone and
feels to me like java (where you never modify the object itself but always
get a copy back).
Anyways, it's really just my personal opinion/preference, and I'm fine
with either way.
Especially since you did a good job in providing a nice api so far =)
Cheers,
Christian
>
> Cheers,
> Sebastian
>
>> Cheers
>>
>>>
>>>>>
>>>>> We could go on like so:
>>>>>
>>>>> r.addProperty(...);
>>>>> pc = r;
>>>>> pc.setResource(r);
>>>>>
>>>>> The only disadvantage I see here might be a slight performance
>>>>> overhead
>>>>> due to the copying of the resources.
>>>>>
>>>>> Opinions?
>>>>
>>>> Additionally it might be nice to have an accessor to the uri of the
>>>> SimpleResource directly in the wrapper,
>>>> and the << operator for the graph.
>>>>
>>>> So we would go from this:
>>>>
>>>> Nepomuk::SimpleResource iconRes;
>>>> Nepomuk::NAO::FreeDesktopIcon icon(&iconRes);
>>>> icon.setIconNames( QStringList() << iconName );
>>>> graph << iconRes;
>>>> res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(),
>>>> iconRes.uri() );
>>>>
>>>> to this:
>>>>
>>>> Nepomuk::NAO::FreeDesktopIcon icon;
>>>> icon.setIconNames( QStringList() << iconName );
>>>> graph << icon;
>>>> res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(), icon.uri()
>>>> );
>>>
>>> nice.
>>>
>>> Cheers
>>> Sebastian
>>>
>>>> Cheers,
>>>>
>>>> Christian
>>>>
>>>>>
>>>>> Cheers,
>>>>> Sebastian
>>>>>
>>>>> [1]
>>>>> http://quickgit.kde.org/?p=kde-runtime.git&a=blob&h=304db56a9aff5523a5672415550c49d4b7269c3c&hb=344806a2e378f3421399cad39a63f14a4428308b&f=nepomuk/services/storage/lib/nepomuk-simpleresource-rcgen.py
More information about the Nepomuk
mailing list