2012-02-15 42 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'也应该评估,whatz用'ic'也许你可以提取扩展,使之成为一个'之开关 – V4Vendetta 2012-02-15 05:30:25

+0

@ V4Vendetta,布尔IC呢?; – Usher 2012-02-15 05:32:15

+0

这里有什么问题,为什么你需要这个ic? – IamStalker 2012-02-15 05:34:37

回答

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 2012-02-15 05:54:01

0

至少,你可以把它转换成一个if/elseif的语句:

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

考虑到代码中存在的所有问题,这可能是影响最小的一个。 – 2012-02-15 05:32:51

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 

毕竟IFS的结束通话的方法

UploadCondition(path, filename); 

更好地将提取的文件名扩展.wmv, .m4v,使这个一个开关,您可以设置路径。

2

您将需要大量的重构。这里有几个想法,让你开始:

  • 使用的String.Format和唯一的价值传递,改变了救你所有的重复文本
  • 构建扩展/ EXT-组合键的字典,并设置目标路径的值。然后,您只需要比大嵌套如果一个查找 - else语句
  • 使用Path.GetExtension,而不是包含更准确

EG。

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

像这样的事情是一个很好的短期解决您的问题,我相信它可以处理所有的if语句办案。

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; 
    } 
} 

我猜你会想要最后一个块的变化,但这应该很容易修改。