QML-using app developers: use private.* imports
Sebastian Kügler
sebas at kde.org
Thu Sep 26 00:47:37 UTC 2013
Hola,
On Thursday, September 26, 2013 02:23:31 Aleix Pol wrote:
> Reducing API to maintain is a good thing, at least for complexity sake. But
> of course there will be always the case where somebody needs (part of) the
> private API.
>
> The question would be then, why is it that there's some API that's only
> needed for internal usage? If it's needed internally, it will be most
> likely needed externally, at some point. The fact that you decide to label
> it as private makes frustrated developers.
>
> Either way, I have no idea of what we're talking about here. :D
It's not a question of usefulness, it's a question of maintainability. We
offer some basic functionality
If / when a private import is needed, there's a bunch of things to solve.
Dependencies, documentation and very important API stability. For public APIs,
we definitely want to offer API stability, but it doesn't make sense for
everything, so by making these imports private, we keep the flexibility to
develop them however we want, otherwise, we quickly end up with a huge bunch
of code that we need to maintain backwards compatibility for, just in case
someone else wants to use this, often highly specific, code. Also outside of
the C++ world, you don't want to install all apps' internal bits and pieces as
system-wide available libraries. We want to make it easy to extend QML apps,
plasmoids, etc. using C++, but without the costs of public libraries.
This isn't to say that these things will not ever be shared, if something
turns out to be very useful for more than one Plasmoid, for example, we can
still promote it to public API, with all the costs that incurs. They just need
to weigh up against the work we need to put into it, and someone actually has
to do the effort, bring it up to "library quality" and maintain it.
Another very important aspect is security. We eventually want to arrive in a
world, where QML apps can only use imports they are allowed to. You most
definitely don't want a random piece of QML to access models of your Akonadi
db, Nepomuk, do random file-system stuff, etc.. Using the new-in-Qt5.2
QUrlInterceptor in the scriptengine allows us to control what's accessed from
within the QML runtime. This is described in detail on
http://community.kde.org/Plasma/conditionalQMLImports and the result of design
done during Akademy / QtCS in Bilbao. Pretty cool stuff, actually. :)
Examples for private imports are Kickoff-internal models, sytemtray models and
items, KIO and mimetype tricks for showing icons on the desktop. Apply the
same idea to Kontact Touch's QML imports, to Telepathy's, etc. It all makes
sense!
Lastly, we are responsible for our APIs not becoming a random mess. This is
one measure to prevent that from happening. Focus and quality usually trumps
size.
Cheers,
--
sebas
http://www.kde.org | http://vizZzion.org | GPG Key ID: 9119 0EF9
More information about the Plasma-devel
mailing list