为什么没有static QDir::makepath()?
Why is there no static QDir::makepath()?
我知道,要从给定的绝对路径在 Qt 中创建新路径,您可以使用 QDir::makepath()
作为 dir.makepath(path)
,正如 this 问题中所建议的那样。我在使用它时没有遇到任何问题,而且效果很好。我的问题是直接的,关于 为什么 开发人员不会提供静态函数以像 QDir::makepath("/Users/me/somepath/");
这样的方式调用。需要创建一个新的 QDir
实例对我来说似乎没有必要。
我只能想到两个可能的原因:
1. 开发者 "lazy" 或没有时间,所以他们没有添加一个,因为这不是绝对必要的。
2. 调用 mkpath(path)
的 QDir
实例也将设置为 path
,因此它会方便进一步使用 - 但我似乎找不到任何提示表明这是 docs.
中的实际行为
我知道我重复了一遍,但我确实 不需要 需要帮助 如何 去做,但我很多对 为什么 必须这样做感兴趣。
感谢我可能错过的任何原因。
让我们看一下上述方法的代码:
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);
}
来源:http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n1381
正如我们所见,静态版本很容易实现:
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);
}
(另见 http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n681)
首先,非静态方法有几个优点。显然,使用对象的现有文件引擎是有好处的。而且,我会想象在特定目录下创建多个目录的用例(QDir
已经指向)。
那么为什么不同时提供两者呢?
Verdict (tl/dr): 我认为原因很简单,代码卫生。当您使用 API 时,QDir::makepath(path);
和 QDir().makepath(path);
之间的区别很小。创建对象对性能的影响也可以忽略不计,因为如果您碰巧更频繁地执行该操作,您将重用同一个对象。但在代码维护者方面,不维护同一方法的两个版本可以说更方便(工作量更少,更不容易出错)。
我知道,要从给定的绝对路径在 Qt 中创建新路径,您可以使用 QDir::makepath()
作为 dir.makepath(path)
,正如 this 问题中所建议的那样。我在使用它时没有遇到任何问题,而且效果很好。我的问题是直接的,关于 为什么 开发人员不会提供静态函数以像 QDir::makepath("/Users/me/somepath/");
这样的方式调用。需要创建一个新的 QDir
实例对我来说似乎没有必要。
我只能想到两个可能的原因:
1. 开发者 "lazy" 或没有时间,所以他们没有添加一个,因为这不是绝对必要的。
2. 调用 mkpath(path)
的 QDir
实例也将设置为 path
,因此它会方便进一步使用 - 但我似乎找不到任何提示表明这是 docs.
我知道我重复了一遍,但我确实 不需要 需要帮助 如何 去做,但我很多对 为什么 必须这样做感兴趣。 感谢我可能错过的任何原因。
让我们看一下上述方法的代码:
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);
}
来源:http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n1381
正如我们所见,静态版本很容易实现:
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);
}
(另见 http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdir.cpp#n681)
首先,非静态方法有几个优点。显然,使用对象的现有文件引擎是有好处的。而且,我会想象在特定目录下创建多个目录的用例(QDir
已经指向)。
那么为什么不同时提供两者呢?
Verdict (tl/dr): 我认为原因很简单,代码卫生。当您使用 API 时,QDir::makepath(path);
和 QDir().makepath(path);
之间的区别很小。创建对象对性能的影响也可以忽略不计,因为如果您碰巧更频繁地执行该操作,您将重用同一个对象。但在代码维护者方面,不维护同一方法的两个版本可以说更方便(工作量更少,更不容易出错)。