C# (dotnetcore)で標準出力を利用して進行中のスピナーを作る (4)
前回の記事
課題 (updateメソッドの分解(メソッドが長い))
updateメソッドが長い、コメントなしでロジックが16行。コメント等入れて36行。 そんなに長いメソッドではないが、メソッドの内容にいろいろな物が含まれているため、 分別する。
描画のロジックを2つに分ける
メソッドを、進捗終了と、進捗進行中の2つに分けました。 また、進捗率の計算をメソッド化しました。
| メソッド | 型 | 内容 |
|---|---|---|
| CalcProportion | int | Minimum〜Maximumに対するValueの進捗率を計算して返却 |
| DoneProgressConsoleWrite | void | 進捗終了の印字 |
| InProgressConsoleWrite | void | 進捗進行中の印字 |
| update | void | 描画用メソッド |
/// <summary>Minimum〜Maximumに対するValueの進捗率を計算して返却</summary>
/// <returns>進捗率(%)</returns>
private int CalcProportion()
{
decimal oneMeter = new decimal(100) / (this.Maximum - this.Minimum);
return Decimal.ToInt32(oneMeter * (this.Value - this.Minimum));
}
/// <summary>進捗終了の印字</summary>
private void DoneProgressConsoleWrite()
{
//色を戻す
Console.ResetColor();
//カーソル位置を変更
Console.SetCursorPosition(0, Console.CursorTop);
//終了の表示
Console.WriteLine("Done! ");
}
/// <summary>進捗進行中の印字</summary>
private void InProgressConsoleWrite()
{
//進捗率計算
int proportion = CalcProportion();
//カーソル位置を変更
Console.SetCursorPosition(0, Console.CursorTop);
//色変更
Console.ForegroundColor = ConsoleColor.Green;
Console.BackgroundColor = ConsoleColor.Black;
//進捗率の印字
Console.Write("{0}{1, 3:d0}%", bars[proportion % bars.Length], proportion);
}
/// <summary>描画</summary>
private void update()
{
if (this.Maximum == this.Value)
{
DoneProgressConsoleWrite();
}
else
{
InProgressConsoleWrite();
}
}
残る課題
- Consoleへの操作部分のテストをどうするか。
ひとまず。ここまで。続きは次回。