Przykład fajnej Extension Method

Kod, który mnie natchnął:

var propertiesToDelete = someEntity.Properties
    .Where(x => x.PropertyName == "NAME")
    .ToList();

foreach (var property in propertiesToDelete)
{
    someEntity.Properties.Remove(property);
}

Natchnął bo zmieniłem na:

foreach (var property in someEntity.Properties.Where(x => x.PropertyName == "NAME"))
{
    someEntity.Properties.Remove(property);
}

To było słabe… gdybym sprawdzał po kimś takie coś, to bym może zauważył, ale sam to zrobiłem i nie zauważyłem: modyfikowanie kolekcji po której się iteruje, leci wyjątek. Code Review – wiele oczu patrzy – naprawdę się przydaje, żeby takich problemów unikać. Anyway, nie o tym.

Szerszy kontekst

Properties z powyższego kodu to ICollection<T>, które oznacza zależność jeden do wielu i Entity Framework zmapuje to i dobrze zapisze/wyciągnie z bazy, podobnie będzie też wyglądać odpowiadające mu DTO lub ViewModel:

public class SomeEntity
{
    // składnia C# 6
    public virtual ICollection<Property> Properties { get; } = new List<Property>();
}

Pod spodem jest jednak List<T>. A na typie List jest metoda RemoveAll(Predicate<T> predicate).

Napisałem więc coś takiego

Kod do odpalenia i testy

Dzięki temu wywołanie kodu z którym wystartowaliśmy będzie wyglądać tak:

someEntity.Properties.RemoveAll(x => x.PropertyName == "NAME");

Co zdecydowanie zwiększa czytelność. Ominiemy też wywołowanie LINQ i wszystko odbędzie się na bardziej wydajnej RemoveAll() z klasy List<T>.

Problemy

Wydaje mi się to fajnym kawałkiem kodu. Czy może ktoś widzi tutaj jakiś potencjalny problem?

Advertisements
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Jedna odpowiedź na „Przykład fajnej Extension Method

  1. Upraszczanie i skracania i uczytelnianie zawsze na plus. Na pierwszy rzut oka nie umiem znaleźć minusów takiego rozwiązania.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s