if文を短縮する記事。
以下のCodeではif文でコントロールを対象にした処理を弄る場合ですね。やや複雑な処理を行っていて、かなり冗長になってしまっています。
実のところ結構悩んでいた課題だったけど、ちょっとした思い付きで解決出来た。
三項演算子を使ってエイリアスしてみた。
注:三項演算子はvoid型メソッドを呼べないので、voidの場合はSwich文を使う方法で。ちょっと詰まった。
コントロール(UI)をクラスやメソッド内で弄るのは邪道とか言われた事があるんですが、書くのが面倒になるし普通にこれでいいのではないかと思っています。
欠点は書いた人じゃないと分からない事かな。依存性も高いし。
利点は呼び出し側がすっきりする事。
Viewmodel使っても似たような感じになるんじゃないでしょうか。
bool FileConvertExec(string _fullPath)
{
if (fileStringChk.FileExsists(ParamAddClasss<string>.check_output) && NoDialogCheck.IsChecked.Value == false)
{
MessageBoxResult msbr = MessageBox.Show("ファイルが存在しますわ。上書きしますか?",
"メッセージボックス", MessageBoxButton.YesNo,
MessageBoxImage.Asterisk);
if (msbr == MessageBoxResult.Yes)
{
th1.Start();
Lw.Show();
Lw.Activate();
return true;
}
else
{
return false;
}
}
else //ファイルが保存先に存在しなかったとき & 「上書き保存」チェックがあるとき
{
if (ParamInterfase.isExitProcessed)
{
// ParamInterfase.isExitProcessed = false;
th1.Start();
Lw.Show();
Lw.Activate();
}
else {
MessageBox.Show("ffmpeg.exeが実行中なのです");
}
return false;
}
}
三項演算子による短縮化
メソッド化すると呼び出し側がかなり短くなる。一覧性が増してデバッグ効率がよくなるので自分でもナイスな発想だった。
尚、三項演算子は必ず値を返すものでなければ実行出来ない。つまりVoid型のメソッドは実行できない。
※重複するので処理内容は省略しました。
省略前のCodeは編集履歴にあります。
bool FileConvertExec(string _fullPath)
{
///
///三項演算子による大幅な短縮化
///void型のメソッドは実行不可
return FileExsosts_and_NoDialogCheck
(param.check_output,NoDialogCheck.IsChecked.Value) ? DialogMethod() : ifNoFileExsists() ;
}
////
////以下メソッド化
////
static bool FileExsosts_and_NoDialogCheck(string check_output, bool _DialogChecked)
{
var alterExsists = new Alternate_FileExsists();
bool exsisted = alterExsists.FileExsists(check_output);
bool DialogChecled = _DialogChecled;
bool satisfied = false;
if (exsisted && !DialogChecked)
satisfied = true;
return satisfied;
}
bool DialogMethod()
{
/// 省略
}
bool IfNoFileExsists()
{
//省略
}
}
これをもっと推し進めればこう書けるとかあると思う。
最近のc#は式木を使ってこのように明示的に書けると言うのがあるそうです(コメントで言ってた)。
あとで調べたらsatisfiedは満足という意味だった。なんかそれっぽい単語を適当に入れてみたのである。
Swich文と式木を使った書き方
知らなかったのでもっと他人のCodeを読んでおこうなどと思った。
調べたらC#8.0かららしい。
bool FileConvertExec()
{
return FileExsosts_and_NoDialogCheck
(param.check_output,NoDialogCheck.IsChecked.Value) switch
{
true => DialogMethod(),
false => ifNoFileExsists()
};
}
より優れている参考記事