4

van Emde Boas ツリーを実装していますが、コンストラクターで再帰を使用すると非常に便利な状況に遭遇しました。

ツリーにルート ノードを作成すると、そのノードは他の多くのノードへのポインタを持ち、それらのノードは他の多くのノードを指すようになります。これらが null データで初期化されていても、すべてそこにある必要があります。

編集:コメントへの回答として、メモリを割り当てるときは常に注意する必要があるため、悪い習慣かもしれないと思いました。この場合、ユーザーはそのような新しいノードを割り当てることによる影響を認識していない可能性があるため、意図したよりも多くのメモリを割り当てる可能性がありますか? それ以外は、コンストラクターでメモリを割り当てるのは奇妙/危険に思えたと思います。

このコードは、完全なツリーが作成されるまで、新しいノードを再帰的に作成します。これは悪い習慣ですか?もしそうなら、Javaでそれを行うより良い方法はありますか?

//Constructor
public VEBNode(int universeSize)
{
    this.universeSize = universeSize;
    min = vEBTree.NULL;
    max = vEBTree.NULL;

    if(universeSize <= 2)
    {
        summary = null;
        cluster = null;
    }
    else
    {
        int childUnivereSize = (int)Math.sqrt(universeSize);

        summary = new VEBNode(childUnivereSize);
        cluster = new VEBNode[childUnivereSize];

        for(int i = 0; i < childUnivereSize; i++)
        {
            cluster[i] = new VEBNode(childUnivereSize);
        }
    } 
}
4

5 に答える 5

3

通常、SOLID 原則の「D」に違反します。

依存性逆転の原則

原則は次のように述べています。

A. 高レベル モジュールは低レベル モジュールに依存すべきではありません。どちらも抽象化に依存する必要があります。B. 抽象化は詳細に依存すべきではありません。詳細は抽象化に依存する必要があります。

実際、コンストラクターは具象クラスをインスタンス化します。それ自体 => 十分な柔軟性がなく、テストが困難です。(モックの再帰?:))

于 2013-04-02T20:02:45.997 に答える
2

これが悪い習慣と見なされるケースは考えられません。

コンストラクターは、クラスのインスタンスを完全に構築することを目的としているため、再帰が必要な場合は、それを使用しても問題ありません。

ただし、わかりやすくするために、単純なコンストラクターを保持し、別の (プライベート) メソッドで再帰を実装することもできますが、それはあなた次第です。もちろん、再帰を別のメソッドに入れる場合は、コンストラクターから呼び出すことができます。結果は同じですが、コードがよりきれいで明確に見える場合があります。

于 2013-04-02T19:40:08.803 に答える
1

一般に、コンストラクターでリソースを集中的に使用することは、推奨されない場合があります。

「コンストラクター」を「ツリー全体の構築」から分離するのはどうですか?

また、サブクラスを作る予定はありますか?

于 2013-04-02T19:39:59.187 に答える
0

このクラスをサブクラス化する場合、サブクラスのインスタンスを作成するためにこのコンストラクターをオーバーライドすることができないため、再帰はかなりの苦痛を伴います。

于 2013-04-02T19:42:57.160 に答える