Microsoft z każdą wersją wprowadza pewne nowe elementy do języka, które teoretycznie powinny poprawić możliwości języka, jak komfort pracy programisty. Od wersji .net 4.0 wprowadzono nowy typ – [mark]dynamic[/mark]. Jego użycie pozwala na wykonanie czynności, które będą dopiero znane w momencie wykonania aplikacji. W dużym skrócie oznacza to, że kompilator pozwoli na wywołanie dowolnej akcji na obiekcie bez zgłoszenia błędu. Kod zostanie bez problemu skompilowany, nawet, jeśli nie istnieje metoda do której się odwołujemy. Błąd wystąpi dopiero w momencie wykonania kodu, jeśli nie będzie tej metody.

W tytule jest code review… Myślałem, że sporo rzeczy już widziałem w kodzie, ale okazuje się, że kreatywność programistów nie zna granic. Ostatnio natrafiłem na kod napisany zgodnie z poniższą ideą.

W kodzie był zdefiniowany interfejs, który umożliwiał tylko odczytać właściwości obiektu:

interface IReadOnlyFoo
{
  int SomeValue { get; }
}

Była również definiowana metoda, która używała obiektów implementujących ten interfejs jako argumentu:

public void DoSomething(IReadOnlyFoo obj)
{
  ...
}

Na razie nic ciekawego. Pisząc kod pewnie nawet nie zajrzałbym do metody DoSomething, tylko po prostu bym ją użył. Tym razem coś mnie podkusiło. Wspomniana metoda wyglądała w następujący sposób:

public void DoSomething(IReadOnlyFoo obj)
{
  ((dynamic)obj).SomeValue = 10;
}

Hmmmm….. Lekkie zdziwienie. W języku z silną kontrolą typów, w sygnaturze metody twierdzę, że nic nie będę robił z obiektem, a w samej metodzie dobieram się do obiektu w bardzo brutalny sposób, który jedyne co gwarantuje to fakt, że kompilator do tego kodu się nie przyczepi. Dodatkowo istnieje duże ryzyko, że jakikolwiek refaktoring interfejsu IReadOnlyFoo spowoduje błąd w naszej aplikacji, który ujawni się dopiero w momencie działania programu.

Co można z tym zrobić… Zastanawiam się, czy Microsoft nie mógłby wprowadzić w nowszej wersji języka mechanizmu, który pozwalałby zdefiniować słowa kluczowe, których nie powinno się używać. Każde użycie takiego słowa powinno wymuszać akceptację tego kodu przez pozostałych członków zespołu.

A może macie jakiś inny pomysł na radzenie sobie z tym problemem?