2012-02-15 24 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; 
    } 
} 

我猜你會想要最後一個塊的變化,但這應該很容易修改。