- PR -

メソッドの入れ替え

投稿者投稿内容
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-08-13 11:25
レスどうもありがとうございます。

ダイナミックにクラス作成とかできたらいいんですが。
どうも難しそうですね。


小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-08-13 12:08
バイトコード操作以外では、GroovyとかJRubyに食わせる
コードを動的に生成して、ロジックを変更するとかいう
方法もありかなと。

>メソッドgetStr1からの返却を一次的に変更して利用したいのです。
>継承元のクラスを動的に変更できる。

システム起動時だけ変更を行うことは多々あることなんですが、もし
プログラム実行中にやる場合は、Java向けに設計されていない構造
のプログラムだと思います。
仕事柄、よく分かっている人には理解できるが、場合によってはそう
いった人でも勘違いする可能性があるプログラム -> ご法度!
という方針を取っています。たとえ動的な書き換えでコード量
が1/100で処理速度やメモリ利用効率が向上したとしても、メンテナンス
性が低下するコードは、その後の工数増加に直結するので使いません。




かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-08-13 23:54
「アルゴリズムを変更したい」という前提があるのであれば、
その時点で変更が容易なクラスデザインにするべきでしたね。
プレミアム
会議室デビュー日: 2007/08/15
投稿数: 9
投稿日時: 2007-08-15 19:53
こんにちは、プレミアムです。

いままでの文脈から、
↓のような話では絶対ないと思うのですが、書いてみようと思います。
コード:
public class DBean extends Bean1 {
    private boolean noChange = false;

    public void setNoChange(boolean bln){
            this.noChange = bln;
    }

    public String other( String m ) {
        if(this.noChange){
            return m;
        }
        return m.toLowerCase();
    }
}

public class Test2 {
    public static void main(String[] args) {
        DBean bean = new DBean(); //■ここ

        String ret = bean.run("aBcDe");
        System.out.println(ret);
				
        bean.setNoChange(true);
        ret = bean.run("aBcDe");
        System.out.println(ret);
    }
}


Test2を実行すると
abcde:ABCDE
aBcDe:ABCDE
となります。

「■ここ」の部分は、
Bean1 obj = new DBean();
でないといかんとか、そうゆうことでしょうか?
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-08-16 09:46
レスありがとうございます。
Bean1に相当するクラスはたくさんあるのですが、同じメソッドを同じように変更するの
で、DBeanに相当するクラスをたくさんつくらないで簡単にすませる方法はないかという
ことなんです。
数が少ないならプレミアムさんの方法なんですが、それを効率よく、多くのクラスに適用
する方法を模索してるのです。
プレミアム
会議室デビュー日: 2007/08/15
投稿数: 9
投稿日時: 2007-08-16 10:46
プレミアムです。状況は理解できました。

引用:

かつのりさんの書き込み (2007-08-13 23:54) より:
「アルゴリズムを変更したい」という前提があるのであれば、
その時点で変更が容易なクラスデザインにするべきでしたね。


Strategyパターン等でリファクタリングをする
というわけにはいかなそうな雰囲気ですが、
今後の保守、拡張などのためにも、
そうゆう手も視野に入れる必要があるのかとも思います。

が、実際どうなんでしょうかね?
工数かかりすぎますよね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-08-16 11:51
いわゆる、後付けでクラスを改造したいという問題だと思います。
改造対象のソースコードがなかったり、大人の事情で改造が禁止されている場合は、リフレクションや逆コンパイルなどになりますが、ソースコードがいじれる場合は、要はリファクタリングをすれば良いだけの話になります。
今回は、ソースコードは原則自由にいじれるが、改造のためのキーボードタイピング数や仕様変更書のページ数は少なくしたい、という要求ですよね。

引用:

progmanさんの書き込み (2007-08-10 09:50) より:
以下のコードがあって、Test1の修正や他にクラスを追加してもいいのですが
Bean1,UBeanは変更したくありません。
ですがBean1のメソッドgetStr1の処理内容を変更したいのですが、なにかよい方法は
あるでしょうか?


この「Bean1,UBeanは変更したくありません」というのが、やはり後付けの要求になるので、オブジェクト指向的に解決が困難になるのだろうと思います。

引用:

progmanさんの書き込み (2007-08-16 09:46) より:
Bean1に相当するクラスはたくさんあるのですが、同じメソッドを同じように変更するの
で、DBeanに相当するクラスをたくさんつくらないで簡単にすませる方法はないかという
ことなんです。


後付けで改造するという制約があって、スーパータイプ側を改造できない以上、たくさんあるサブタイプ側を個別に改造しなければならなくなるのは、当然なことではないでしょうか。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-08-16 14:37
匿名クラスとかはダメなのでしょうか。
コード:
public void test(){
    Bean1 bean = new Bean1(){
        public String getStr(){
            return super.getStr().toLowerCase();
        }
    };
    bean.setStr("aaa");
    bean.getStr();
}


見たいな感じで。

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