Элегантный способ отличить путь или ключ входа - PullRequest
0 голосов
/ 14 июня 2010

У меня есть приложение, загружающее данные САПР (пользовательский формат), либо из локальной файловой системы, указывающей абсолютный путь к чертежу, либо из базы данных.

Доступ к базе данных осуществляется через библиотечную функцию, принимающую идентификатор чертежейв качестве параметра.

идентификаторы имеют формат, подобный ABC 01234T56-T, в то время как мои пути - это типичные пути Windows (например, x:\Data\cadfiles\cadfile001.bin).

Я хотел бы написать функцию-оболочку.Строка в качестве аргумента, которая может быть либо путем, либо идентификатором, который вызывает соответствующие функции для загрузки моих данных.

Примерно так:

Function CadLoader(nameOrPath : String):TCadData;

Мой вопрос: как я могу изящно решить, какая погода?моя строка является idnetifier или путь к файлу?Использовать регулярное выражение?Или просто искать '\' и ':', которые не появляются в идентификаторах?

Ответы [ 4 ]

5 голосов
/ 14 июня 2010

Попробуйте это

Function CadLoader(nameOrPath : String):TCadData;
begin
  if FileExists(nameOrPath) then
    <Load from file>
  else
    <Load from database>
end;
2 голосов
/ 14 июня 2010

Я бы сделал что-то вроде этого:

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 Чтобы сделать то же самое, было бы: \\\\|.:\\ Я думаю, что первый более читабелен.

0 голосов
/ 15 июня 2010

Вы должны передать дополнительный параметр, который точно скажет, что на самом деле представляет идентификатор, то есть:

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'); 
0 голосов
/ 14 июня 2010

На мой взгляд, К.И.С.С. принцип применяется (или держите его простым глупым!). Звучит грубо, но если вы абсолютно уверены, что комбинация :\ никогда не будет в ваших идентификаторах, я просто посмотрю на 2-ю позицию строки. Делает вещи понятными и читаемыми. Также еще одна цитата:

Некоторые люди, когда сталкиваются с проблема, подумай "Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы. - Джейми Завински

...