<p><br>
27.07.2011 3:12 пользователь &quot;Christian Mollekopf&quot; &lt;<a href="mailto:chrigi_1@fastmail.fm">chrigi_1@fastmail.fm</a>&gt; написал:<br>
&gt;<br>
&gt; On Tue, 26 Jul 2011 20:57:46 +0200, Sebastian Trüg &lt;<a href="mailto:trueg@kde.org">trueg@kde.org</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; On 07/26/2011 05:06 PM, Christian Mollekopf wrote:<br>
&gt; &gt;&gt; On Tue, 26 Jul 2011 13:26:20 +0200, Sebastian Trüg &lt;<a href="mailto:trueg@kde.org">trueg@kde.org</a>&gt;<br>
&gt; &gt;&gt; wrote:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt; On 07/25/2011 09:43 PM, Christian Mollekopf wrote:<br>
&gt; &gt;&gt;&gt;&gt; On Mon, 25 Jul 2011 21:20:45 +0200, Sebastian Trüg &lt;<a href="mailto:trueg@kde.org">trueg@kde.org</a>&gt;<br>
&gt; &gt;&gt;&gt;&gt; wrote:<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; On 07/25/2011 07:52 PM, Christian Mollekopf wrote:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; On Mon, 25 Jul 2011 18:30:05 +0200, Sebastian Trüg &lt;<a href="mailto:trueg@kde.org">trueg@kde.org</a>&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Now that the SimpleResource rcgen is in git master[1] some people<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; used<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; it (mostly for Akonadi feeders and the web extractor framework) and<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; found it to be a bit strange.<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; This is true. Current usage is as follows:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; SimpleResource r;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; NCO::PersonContact(&amp;r).setFullname(&quot;foobar&quot;);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; The reason for this is simple: due to multi-inheritance problems I<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; cannot derive the generated classes from SimpleResource. Thus, we<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; need<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; wrappers.<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Now some ideas were floating around and I would like to settle on<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; one<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; better solution.<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; One idea would be to have a hybrid thing where you could do this:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   NCO::PersonContact pc;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   pc.setFullname(&quot;foobar&quot;);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   SimpleResource r = rc.resource();<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; and this:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   SimpleResource r;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   NCO::PersonContact pc(r);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   pc.setFullname(&quot;foobar&quot;);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   r = pc.resource();<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; (The last line would be required since all SimpleResources would be<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; copies.)<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; Why can&#39;t you just take the reference to r, and the last copy<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; wouldn&#39;t<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; be<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; needed?<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; Of course the accessor is still needed for the NCO::PersonContact<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; pc;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; usecase.<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; I cannot use refs for security reasons. Imagine someone returns a<br>
&gt; &gt;&gt;&gt;&gt;&gt; generated class from a method after putting in a ref to a local<br>
&gt; &gt;&gt;&gt;&gt;&gt; SimpleRes. Anyway, SimpleRes is implicitly shared.<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; Thats the same as with pointers, and it&#39;s c++ after all, developers<br>
&gt; &gt;&gt;&gt;&gt; have<br>
&gt; &gt;&gt;&gt;&gt; to think a bit.<br>
&gt; &gt;&gt;&gt;&gt; I just think that forgetting r = pc.resource() is more likely than<br>
&gt; &gt;&gt;&gt;&gt; returning a generated class<br>
&gt; &gt;&gt;&gt;&gt; containing a local reference, because that is a problem you should be<br>
&gt; &gt;&gt;&gt;&gt; used<br>
&gt; &gt;&gt;&gt;&gt; to as c++ developer<br>
&gt; &gt;&gt;&gt;&gt; (although a bit nasty I admit) and<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; SimpleResource r;<br>
&gt; &gt;&gt;&gt;&gt; NCO::PersonContact pc(r);<br>
&gt; &gt;&gt;&gt;&gt; pc.setFullname(&quot;foobar&quot;);<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; doesn&#39;t really look &quot;wrong&quot; at all (unless you have a close look at<br>
&gt; &gt;&gt;&gt;&gt; the<br>
&gt; &gt;&gt;&gt;&gt; header).<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; Actually I think this only looks quite correct to you since you have<br>
&gt; &gt;&gt;&gt; been using the old rcgen. If you look at pretty much all other Qt/KDE<br>
&gt; &gt;&gt;&gt; APIs you will see that this is a typical copy situation.<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Except if you think the class is a wrapper.<br>
&gt; &gt;&gt; The copying seems to me more java style.<br>
&gt; &gt;<br>
&gt; &gt; Well, the problem is that we want wrapping and a member SimpleResource...<br>
&gt; &gt;<br>
&gt; &gt;&gt;&gt; And I would really prefer not to use references. Aside from the<br>
&gt; &gt;&gt;&gt; unwritten policy in Qt and KDE code to not do it it is so very error<br>
&gt; &gt;&gt;&gt; prone since people tend to overlook the little &quot;&amp;&quot;. That is also why I<br>
&gt; &gt;&gt;&gt; chose to use a pointer in the original version. It forces one to add<br>
&gt; &gt;&gt;&gt; the<br>
&gt; &gt;&gt;&gt; &quot;&amp;&quot; ones self and, thus, think about what one it doing.<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Ok, my intuition is different, also before using the old rcgen.<br>
&gt; &gt;&gt; Also I happen to like references =)<br>
&gt; &gt;<br>
&gt; &gt; They are very powerful indeed.<br>
&gt; &gt;<br>
&gt; &gt;&gt; Further, just disable the copy constructor in the wrapper classes and<br>
&gt; &gt;&gt; all<br>
&gt; &gt;&gt; problems are gone (I reckon).<br>
&gt; &gt;<br>
&gt; &gt; We could do that but that would not solve the problem with the<br>
&gt; &gt; reference. We want to allow both<br>
&gt; &gt;   SimpleResource res;<br>
&gt; &gt;   Contact c(res);<br>
&gt; &gt; and<br>
&gt; &gt;   Contact c;<br>
&gt; &gt;   c.resource();<br>
&gt; &gt; That means that we have to store a pointer and convert the reference to<br>
&gt; &gt; a pointer (ugly!) since a reference member needs to be initialized in<br>
&gt; &gt; the constructor. Thus, the second case would mean to create a<br>
&gt; &gt; SimpleResource on the heap which leads to memory management trouble.<br>
What if instead of storing SimpleResource (or ref or pointer) store ptr to SimpleResource::Private( and make it less private, of course ) ? This way Contact c(r); will share with r it&#39;s privates, Contact c; will create new private and in all cases c.resource(); will detach a private and create a new SimpleResource with detached private copy?<br>

 &gt;<br>
