VB6開発者向け:C#で始める.NETプログラミング

第7回 オブジェクト指向プログラミング(2)

この記事を読むのに必要な時間:およそ 6 分

ロジックのクラスを作る

次に,本ソフトウェアの本体であるLogicという名前のクラスを作ってみましょう。

すでに,データアクセスを受け持つAdapterクラスや,データを格納するRowクラス,プロパティが変わったらイベントを発生させるNotifyPropertyChangedクラスが存在しているため,これらを利用して作っていきます。

using System;
namespace WindowsFormsApplication1
{
    //*************************************************************
    /// <summary>電話帳サンプルコンポーネント</summary>
    //*************************************************************
    class Logic : NotifyPropertyChanged
    {
        private Adapter adapter;

        //*************************************************************
        /// <summary>コンストラクタ</summary>
        //*************************************************************
        public Logic() {
            this.adapter = new Adapter();
        }

        //*************************************************************
        /// <summary>Code プロパティ</summary>
        //*************************************************************
        private int _Code = 0;
        public int Code {
            get { return this._Code; }
            set {
                if (this._Code == value) return;
                this._Code = value;
                base.OnPropertyChanged("Code");
            }
        }

        //*************************************************************
        ///<summary>Row プロパティ</summary>
        //*************************************************************
        private Row _Row = new Row();
        public Row Row {
            get { return this._Row; }
            private set { this._Row = value; }
        }

        //*************************************************************
        /// <summary>追加処理を実行します</summary>
        //*************************************************************
        public void Add() {
            this.InvalidCode();
            if (this.adapter.Read(this.Code, this.Row)) {
                throw new Exception("既に登録されている番号です");
            }
            this.adapter.Add(this.Code);
            this.Read();
        }

        //*************************************************************
        /// <summary>更新処理を実行します</summary>
        //*************************************************************
        public void Update() {
            this.InvalidCode();
            this.adapter.Update(this.Row);
        }

        //*************************************************************
        /// <summary>削除処理を実行します</summary>
        //*************************************************************
        public void Delete() {
            this.InvalidCode();
            this.adapter.Delete(this.Code);

            this.Code = 0;
            this.Row.Clear();
        }

        //*************************************************************
        /// <summary>読込み処理を実行します</summary>
        //*************************************************************
        public void Read() {
            if (!this.adapter.Read(this.Code, this.Row)) {
                this.Row.Clear();
                throw new Exception("番号が見つかりません");
            }
        }

        //*************************************************************
        /// <summary>番号値が有効かどうかを検証した結果を取得します
        /// </summary>
        //*************************************************************
        private void InvalidCode() {
            if (this.Code > 0 || this.Code < 100000000) return;
            throw new Exception("番号が有効な値ではありません");
        }
    }
}

クラスの概要

このクラスの持つインターフェイスは,以下のようになります。

イベント
OnPropertyChanged(継承元クラスで実装)
プロパティ
Code,Row(取得のみで設定は不可)
メソッド
Add,Update,Delete,Read

つまりはCodeにセットされた値に対して,Add,Update,Delete,Readすることができます。

Readによって得られた値はRowプロパティによってRowオブジェクトとして提供されます。 また,起動直後やDeleteメソッドによってRowの値が変更された場合は,Codeプロパティに値をセットします。 Codeプロパティの値が変更されることでOnPropertyChangedイベントが発行されます。

例外エラー

前回移植したC#のコードでは,ユーザーが何らかの違反行為を行った時や,例外エラーが発生した時点でエラーメッセージを表示していました。 しかし,エラーメッセージの表示は,ユーザーインターフェイスを受け持つためのクラスが行うべきことになります。

このクラスでは,エラーメッセージを表示させる代わりに,Exceptionオブジェクトを生成しthrowすることで例外エラーを発生させています。

著者プロフィール

伊藤達也(いとうたつや)

(株)井沢電器設備にて、業務管理システムの開発に従事しています。 この記事の趣旨通り、筆者自身が2005年後半にメインの開発言語をVB6からC#に移行し、2007年には Microsoft MVPアワードをC#で受賞しました。