0

.NET Framewok (C#) で 300 を超えるプロパティを持つオブジェクトを使用することの欠点 (つまり、メモリまたは応答時間) についてお聞きしたいと思います。

プロパティを別のクラスに分けることを考えていますが、ここでの問題は、プロパティ間に大きな関係がないことです。

複雑な計算を行うつもりはありません。インスタンス化されたオブジェクトのプロパティを入力し、オブジェクトを別のプログラムに送り、別のプログラムに送り返します。

どう思いますか

EDIT

プログラムの実行中、オブジェクトは 1 つだけになります。

4

3 に答える 3

10

最大の欠点:可読性

300 個の属性を持つクラス (.NET 属性には特定の技術的な意味があるため、プロパティのことだと思います) は大きすぎて、読んだり理解したりできません。あなたが言うように、それらを関連項目の小さなクラスに分解するthe attributes don't have a big relation between them方法を探す必要があります。

あなたの説明:

複雑な計算を行うつもりはありません。インスタンス化されたオブジェクトの属性を埋めて、オブジェクトを別のプログラムに送り、別のプログラムに送り返します。

これは、システム間を移動する必要がある DTO (データ転送オブジェクト) を示しているようです - 繰り返しになりますが、オブジェクトをいくつかに分解することを検討する必要があります (したがって、関連する項目が変更された場合、インターフェイス全体を変更する必要はありません)。 )。

于 2012-06-19T15:45:39.713 に答える
1

いいえ、そうではないと思います。Infragistics ultragrid には、(私の概算では) 約 1000 未満のプロパティとメソッドがあります。そして、それは正常に実行されています。これらのコントロールを 10 個プログラムに配置するとどうなるでしょうか。どちらも違いはありません。少なくとも 1GB の未使用メモリ領域があれば、好きなだけ追加できると想定しても安全だと思います。

これは私の概算にすぎません。独自の属性も持つことができます。1 つの属性、平均 250 バイト (1 文字 = 2 バイト) なので、

1 073 741 824/250 バイト = 4 294 967.3 プロパティ

さらに、HD の仮想メモリをバックアップとして使用することもできます。

于 2012-06-19T16:05:39.637 に答える
0

一言:抽象化

300 個のプロパティからなる巨大なクラスが 1 つある場合、プロジェクト全体で大きな塊の抽象化は 1 つしかありません。

それを使用しているのはあなただけかもしれませんが、何年も後に戻って何かを変更する必要がある場合、おそらく自分が行ったことに困惑するでしょう.

以下のこのクラスは問題ありませんが、一部の機能が除外される可能性があります。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public char Gender { get; set; }
    public string Social { get; private set; }
}

これらのプロパティはすべて関数型プログラムで使用できますが、さらに多くの機能を提供できます。

以下の例は、Social を独自のクラスに抽象化するためにリファクタリングされていSSNます。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public char Gender { get; set; }
    public SSN Social { get; private set; }
}

public class SSN
{
    public const int SSN_LENGTH = 9;

    public string FirstThree { get; set; }
    public string MiddleTwo { get; set; }
    public string LastFour { get; set; }

    public SSN(string ssn)
    {
        FirstThree = ssn.Substring(0, 3); 
        MiddleTwo = ssn.Substring(2, 2);
        LastFour = ssn.Substring(5, 4);
    }

    public string ToString(bool format = false)
    {
        string formatDelimiter = "";
        if (format)
        {
            formatDelimiter = "-";
        }

        return FirstThree + formatDelimiter + MiddleTwo + formatDelimiter + LastFour;
    }
}

Social をクラスに抽象化することSSNで、社会保障番号をより詳細に制御し、機能を追加できるようになりました。ソーシャルの最後の 4 つで人を探す場合、次のコードを簡単に使用できます。

string lastFour = "0000";
List<Person> Persons = new List<Person>();
Person foundPerson = Persons.Where(x => x.Social.LastFour == lastFour).First();

これはほんの一例であり、より複雑なパーツに拡張できます。これにより、システムの機能が向上し、理解しやすくなります。

于 2012-06-19T16:19:13.420 に答える