2

再帰関数に渡す必要があるデータがいくつかあります。その関数内で変更されていないことを確認したい。これどうやってするの?

検討:

    static List<Person> GetPeopleWithSameNameAncestors(List<Person> people)
    {
        return people.Where(person => HasAncestorWithName(person.Parents, person.Name)).ToList();
    }

    //Here, nameToLookFor is always the same for every outside call to this function
    static bool HasAncestorWithName(List<Person> lookIn, String nameToLookFor)
    {
        return lookIn.Any(p => p.Name == nameToLookFor || (p.Parents != null && HasAncestorWithName(p.Parents, nameToLookFor)));
    }

実際の状況はもっと複雑です。そのため、nameToLookFor が変更されていないことを確認することが重要です。誰かが簡単に変更できるからです。ああ、「Person」クラスには触れられません。

これが直接不可能な場合、この問題を安全に解決できるパターンを知っている人はいますか?

4

1 に答える 1

2

これについて本当に心配している場合は、Decorator パターンを使用して Person オブジェクトをラップすることを検討してください。ただし、ラップして、不変にします。

public class PersonWrapper()
{
    Person p;

    public PersonWrapper(Person person)
    {
        prop = person;
    }

    Public string Name
    {
        get { return p.Name; }
    }
}

このオブジェクトをコードに渡します。次のようにリストを簡単に変換できます。

var immutablePersonList = personList.Select(p => new PersonWrapper(p));

また、変更可能な ICollection の実装ではなく、IEnumerable などの不変のコレクション型を使用してください。

于 2012-05-21T16:53:58.660 に答える