我有一个应用程序加载CAD数据(自定义格式),从本地文件系统指定绘图的绝对路径或从数据库。
数据库访问是通过将图纸标识符作为参数的库函数实现的。
标识符的格式类似于ABC 01234T56-T
,而我的路径是典型的Windows路径(例如x:\Data\cadfiles\cadfile001.bin
)。
我想写一个包装器函数将一个String作为一个参数,它可以是一个路径或一个标识符,它调用适当的函数来加载我的数据。
像这样:
Function CadLoader(nameOrPath : String):TCadData;
我的问题:我怎样才能优雅地决定我的字符串是一个idnetifier还是文件的路径? 使用正则表达式?或者只搜索“\”和“:”,它们没有出现在标识符中?
答案 0 :(得分:5)
试试这个
Function CadLoader(nameOrPath : String):TCadData;
begin
if FileExists(nameOrPath) then
<Load from file>
else
<Load from database>
end;
答案 1 :(得分:2)
我会做这样的事情:
function CadLoader(nameOrPath : String) : TCadData;
begin
if ((Pos('\\',NameOrPath) = 1) {UNC} or (Pos(':\',NameOrPath) = 2) { Path })
and FileExists(NameOrPath) then
begin
// Load from File
end
else
begin
// Load From Name
end;
end;
RegEx要做同样的事情:\\\\|.:\\
我认为第一个更具可读性。
答案 2 :(得分:0)
在我看来,K.I.S.S。原则适用(或保持简单愚蠢!)。听起来很苛刻,但是如果你绝对确定组合:\
永远不会出现在你的标识符中,我只会在字符串的第二个位置查找它。保持事物的可理解性和可读性。还有一句话:
有些人在面对的时候 问题,想想“我知道,我会用 正则表达式。“现在他们有 两个问题。 - 杰米·扎温斯基
答案 3 :(得分:0)
您应该传入一个额外的参数,准确说明标识符实际代表的内容,即:
type
CadLoadType = (CadFromPath, CadFromDatabase);
Function CadLoader(aType: CadLoadType; const aIdentifier: String): TCadData;
begin
case aType of
CadFromPath: begin
// aIdentifier is a file path...
end;
CadFromDatabase: begin
// aIdentifier is a database ID ...
end;
end;
end;
然后你可以这样做:
Cad := CadLoader(CadFromFile, 'x:\Data\cadfiles\cadfile001.bin');
Cad := CadLoader(CadFromDatabase, 'ABC 01234T56-T');