プログラムをオブジェクト指向にするには

プログラムをオブジェクト指向にするには、

  • そのプログラムがなにをするか、に加えて、
  • それをどこにやらせるか、

が重要になる。

気を付けるのは、他のクラスのプロパティを使って、いろいろ計算しているところ。次の例では、適用期間 (ApplicableTerm) クラスを使うクラスが、ApplicableTerm の Start と End プロパティから期間内かどうかを求めている。

using System;

namespace ObjectOrientedBadSample
{
    public class ApplicableTerm
    {
        private TimeSpan _start;
        private TimeSpan _end;

        public TimeSpan Start
        {
            get { return _start; }
        }

        public TimeSpan End
        {
            get { return _end; }
        }
    }

    public class ApplicableTermUser
    {
        public void BadUser(ApplicableTerm term)
        {
            TimeSpan someTimePoint = new TimeSpan();    // ある時点
            if (term.Start <= someTimePoint && someTimePoint <= term.End)
            //  ========================================================
            {
                // 適用期間内
            }
        }
    }
}

他のクラスのプロパティを使って自分で計算するのではなく、そのプロパティを提供するクラスにやってもらう。

using System;

namespace ObjectOrientedBetterSample
{
    public class ApplicableTerm
    {
        private TimeSpan _start;
        private TimeSpan _end;

        public bool IsIncluded(TimeSpan timePoint)
        {
            return _start <= timePoint && timePoint <= _end;
        }
    }

    public class ApplicableTermUser
    {
        public void GoodUser(ApplicableTerm term)
        {
            TimeSpan someTimePoint = new TimeSpan();    // ある時点
            if (term.IsIncluded(someTimePoint))
            //  ==============================
            {
                // 適用期間内
            }
        }
    }
}