developer's diary

最近はc#のエントリが多いです

C# (dotnetcore)で標準出力を利用して進行中のスピナーを作る (4)

前回の記事

mitsugeek.net

課題 (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への操作部分のテストをどうするか。

ひとまず。ここまで。続きは次回。

mitsugeek.net