Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is there no static QDir::makepath()?

Tags:

qt

reasoning

qdir

I know, that to create a new path in Qt from a given absolute path, you use QDir::makepath() as dir.makepath(path), as it is suggested in this question. I do not have any trouble in using it and it works fine. My question is directed, as to why the developers would not provide a static function to call in a way like QDir::makepath("/Users/me/somepath/");. Needing to create a new QDir instance seems unnecessary to me.

I can only think of two possible reasons:

1. The developers were "lazy" or did not have time so they did not add one as it is not absolutely necessary.

2. The instance of QDir on which mkpath(path) is called, will be set to path as well, so it would be convenient for further usage - but I can not seem to find any hints that this is the actual behaviour within the docs.

I know I repeat myself, but again, I do not need help as of how to do it, but I am much interested as of why one has to do it that way. Thanks for any reason I might have missed.

like image 265
T3 H40 Avatar asked Oct 07 '15 18:10

T3 H40


1 Answers

Let's have a look at the code of said method:

bool QDir::mkdir(const QString &dirName) const
{
    const QDirPrivate* d = d_ptr.constData();

    if (dirName.isEmpty()) {
        qWarning("QDir::mkdir: Empty or null file name");
        return false;
    }

    QString fn = filePath(dirName);
    if (d->fileEngine.isNull())
        return QFileSystemEngine::createDirectory(QFileSystemEntry(fn), false);
    return d->fileEngine->mkdir(fn, false);
}

Source: http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n1381

As we can see, a static version would be simple to implement:

bool QDir::mkdir(const QString &dirName) const
{
    if (dirName.isEmpty()) {
        qWarning("QDir::mkdir: Empty or null file name");
        return false;
    }

    return QFileSystemEngine::createDirectory(QFileSystemEntry(dirName), false);
}

(see also http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n681)

First, the non-static method comes with a few advantages. Obviously there is something to using the object's existing file engine. But also, I would imagine the use-case of creating several directories under a specific directory (that the QDir already points to).

So why not provide both?

Verdict (tl/dr): I think the reason is simple code hygiene. When you use the API, the difference between QDir::makepath(path); and QDir().makepath(path); is slim. The performance hit of creating the object is also negligible, as you would reuse the same object if you happen to perform the operation more often. But on the side of the code maintainers, it is arguably much more convenient (less work and less error prone) to not maintain two versions of the same method.

like image 180
ypnos Avatar answered Oct 16 '22 03:10

ypnos