&gt; Ok, you&#39;re right, I completely forgot about the second usecase =)<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; Cheers,<br>
&gt; &gt; Sebastian<br>
&gt; &gt;<br>
&gt; &gt;&gt;&gt;&gt; Anyways, no strong preference from my side.<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; So not get me wrong: I like the idea of making it fast. But I am also<br>
&gt; &gt;&gt;&gt; very concerned about usability of the API. I would rather have it be<br>
&gt; &gt;&gt;&gt; pretty than super-fast. And in the end the overhead of copying a few<br>
&gt; &gt;&gt;&gt; pointers or primitives is nothing compared to the actual calling of<br>
&gt; &gt;&gt;&gt; storeResources. ;)<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Agreed, it&#39;s not really a performance issue.<br>
&gt; &gt;&gt; I just don&#39;t like that last &quot;r = pc.resource();&quot;, which is imo<br>
&gt; &gt;&gt; unnecessary, error prone and<br>
&gt; &gt;&gt; feels to me like java (where you never modify the object itself but<br>
&gt; &gt;&gt; always<br>
&gt; &gt;&gt; get a copy back).<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Anyways, it&#39;s really just my personal opinion/preference, and I&#39;m fine<br>
&gt; &gt;&gt; with either way.<br>
&gt; &gt;&gt; Especially since you did a good job in providing a nice api so far =)<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Cheers,<br>
&gt; &gt;&gt; Christian<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt; Cheers,<br>
&gt; &gt;&gt;&gt; Sebastian<br>
&gt; &gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt; Cheers<br>
&gt; &gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; We could go on like so:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   r.addProperty(...);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   pc = r;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;   pc.setResource(r);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; The only disadvantage I see here might be a slight performance<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; overhead<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; due to the copying of the resources.<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Opinions?<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; Additionally it might be nice to have an accessor to the uri of the<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; SimpleResource directly in the wrapper,<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; and the &lt;&lt; operator for the graph.<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; So we would go from this:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    Nepomuk::SimpleResource iconRes;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    Nepomuk::NAO::FreeDesktopIcon icon(&amp;iconRes);<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    icon.setIconNames( QStringList() &lt;&lt; iconName );<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    graph &lt;&lt; iconRes;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(),<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; iconRes.uri() );<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; to this:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    Nepomuk::NAO::FreeDesktopIcon icon;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    icon.setIconNames( QStringList() &lt;&lt; iconName );<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    graph &lt;&lt; icon;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;    res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(),<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; icon.uri()<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; );<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; nice.<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt; Cheers<br>
&gt; &gt;&gt;&gt;&gt;&gt; Sebastian<br>
&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; Cheers,<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt; Christian<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Cheers,<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Sebastian<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; [1]<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; <a href="http://quickgit.kde.org/?p=kde-runtime.git&amp;a=blob&amp;h=304db56a9aff5523a5672415550c49d4b7269c3c&amp;hb=344806a2e378f3421399cad39a63f14a4428308b&amp;f=nepomuk/services/storage/lib/nepomuk-simpleresource-rcgen.py">http://quickgit.kde.org/?p=kde-runtime.git&amp;a=blob&amp;h=304db56a9aff5523a5672415550c49d4b7269c3c&amp;hb=344806a2e378f3421399cad39a63f14a4428308b&amp;f=nepomuk/services/storage/lib/nepomuk-simpleresource-rcgen.py</a><br>

&gt; &gt;&gt; _______________________________________________<br>
&gt; &gt;&gt; Nepomuk mailing list<br>
&gt; &gt;&gt; <a href="mailto:Nepomuk@kde.org">Nepomuk@kde.org</a><br>
&gt; &gt;&gt; <a href="https://mail.kde.org/mailman/listinfo/nepomuk">https://mail.kde.org/mailman/listinfo/nepomuk</a><br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; Nepomuk mailing list<br>
&gt; &gt; <a href="mailto:Nepomuk@kde.org">Nepomuk@kde.org</a><br>
&gt; &gt; <a href="https://mail.kde.org/mailman/listinfo/nepomuk">https://mail.kde.org/mailman/listinfo/nepomuk</a><br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Using Opera&#39;s revolutionary email client: <a href="http://www.opera.com/mail/">http://www.opera.com/mail/</a><br>
&gt; _______________________________________________<br>
&gt; Nepomuk mailing list<br>
&gt; <a href="mailto:Nepomuk@kde.org">Nepomuk@kde.org</a><br>
&gt; <a href="https://mail.kde.org/mailman/listinfo/nepomuk">https://mail.kde.org/mailman/listinfo/nepomuk</a><br>
</p>