0

これらのプロパティを持つ Clone オブジェクトがあるとします。クローンは、ロード元のファイルに基づいて異なる質量または名前を持つ場合がありますが、これらの値は実行時に変更されることはありません。ただし、インスタンスのクローンには、インスタンスごとに変化する自律性とプロパティがあるため、すべてが同じインスタンスになることはできません。

public class Clone
{
    public float Mass { get; protected set; }
    public string Name { get; protected set; }
    public Clone(string filePath)
    {
        Name = //read name from file
        Mass = //read mass from file
    }
}

今、私が知りたいのは、代わりにこれを行うことの利点と欠点(もしあれば)は何ですか:

public class CloneInfo
{
    public float Mass;
}
public static class Database
{
    public static Dictionary<string, CloneInfo> Lookup;
    [...load whole dictionary from files...]
}
public class Clone
{
    public string Name { get; protected set; }
    public float Mass { get { return Database.Lookup[Name].Mass; } }
    public Clone(string name)
    {
        Name = name;
    }
}

この「リダイレクト」方法では、Clone.Mass の単純な構文を維持しますが、インスタンスごとに Mass 値を保存する必要はありません。何千ものクローンがうろついているので、これは良いことです。構文のために、主に「リダイレクト」に興味があります。特定のクローンの質量が必要になるたびに、単純に手動でデータベース ルックアップを実行できることに気付きましたが、クラスの使用法は適切で単純なものにしておきたいと思います。これに欠点はありますか?プロパティは、静的データベースでの直接検索よりも遅くなりますか? プロパティは Clone インスタンスでスペースを占有しますか?

それとも、おそらく、これは C# が既に私が気付いていない答えを持っているユース ケースですか? 多くのインスタンスに共通する一度だけのプロパティは、この美しい言語のどこかにあるようです

4

2 に答える 2

1

特定のタイプのすべてのクローンが同じ質量を持っている場合、それはサブクラス化の仕事のように聞こえます。

class Clone
{
    public abstract float Mass { get; }
}
class HeavyClone : Clone
{
    public override float Mass { get { return 12345.6; } }
}
class LightClone : Clone
{
    public override float Mass { get { return 1.23456; } }
}

あなたの質問の要点は次のとおりです。処理時間よりもメモリの制約が大きい場合、アプローチによって何らかの利点が得られる可能性があります。メモリが十分にあり、キャッシュのパフォーマンスが問題にならない場合、提案するアプローチはおそらくほとんど価値がありません。確かに、コードがかなり複雑になるようです。

通常のアドバイスは、単純なコードを記述し、パフォーマンスを測定し、パフォーマンスが不十分な場合はパフォーマンスのボトルネックに対処することです。そうすれば、実際にアプリケーションのパフォーマンスに役立つ場所にのみ複雑なコードを配置できます。

もう 1 つの考え:Name文字列を使用して辞書にクローン インデックスを作成する代わりに、単に CloneInfo フィールドを作成しない理由は次のとおりです。

public class CloneInfo  
{  
    public float Mass;  
}  
public class Clone  
{  
    private CloneInfo _info;  
    public float Mass { get { return _info.Mass; } }  
    public Clone(CloneInfo info)  
    {  
        _info = info;
    }  
}  
于 2012-06-10T03:17:10.837 に答える
0

多くの Mass プロパティへのアクセスがあるとします。各アクセスでデータベースから Mass 値をロードしようとすると、アプリケーションにとって非常に負担が大きくなり、ここがボトルネックになります。Mass 値をオブジェクトにキャッシュできる場合は、簡単に一度ロードして、後で使用できるようにしておくことができます。

于 2012-06-10T03:02:47.017 に答える