- PR -

基本クラスが同じ違うクラスを一つのクラスで使い分ける方法

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-03 19:41
マスターテーブルのレコードを操作するためのクラスが3つあります。

取引先マスターレコード操作
商品マスターレコード操作
社員マスターレコード操作

基本クラスは全て「レコード操作」で統一されています。
実装しているプロパティもメソッドも全て同じです。

現在、3つの異なるレコード操作クラスがあるため、全く同じ動作をする編集クラ
スも各マスター分用意しています。

コード:


class 商品マスター : 編集クラス {
public orverride 更新(int 番号, string 項目名, object 値) {
 :
 :
    だらだら
 :
 :
this.レコード操作.更新(番号, 項目名, 値);
 :
 :
 :
}
public orverride 削除(int 番号) {
 :
 :
    だらだら
 :
 :
this.レコード操作.削除(番号);
 :
 :
 :
}
}



更新、削除の前後に、だらだらと事前チェックが大量に書かれています。
しかし、全く同じ動作をするので、一つにまとめて、だらだらするのを辞めたいの
です。

こんな感じで

コード:


class 商品マスター : 編集クラス {
public 商品マスター {
this.レコード = 商品マスターレコード操作;
}
}



こんなことを実現する方法ってありますか?


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-03-03 19:45 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-03-03 20:05
レコード操作クラスを継承した、3つの○○レコード操作クラスがある。
というような情報を読み取って行ったんですが、読み進めていくと、コードの中に商品マスタークラスとか編集クラスなどというのが前提なしにポンポン出てくるので、ちょっとR・田中一郎さんが伝えたいことが読み取れません。

もう一回説明してもらっていいですか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 20:07
良くわからなかったので、勘違いしているかもしれません。

同じようなレコードを操作するとはいえ、対象のテーブルが違う以上は、
"全く同じメソッド" でというのは、プログラムで対応する問題じゃないように思えます。
それはテーブル設計次第になっちゃいますからね。

無理せずインターフェースを使って、多態性を持たせてはいかがでしょうか?
メソッド名と役割は同じであることを明示化しておくということです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-03-03 20:18
コード:

class レコード操作クラス
public bool 開く() {}
public void 閉じる() {}
protected bool 存在確認(object キー) {}
protected bool 追加する(object キー) {}
protected bool 更新する(object キー) {}
protected bool 削除する(object キー) {}
}



上記のメソッドを実装したマスターテーブルクラスです。
この基本クラスを元に、上記のメソッドのみをオーバーライドした各マスターごと
の○○レコード操作クラスがいます。
クラスを分けているのは、これらの違いを一本化することができなかったため、や
むなくやっているだけで、実際には別々のクラスでなくても良いのです。

コード:

class 商品マスター : 編集クラス {
public 商品マスター { // コンストラクタ
this.レコード = 商品マスターレコード操作;
}
}
class 社員マスター : 編集クラス {
public 社員マスター { // コンストラクタ
this.レコード = 社員マスターレコード操作;
}
}
class 取引先マスター : 編集クラス {
public 取引先マスター { // コンストラクタ
this.レコード = 取引先マスターレコード操作;
}
}




ちなみに編集クラスは、ソースコードレベルでは全く同じです。


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-03-03 20:21 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-03 20:41
「一本化」したいのは「レコード操作クラス」ではなく、「マスタテーブルクラス」なんですよね?

編集クラスとやらにすべての操作を実装し、編集クラスのコンストラクタに各操作クラスの
インスタンスを渡すようにすればいいように思いますが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 20:48
どうも読み違えをしていたようですね。(;^-^)

引用:

R・田中一郎さんの書き込み (2006-03-03 19:41) より:

更新、削除の前後に、だらだらと事前チェックが大量に書かれています。
しかし、全く同じ動作をするので、一つにまとめて、だらだらするのを辞めたいの
です。


単純に、この「だらだらの部分」を、メソッドとして Extract しちゃダメなんですか?
同じパラメータであるのであれば、基底クラスに検証メソッドを用意して、

コード:

    if (base.検証メソッド(番号, 項目名, 値)) {

    }


こんな感じで...

引用:

コード:

class 商品マスター : 編集クラス {
    public 商品マスター {
        this.レコード = 商品マスターレコード操作;
    }
}




コンストラクタで?? というのが、未だにわかってなかったり... (; ̄- ̄)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-03-03 22:25
どういう構造になってるのかまだわからないです。

編集クラスって何ですか??
一度1つの投稿でまとめて説明お願いします。


私もじゃんぬさんが書かれているようにメソッドに
括りだします。
もっと広い範囲で使えるチェックロジックなら
コード:
public static class チェックロジック
{
  public static bool 数字なの?(string value)
  {
    return ....;
  }
  public static bool 空かnull?(string value)
  {
    return value == null || value == string.Empty;
  }
}


ってな具合なクラスを作っておいて,だらだらした部分に
これを使ったコードを書きます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-03 23:37
 全く同じ構造のマスタテーブルを作って、テーブル名だけ変えて対応しています。

 列の追加がある場合は、拡張。


 今日、MVP for SQL Server な河端さん(川だったら失礼)とお話をしているときに、「O-R マッピングをして、1レコードを追加するのに、Adapter が便利だから Fill で全部持ってきて、1行追加して、Update している。何でそんな効率の悪いことするの?!」って話が出ました。すみません、酔っぱらって、あまり覚えてないです。
 ソースコードの効率も大事ですが、実行時の効率も大事じゃないでしょうか。そういうところも考えて、もう一度設計を見直してみてはいかがでしょうか。

スキルアップ/キャリアアップ(JOB@IT)