2012-02-15 6 views
1

私のコードでは以下のような条件がありますが、それは効率的ではありません。あなたがもし/ ELSEIF文の中にそれを変換することができ非常に少なくとも、条件文を処理する最良の方法

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'でwhatzを評価する必要がありますか?拡張子を抽出して '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という新しいインターフェースを導入することもできます。

これはまた、あなたのコードをOpen/Closedの原則に従うようにします。

+0

、ありがとうございます。素晴らしいアイデアです。 – Usher

0

:私は仮定

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

提示されたコードのすべての問題を考えれば、これはおそらく最も影響力の弱いものです。 –

0

、一度あなたのfilenameは.MP4など、.flvのいずれかになります.m4vします...ので、ここでのコード..

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は良いが、ファイル名から拡張子.wmv, .m4vを抽出することとにこれをするだろうあなたの方法

UploadCondition(path, filename); 

を呼び出して終了した後、あなたがパスを設定するスイッチ。

2

多くのリファクタリングが必要です。ここでは、始めるためのアイデアのカップルです:

  • 使用String.Formatのと拡張/ EXT-コンビネーションキーとセットの辞書を構築し、すべてのテキスト
  • を繰り返しあなたを救うために変更のみ値で渡さを宛先パスへの値

例:より正確であることが含まれてではなく、else文

  • 使用Path.GetExtension - あなたはその後、唯一の大きな営巣場合よりも1のルックアップが必要になります。

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

    最終ブロックのバリエーションが必要になると思われますが、これは変更するだけで十分です。

    関連する問題