スポンサーサイト

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

オブジェクト指向入門 第5回 継承を活用したプログラム変更

今回は以前作成した「コンパスプログラム」を題材に、継承を活用するとプログラム変更が簡単にできる例を書いてみたいと思います。

さて、なぜか知りませんが「コンパスプログラム」は大ヒットして、新バージョンを開発することになったと仮定します。
新バージョンの特徴は、以下のとおりです。

  ・方角が”東西南北”で表示される。

元々、0°,90°,180°,270°の四方向しか示さないプログラムなので、文言を”東西南北”にして見やすくするのです。

コンパスプログラムは小さなプログラムなので既存のソースを直接変更しても十分簡単ですが、大規模システムとなると既存のソースはあまり変更したくないと思います。
そこで、以下の方針で行います。

  ①変更が必要なクラスは変更しない。(要変更なのに変更しない!)
  ②代わりに当該クラスの派生クラスを追加し、そこに新しい処理を書く。
  ③当該クラス代わりに派生クラスを生成するよう、1行だけ変更する。

このようにすると、新しい処理は真っさらな派生クラスへ自由に書くことができます。また、元々あるクラスも基本クラスとして再利用できます。
つまり、コードを自由に書ける環境と、既存コードを流用しやすい環境を同時に手に入れたことになります。

また、その派生クラスを生成するだけで、元のクラスの代わりに派生クラスが動作するようになります。
これは、既存ソースの「new 元のクラス名」を置換するだけなので、まずミスすることのない非常に簡単な作業です。

上記①~③の方針で変更すると、元のソースを解析しながら1行ずつ慎重に注意深く変更する必要がなくなるのです。


では、実際にコンパスプログラムを変更したいと思います。

コンパスクラスのToString操作の戻り値を”東西南北”に変更する必要があるので、方針①②に沿ってコンパスクラスを変更する代わりに「東西南北コンパスクラス」を追加します。
東西南北クラスのコードは以下のようになります。
ここからダウンロードできます。)

using System;

namespace Compass
{
    /// <summary>
    /// 東西南北コンパスクラス
    /// </summary>
    class NSEWCompass : Compass
    {
        protected string NORTH = "北";
        protected string EAST = "東";
        protected string SOUTH = "南";
        protected string WEST = "西";

        /// <summary>
        /// 方角を教える
        /// </summary>
        /// <returns>方角</returns>
        public override string ToString()
        {
            // 東西南北を返す。
            int n = POINTS_OF_COMPASS / 8;

            if (direction < n)
            {
                return NORTH;
            }
            else if (direction < n * 3)
            {
                return EAST;

            }
            else if (direction < n * 5)
            {
                return SOUTH;
            }
            else if (direction < n * 7)
            {
                return WEST;
            }
            else
            {
                return NORTH;
            }
        }
    }
}

この派生クラスを生成するように、既存ソースを1行だけ変更します。
場所は、Form_Loadのコンストラクタです。

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

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

これで修正は完了です。
実際に動かすと、表示文言が変化したことを確認できます。

CompassProgram2.jpg

このように、継承を活用すると、既存コードの変更量を文字通り最小限にしてプログラム変更を行うことができます。
つまり、簡単かつ安全に変更を行うことができます。


■まとめ
  ①変更が必要なクラスは変更しない。(要変更なのに変更しない!)
  ②代わりに当該クラスの派生クラスを追加し、そこに新しい処理を書く。
  ③当該クラス代わりに派生クラスを生成するよう、1行だけ変更する。


さて、実際の問題として、将来どのようなプログラム変更が発生するかを正確に予測するの難しいものです。
事前に変更が発生しそうなクラスを予測し、前もって継承しやすくするなど不可能です。

では、継承を活用したプログラム変更を実現するために、今すぐ行えることは何でしょうか?

次回は、その辺りを書いてみたいと思います。
スポンサーサイト

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

コメントの投稿

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

プロフィール

きっぽ

Author:きっぽ

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

この人とブロともになる

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