Zastosowanie kolekcji w encjach biznesowych

W wielu obiektach biznesowych konieczne jest zastosowanie kolekcji elementów. Typowym przykładem takiego zastosowania jest dokument zawierający pozycje.

Bardzo często w takim kontekście widuję rozwiązanie:

public class Document
{
    public List<DocumentPosition> Positions { get; }
}

public class DocumentPosition
{
    public Document Document { get; }
}

Jest to rozwiązanie złe. Dlaczego?

Otóż:

  1. Nie mamy możliwości łatwego wyszukania, gdzie w naszej aplikacji dodajemy nową pozycję do dokumentu. Możemy jedynie  to mamy albo znaleźć wszystkie użycia własności DDocumentPositions, albo wszystkie użycia metody Add klasy List<> (nie tylko dot. dokumentu). W jednym i w drugim przypadku otrzymamy mnóstwo zupełnie niepotrzebnych nam wyników
  2. Nie mamy żadnej kontroli nad tym czy dana pozycja może być dodana do dokumentu (może już należeć do innego dokumentu)
  3. W każdym miejscu w kodzie, gdzie dodajemy nową pozycje do dokumentu, musimy pamiętać o tym aby ustawić również pole Document w pozycji.

Jak w takim razie powinno to wyglądać?

Po pierwsze, powinniśmy używać interfejsów, zamiast implementacji. Po drugie zdefiniować interfejs reprezentujący implementację zarządzania pozycjami dokumentu.

Wyglądać to może tak:

public interface IDocument
{
    public IDocumentPositions Positions { get; }
}

public interface IDocumentPositions : IEnumerable<IDocumentPosition>
{
    int Count { get; }
    void AddPosition(IDocumentPosition position);
    void RemovePosition(IDocumentPosition position);
    /*...*/
}

public interface IDocumentPosition
{
    IDocument Document { get; }
}

Dzięki temu implementacja metod Add, Count, Remove, może sprawdzać dodatkowe warunki zarządzania kolekcją, łatwo możemy znaleźć użycia metody AddPosition, metoda AddPosition może wewnętrznie ustawiać również pole Document pozycji.

Podsumowując zalety:

  1. większa kontrola nad tym kto kiedy i jak dodaje/usuwa pozycje dokumentu.
  2. w AddPosition możemy ustawić IDocumentPosition.Document
  3. łatwiej znaleźć miejsca w których są dodawane pozycje przez “Find usages”

Comments:2

  1. Hej, Czy istnieje potrzeba aby DocumentPosition posiadalo dowiazanie do Document? Wydaje sie to byc nadmiarowe.
    Co wiecej moze powodowac brzydki styl programowania, gdzie ktos bedzie wykonywal: DocumentPosition.Document.DocumentPositions.

  2. Raczej nie jest to niezbędne, ale pozwala np. zweryfikować kwestię przydziału jednej pozycji do wielu dokumentów. W wielu implementacjach ORM jest to dosyć wygodne.

Leave a Reply

Your email address will not be published. Required fields are marked *