スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オブジェクト指向入門 第2回 クラスを使ったプログラム

今回は、次のような「コンパス(方位磁石)」プログラムをクラスを利用して作成します。

CompassProgram.jpg

見ての通りボタンが2個並んでいて、その左下に現在の方角が表示されています。
[左向け左!]ボタンを押すと方角が反時計回りに90度変化し、[右向け右!]ボタンを押すと時計回りに90度変化します。

C#の画面クラスだけで作成すると、ソースは以下のようになります。
ここからダウンロードできます。)

using System;
using System.Windows.Forms;

namespace Compass
{
    /// <summary>
    /// 画面
    /// </summary>
    public partial class Form1 : Form
    {
        private const int POINTS_OF_COMPASS = 360;  // コンパスのメモリの数
        private const int RIGHT_ANGLE = 90;         // 直角

        private int direction = 0;  // 現在の方角

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            UpdateView();   // 画面更新
        }

        /// <summary>
        /// 画面更新処理
        /// </summary>
        private void UpdateView()
        {
            // 現在の方角をラベルコントロールに表示
            lblDirection.Text = string.Format("{0}°", direction);
        }

        /// <summary>
        /// [左向け左!]ボタン押下
        /// </summary>
        private void cmdTurnLeft_Click(object sender, EventArgs e)
        {
            // 方角計算
            direction -= RIGHT_ANGLE;
            if (direction < 0)
            {
                direction += POINTS_OF_COMPASS;
            }

            // 画面更新
            UpdateView();
        }

        /// <summary>
        /// [右向け右!]ボタン押下
        /// </summary>
        private void cmdTurnRight_Click(object sender, EventArgs e)
        {
            // 方角計算
            direction += RIGHT_ANGLE;
            if (direction >= POINTS_OF_COMPASS)
            {
                direction -= POINTS_OF_COMPASS;
            }

            // 画面更新
            UpdateView();
        }
    }
}


小さいプログラムなのでこれで十分ですが、プログラムが大きくなると、ソースコードが長く複雑にならないように分割したくなります。

プログラムを複数に分割する時、どう分割したらよいのか分割方法が悩みどころですが、クラスを使用すると自然に解決できます。


では、コンパスプログラムを2分割してみます。
既に画面が1つあるので、クラスを1つ追加して2分割します。

まず、クラス名を決めるために、プログラムに登場する名詞からクラス名にふさわしい名詞を探します。

当然、「コンパス」です。
コンパスという名詞は、方位を示す道具の総称なのでクラス名に最適です。

コンパスクラスには、コンパスにふさわしい処理を書きます。
コンパスは、「見る向きを変える」と「方角がわかる」道具なので、

  ・見る向きを変える処理
  ・方角を教える処理

を書くことにします。

プログラムの処理なので、クラスの中に関数として書きます。
クラス内に書く関数のことを、操作(メソッド)と言います。


例えば、以下のように書けます。


using System;

namespace Compass
{
    /// <summary>
    /// コンパスクラス
    /// </summary>
    class Compass
    {
        public const int POINTS_OF_COMPASS = 360;   // コンパスのメモリの数
        public const int RIGHT_ANGLE = 90;          // 直角

        protected int direction = 0;    // 現在の方角

        /// <summary>
        /// 見る向きを変える
        /// </summary>
        /// <param name="angle">変える角度</param>
        public virtual void Turn(int angle)
        {
            // 方角を計算
            direction += angle % POINTS_OF_COMPASS; // % 記号は剰余計算(例.361 % 360 = 1)

            if (direction < 0)
            {
                direction += POINTS_OF_COMPASS;
            }
            else if (direction >= POINTS_OF_COMPASS)
            {
                direction -= POINTS_OF_COMPASS;
            }
        }

        /// <summary>
        /// 方角を教える
        /// </summary>
        /// <returns>方角</returns>
        public override string ToString()
        {
            return string.Format("{0}°", direction);
        }
    }
}


このように集合の総称をクラス名とすることで、クラスに記述する処理を自然に決めることができます。

画面のソースも、コンパスクラスを使うようになります。


using System;
using System.Windows.Forms;

namespace Compass
{
    /// <summary>
    /// 画面
    /// </summary>
    public partial class Form1 : Form
    {
        private Compass compass;    // コンパス

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Form1()
        {
            InitializeComponent();

            // 新品のコンパスを用意して、画面を更新
            compass = new Compass();
            UpdateView();
        }

        /// <summary>
        /// 画面更新処理
        /// </summary>
        private void UpdateView()
        {
            // コンパスを使って、現在の方角をラベルコントロールに表示
            lblDirection.Text = compass.ToString();
        }

        /// <summary>
        /// [左向け左!]ボタン押下
        /// </summary>
        private void cmdTurnLeft_Click(object sender, EventArgs e)
        {
            // コンパスの向きを変えて、画面更新
            compass.Turn(-Compass.RIGHT_ANGLE);
            UpdateView();
        }

        /// <summary>
        /// [右向け右!]ボタン押下
        /// </summary>
        private void cmdTurnRight_Click(object sender, EventArgs e)
        {
            // コンパスの向きを変えて、画面更新
            compass.Turn(Compass.RIGHT_ANGLE);
            UpdateView();
        }
    }
}


画面のソースから方角計算処理がなくなり、スッキリしました。


ここで、画面のコンストラクタで新品のコンパスをnewを使って用意していることに注目してください。
クラスはあくまでも「集合」という概念なので、実際に処理をする実物をnewして用意しています。

これは、「野球選手集合」という概念が野球をプレーするのではなく、イチローや松坂といった実在人物がプレーするのと同じことです。

このような実物のことを、オブジェクトと呼びます。
オブジェクトをnewすることを、生成するといいますので、上のコメントも普通は

  × 新品のコンパスを用意して…
  ◎ コンパスオブジェクトを生成して…

と書いたりします。


【まとめ】
  ・クラスは集合、クラス名は総称。
  ・集合の総称をクラス名とすることで、プログラムを自然に分割できる。
  ・クラスに書いた処理は、オブジェクトが実行する。
   (野球をするのは、イチローや松坂)


さて、クラスが集合であることを意識するだけでもプログラムは結構スッキリすのですが、さらに

  ・継承
  ・ポリモーフィズム
  ・カプセル化

を活用すると、プログラムの質は一層格段に向上します。


次回は、これら3つの基礎知識として重要なオブジェクトとインスタンスについてと、その違いについて書きたいと思います。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

Author:きっぽ

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。