[Development] Deprecation/removal model going into Qt 6

Mutz, Marc marc at kdab.com
Tue Jun 4 18:45:26 CEST 2019


Hi,

This is not meant to be a summary of the thread so far, but the 
definition of a possible solution space:

= The meaning of deprecation

I think of deprecation as a means to tell users that the designers of 
the deprecated API think that there is some deep flaw in the API that 
makes it harder to use correctly or easier to use incorrectly. Or 
lacking in any other desirable software quality realm, and yes that 
includes performance.

One important aspect of deprecation, IMO, is that the deprecated API 
will be less likely to be properly maintained. So, e.g. by deprecating 
QLinkedList, we tell the users that we do _not_ intend to make it 
feature-compatible with std::list, e.g. by adding splice(). Users may 
continue to use the class, but they will not enjoy the same progress 
that other Qt classes or std::list will exhibit.

I don't think, that, apart from the usual nay-sayers who don't want 
anything to change, but also don't contribute, there's much disagreement 
over how and what to _deprecate_.

= The deprecation life-cycle:

The question really is: if an API is deprecated, then what? We have, so 
far, removed deprecated APIs from the library, or moved it to a 
QtXSupport library, which later got removed, too. I think the most Angst 
comes from the removal part here.

Let me try to define the deprecated API lifecycle as follows (dare I 
call it 4D? :)

1. Deprecate the API in Qt vX.Y, add the new API (if any, some APIs many 
simply move down a storey into C++, like Q_FOREACH vs. ranged for-loops; 
sometimes, Qt will realise that it's not able to support some API any 
longer, like XMLPatterns, or, I'd say, Q*SharedDataPointer)

2. Delete all uses of the deprecated API from Qt itself

3. Disentangle the deprecated API from Qt. With this I mean that we take 
the steps necessary, at a point in time when we can, to make a Qt built 
sans deprecated APIs as BiC as possible with one that isn't stripped of 
deprecated APIs. The usual way to do this is to move the implementation 
inline into the header file and make it wrap the new API. The point in 
time traditionally was v(X+1).0, but see below.

4. Decommission the deprecated API. With this I mean either remove it, 
or spin it off into a library which is no longer maintained by the Qt 
Project. The hope being, that someone (TQC, KDAB, Kevin Kofler) picks up 
maintenance of said library. This can be done at the same time as (3), 
or later.


= Deprecation and BiC

All the above, except, possibly, the decommissioning stage, are SC. 
Disentanglement is, however, BiC. We have traditionally used new major 
versions as a flag day to do disentanglement, and it seems to some, and 
this is why Peppe started this thread, that the plan is for it to also 
be the flag day for decommissioning.

I think we could make the experience for our users a lot less painful if 
we allowed ourselves the liberty to break BC by disentangling deprecated 
API within major release cycles. I don't think anyone actually needs BC 
from 5.0 to 5.13, and for all intents and purposes, 5.13 is not BC with 
5.0, because, as attested in this thread, there are behaviour changes 
which make it unlikely that an application compiled against 5.0 runs 
without modifications against 5.13.

It seems to me to be a good compromise to disentangle deprecated API 
right after an LTS. Whether to keep BC-for-DPF (binary compatibility for 
deprecation-free programs, with apologies to Hans Boehm) across two or 
three LTS releases is another question. I'm tending towards three. But 
this would be BiC in the current process.

= Summary

We should come to a conclusion about the meaning of deprecation, the 
life-cycle of deprecated APIs (e.g. how maintained are they, from 
deprecation to decommissioning?), the time-spans between the four D's, 
and, as a corollary, the weakening of our BC guarantees to exclude 
deprecated API.

Personally, I have no problem with disentangling the API sooner, like 
vX.(Y+3)

Personally, I also have no problem with decommissioning the API later 
(like not drop stuff first deprecated in vX.Y before v(X+2).0), but this 
does not seem to be the plan atm.

But once an API has been identified as ... for want of a better word: 
bad, and a better alternative added, we should never hesitate to 
deprecate the old one.

Thanks,
Marc


More information about the Development mailing list