3

実際にはセパレーターで結合された複数の文字列である文字列プロパティを持つクラスがあります。

次のようなプロキシプロパティを持つのが良い形かどうか疑問に思っています:

public string ActualProperty
{
    get { return actualProperty; }
    set { actualProperty = value; }
}

public string[] IndividualStrings
{
    get { return ActualProperty.Split(.....); }
    set 
    { 
            // join strings from array in propval .... ;
            ActualProperty = propval;
    }
}

私が見落としているリスクはありますか?

4

6 に答える 6

2

配列は実際のデータであり、単一文字列のものは便利なようです。それは問題ありませんが、シリアル化やメンバーごとのクローン作成など、両方の書き込み可能なプロパティを取得および設定するものに注意してください。

私はそうだと思います。

  • 配列をプロパティとして保持する
  • メソッドを提供しGetJoinedString(string seperator)ます。
  • SetStrings(string joined, string seperator)またはParse(string joined, string seperator)メソッドを提供します。

現実的には、文字列の区切り文字は実際にはクラスの一部ではなく、一時的な詳細です。たとえば、CSVアプリケーションがコンマを渡すことができ、タブ区切りのアプリがタブを渡すことができるように、それへの参照を明示的にします。アプリのメンテナンスが簡単になります。また、同じ実際のデータに対して2つのゲッターとセッターがあるという厄介な問題を取り除きます。

于 2008-09-17T22:06:02.663 に答える
2

私の意見では、設定可能な 2 つのプロパティを一緒にリンクするのはよくありません。これが本当に必要な場合は、プロパティの代わりに明示的な get / set メソッドを使用するように切り替えます。明白でない副作用を持つコードは、ほとんどの場合、後であなたを悩ませます。物事をできるだけ単純かつ簡単に保ちます。

また、部分文字列を含むフォーマットされた文字列であるプロパティがある場合、プリミティブ型を誤用するのではなく、そのプロパティの個別の構造体/クラスが本当に必要なようです。

于 2008-09-17T20:53:25.727 に答える
1

「良い」を定義します。壊れてはいけません (渡された区切り文字Split()が個々の文字列自体で決して許可されないことを適切に保証できなかった場合を除きます) が、必要IndividualStrings以上に頻繁にActualProperty解析actualPropertyすることになります。もちろん、逆の場合はうまくいっています...両方が頻繁に呼び出され、不要な解析や連結が受け入れられない場合は、両方を保存し、値が変更されたときに再解析します。

于 2008-09-17T20:46:39.347 に答える
1

プロパティは、クラスの非常に単純なメンバーであることを意図しています。プロパティの値の取得または設定は、重大な副作用のない簡単な操作と見なす必要があります。

プロパティを設定すると、割り当てられたプロパティ以外のクラスのパブリック値が変更される場合、これは基本的な割り当てよりも重要であり、おそらくそのプロパティには適していません。

「複雑な」プロパティは危険です。呼び出し元の期待を裏切るからです。プロパティは (副作用を伴う) フィールドとして解釈されますが、フィールドとして値を割り当て、後でその値を取得できることが期待されます。このように、呼び出し元は、複数のプロパティに割り当てて、後でそれらの値を再度取得できることを期待する必要があります。

あなたの例では、両方のプロパティに値を割り当てて取得することはできません。1 つの値が他の値に影響します。これは、プロパティの基本的な期待を破ります。両方のプロパティに同時に値を割り当て、両方のプロパティを読み取り専用にするメソッドを作成すると、値が設定されている場所がはるかに理解しやすくなります。

さらに、余談として:

一般に、プロパティから一時的な配列を返すことは悪い習慣と考えられています。配列は不変かもしれませんが、その内容はそうではありません。これは、オブジェクトに保持される配列内の値を変更できることを意味します。

例えば:

YourClass i = new YourClass();
i.IndividualStrings[0] = "Hello temporary array!";

このコードはプロパティの値を変更しているように見えますIndividualStringsが、実際には配列はプロパティによって作成され、どこにも割り当てられていないため、配列と変更はすぐに範囲外になります。

public string ActualProperty { get; set; }

public string[] GetIndividualStrings()
{
    return ActualProperty.Split(.....);
}

public void SetFromIndividualStrings(string[] values)
{
    // join strings from array .... ;
}
于 2010-03-06T00:03:04.187 に答える
0

あなたの「セット」はリスクが高いと思います.誰かがすでに結合された値のシーケンスを渡す必要があることを知らなかった場合、または上記の例にそれが欠けている可能性があります. 文字列に既に区切り文字が含まれている場合はどうなりますか?壊れるでしょう。

このプロパティが使用される頻度によっては、パフォーマンスが優れていないと確信しています。

于 2008-09-17T20:46:08.300 に答える
0

このデザインの利点が何であるかはわかりません。分割は拡張メソッドでより適切に提供されると思います。

少なくとも、IndividualStrings プロパティのセッターを削除するか、string[] SplitActualProperty() と void MergeToActualProperty(string[] パーツ) の 2 つのメソッドに移動します。

于 2008-09-17T20:47:46.037 に答える