2012-02-15 4 views
1

У меня есть следующее условие, используемое в моем коде, но это выглядит не очень эффективно, это лучший способ обработки?лучший способ обработки условного оператора

if (ic = filename.Contains(".wmv")) 
{ 
    if (bitnumber > 400) 
    { 
     path = "ftp://" + ftpServerIP + "/" + "media" + "/" + "lib" + "/" + programName + "/" + date + "/"; 
     UploadCondition(path, filename); 
     //return path; 
    } 
} 

if (ic = filename.Contains(".wmv")) 
{ 
    if (bitnumber < 400) 
    { 
     path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
     UploadCondition(path, filename); 
     //return path; 
    } 
} 

if (ic = filename.Contains(".m4v")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 

if (ic = filename.Contains(".mp4")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
if (ic = filename.Contains(".flv")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
if (ic = filename.Contains(".mpg")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
if (ic = filename.Contains(".aac")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "audio" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
if (ic = filename.Contains(".mp3")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "audio" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
+1

Просто 'filename.Contains' также должен оценить, с помощью' ic'? Возможно, вы могли бы извлечь расширение и превратить его в 'switch' – V4Vendetta

+0

@ V4Vendetta, bool ic; – Usher

+0

Что-то не так, зачем вам этот ic? – IamStalker

ответ

3

разбить его в других классах, как:

public class AudioFileValidator 
{ 
    private List<string> _extensions = new List<string>{".aac", ".mp3"}; 
    public bool IsValid(string filename) 
    { 
     if (!_extensions.Contains(Path.GetExtension(filename)) 
      return false; 

     //validate bitrate etc 
    } 
} 

Использование:

var audioValidator = new AudioFileValidator(); 
if (audioValidator.IsValid(filename)) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "audio" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 

var videoValidator = new VideoFileValidator(); 
if (videoValidator.IsValid(filename)) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 

Поступая таким образом, вы получите классы с одной ответственности, которые могут быть повторно использованы в других местах и ​​которые легко единицы контрольная работа.


Вы можете даже взять его дальше и ввести новый интерфейс под названием IMediaFileValidator, которые реализуют все валидаторы. и сделайте что-нибудь вроде:

foreach (var validator in validators) 
{ 
    if (validator.IsValid(filename)) 
    { 
     // use info from the validator to build the path 
     var mediaName = validator.MediaName; 
     path = "ftp://" + ftpServerIP + "/" + mediaName + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
     UploadCondition(path, filename); 
     break; 
    } 
} 

Это также заставило бы ваш код придерживаться принципа «Открытый/Закрытый».

+0

, спасибо большое. Это потрясающая идея. – Usher

0

По крайней мере, вы могли бы превратить его в если/ELSEIF заявление:

if (ic....) 
{ 
    ... 
} else if (ic...) { 
    ... 
} 
+0

Учитывая все проблемы в представленном коде, это, вероятно, наименее влиятельный. –

0

я полагаю, в то время, ваш filename будет либо .m4v, .flv, .mp4 и т.д. ... так что здесь идет код ..

if (ic = filename.Contains(".wmv")) 
{ 
    if (bitnumber > 400) 
    { 
     path = "ftp://" + ftpServerIP + "/" + "media" + "/" + "lib" + "/" + programName + "/" + date + "/"; 
     UploadCondition(path, filename); 
     //return path; 
    } 

     else 
     { 
     path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
     UploadCondition(path, filename); 
     //return path; 
    } 
} 

    else if (ic = filename.Contains(".m4v")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 

else if (ic = filename.Contains(".mp4")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
else if (ic = filename.Contains(".flv")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
else if (ic = filename.Contains(".mpg")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
else if (ic = filename.Contains(".aac")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "audio" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
else if (ic = filename.Contains(".mp3")) 
{ 
    path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "audio" + "/" + "podcast" + "/"; 
    UploadCondition(path, filename); 
} 
    else 
    { 
     //No Match found 
    } 

и лучшим подходом было бы использовать Switch(fileExtn)

0

Вы могли бы, возможно, сделать это немного проще, как

if (filename.Contains(".wmv")) 
    // path = set the path as you require 

и после того, как все сослагательного наклонения Отбой ваш метод

UploadCondition(path, filename); 

Лучше бы извлечь расширение .wmv, .m4v из файла и сделать это в переключатель, посредством которого вы устанавливаете путь.

2

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

  • Использование String.Format и передается только значение, которое изменилось, чтобы спасти вас все повторять текст
  • Построить словарь Extension/ключ Ext-комбинации и набор значение для пути назначения. После этого требуется только один поиск, чем большой вложенности, если это - либо еще заявления
  • Использование Path.GetExtension, а не содержит, чтобы быть более точным

Например.

string formatStringNews = "ftp://{0}/news/{1}/"; 
    string formatStringMedia = "ftp://{0}/media/{1}/"; 
    dictionary["wmv"] = formatStringMedia; 
    dictionary["mp3"] = formatStringNews; 
    .... 
    string key = Path.GetExtension(filename); 
    path = string.Format(dictionary[key], serverName, programName); 
1

Что-то, как это приятно короткое решение вашей проблемы, и я считаю, что это обрабатывает все случаи вашей, если операторы обработки.

String[] videoExtensions = { "wmv", "m4v", "mp4", "flv" }; 
String[] audioExtensions = { "aac", "mp3" }; 

String ext = Path.GetExtension(filename).ToLower(); 
String path = "ftp://" + ftpServerIP + "/"; 

if (-1 != Array.IndexOf(videoExtensions, ext)) { 
    if ("wmv".equals(ext) && bitnumber > 400) 
    path += "media/lib/" + programName + "/" + date + "/"; 
    else 
    path += "mpegmedia/news/" + programName + "/video/podcast/"; 
} 
else if (-1 != Array.IndexOf(audioExtensions, ext)) { 
    path += "mpegmedia/news/" + programName + "/audio/podcast/"; 
}​​​​​​​​​​​ 
else { 
    // handle unknown extension types as desired 
} 

UploadCondition(path, filename); 
1

Используйте switch заявление и System.IO.Path.GetExtension.

select (System.IO.Path.GetExtension(filename)) 
{ 
    case ".wmv": 
     if (bitnumber > 400) 
     { 
      path = "ftp://" + ftpServerIP + "/" + "media" + "/" + "lib" + "/" + programName + "/" + date + "/"; 
      UploadCondition(path, filename); 
      //return path; 
     } 
     else 
     { 
      path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
      UploadCondition(path, filename); 
      //return path; 
     } 
     break; 

     case ".m4v": 
     case ".mp4": 
     case ".flv": 
     case ".mpg": 
     case ".mp3": 
     default: 
      path = "ftp://" + ftpServerIP + "/" + "mpegmedia" + "/" + "news" + "/" + programName + "/" + "video" + "/" + "podcast" + "/"; 
      UploadCondition(path, filename); 
      break; 
    } 
} 

Я предполагаю, что вам понадобятся варианты для последнего блока, но это должно быть достаточно легко модифицировать.