[Development] QFileSystemWatcher and Recursive Monitoring

Andre Somers andre at familiesomers.nl
Sat Jul 28 17:17:40 CEST 2012


Op 28-7-2012 11:04, d3fault schreef:
>
> I've been thinking about it some more, and I think it would be a good 
> idea to add another optional bool to the opt-in custom interface 
> constructor.
>
Having (series of) bools in API's is usually a bad idea. See for 
instance this blog posting: 
http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html
>
> So it now would be:
> QFileSystemWatcher(IQFileSystemWatcherSpecialCoarseToFineGrainedNotificationsFigureOuter 
> *userCustomSnapshotComparisonCode, bool 
> alwaysUseCustomFigureOuterEvenIfPlatformDoesntNeedIt = false, QObject 
> *parent = 0);
>
> The reason for the additional bool is that we cannot predict what 
> criteria a _user_ will use to determine a file changed. They may 
> ignore certain changes that the native platform would emit, which will 
> lead to inconsistencies in their application on platforms with native 
> support vs. those without. The bool allows them to opt to take control 
> of every platform so there aren't any inconsistencies. It defaults to 
> false because most of the time the user will want to use the much more 
> efficient native platform notifications when available.
>
> We need a pretty beefy class description explaining all this.
>
That's exactly the problem.

In my view, these things should not be needed in the constructor at all. 
Instead, make the whole thing property based. That is: make the 
user-class that you plug into the QFileSystemWatcher something that you 
can just get and set. There are other examples of this in the Qt API, 
for instance in working with delegates in itemviews. By default, there 
will be a delegate set on an item view, but you can set your own if you 
want. The same goes for QItemSelectionModel: an instance is created by 
default, but you can just set another one if you want. The benefit is that:
1) it is all very explicit in the code. It is easy to understand what 
happens
2) it does not get in the way of those not using it
3) it allows initializing in any order that makes sense to the user

It would be nice if the system default object doing the work, if there 
is such a thing, would be available from the API and you could "get" it 
from the QFileSytemModel. That would make it possible to use the default 
implementation from the custom one.

So, instead of complicated constructors, I'd suggest some normal API 
methods instead:

//say, QAbstractFileSystemBuffer is the class (interface) that takes 
care of tracking the file system changes
void setFileSystemBuffer(QAbstractFileSystemBuffer* buffer); // 
QFileSystemModel takes ownership
QAbstractFileSystemBuffer* getFileSystemBuffer(); // simply returns a 
pointer to the object
QAbstractFileSystemBuffer* takeFileSystemBuffer(); // releases ownership 
of the object

That makes this possible:
QFileSystemWatcher* watcher = new QFileSystemWatcher(this);
// MyFileSystemBuffer can use the standard implementation to do much of 
the work...
MyFileSystemBuffer* buffer = new 
MyFileSystemBuffer(watcher->takeFileSystemBuffer());
watcher->setFileSystemBuffer(buffer); //watcher takes ownership of the 
buffer


André












More information about the Development mailing list