开发者

Elegant way to distinct Path or Entry key

I have an application loading CAD data (Custom format), either from the local filesystem specifing an absolute path to a drawing or from a database.

Database access is realized through a library function taking the drawings identifier as a parameter.

the identifiers have a format like ABC 01234T56-T, while my paths a typical windows Paths (eg x:\Data\cadfiles\cadfile001.bin).

I would like to write a wrapper function Taking a String as an argument which can be either a path or an identifier which calls the appropriate functions to loa开发者_运维技巧d my data.

Like this:

Function CadLoader(nameOrPath : String):TCadData;

My Question: How can I elegantly decide wether my string is an idnetifier or a Path to a file? Use A regexp? Or just search for '\' and ':', which are not appearing in the Identifiers?


Try this one

Function CadLoader(nameOrPath : String):TCadData;
begin
  if FileExists(nameOrPath) then
    <Load from file>
  else
    <Load from database>
end;


I would do something like this:

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;

The RegEx To do the same thing would be: \\\\|.:\\ I think the first one is more readable.


In my opinion, the K.I.S.S. principle applies (or Keep It Simple Stupid!). Sounds harsh, but if you're absolutely certain that the combination :\ will never be in your identifiers, I'd just look for it on the 2nd position of the string. Keeps things understandable and readable. Also, one more quote:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski


You should pass in an additional parameter that says exactly what the identifier actually represents, ie:

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; 

Then you can do this:

Cad := CadLoader(CadFromFile, 'x:\Data\cadfiles\cadfile001.bin'); 

Cad := CadLoader(CadFromDatabase, 'ABC 01234T56-T'); 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