Obejrzałem wczoraj keynote Grega Younga zatytułowany 8 lines of Code. Keynote stary (bo Java lambdy już ma) ale ogólnie temat ciekawy. Pokazane w niej jest, jak mając za nadrzędny cel prostotę, powinniśmy/możemy zmienić kod aby był prostszy (duh!) i czytelniejszy. Zgadzam się, że im prostszy kod tym lepszy, niemniej wydaje mi się, że to co pokazał Greg takie nie jest. No bo zobaczmy – kod z którego wyszliśmy jest następujący:
public class DeactivateInventoryItem { private readonly ItemRepository repository; public DeactivateInventoryItem(ItemRepository repository) { this.repository = repository; } public void Deactivate(Guid id, string reason) { var item = repository.GetById(id); item.Deactivate(reason); repository.Save(item); } }
a skończyliśmy na:
void BootStrap() { handlers.Add(x => Deactivate(new ItemRepository(),x)); handlers.Add(x => Reactivate(new ItemRepository(),x)); handlers.Add(x => CheckIn(new ItemRepository(), new BarService(), x)); }
I czy rzeczywiście to jest prostsze? Nie wydaje mi się. Koncepcja lambda oraz fixowanie/zamykanie zmiennych jest równie skomplikowana jak przytoczony dynamic proxy. Poza tym przy takim rozwiązaniu zakres zmiennych nie jest od razu jasny. A już na pewno nie dla wspomnianego junior deva.
Dodatkowo przedstawiony przez Greg’a sposób na stworzenie zasięgu PerHttpRequest (()=>new ItemRepository() zamiast new ItemRepository()) jest błędny. Jeśli wywołamy handler’a dwukrotnie – zmienna nie będzie miała oczekiwanego zasięgu. Trzeba o tym wiedzieć i pamiętać, a to powoduje, że w kodzie pojawia się magia, która tak bardzo była negowana.
Trzeba przyznać rację, że kod z atrybutami, na pierwszy rzut oka, nie był jasny. Trzeba odszukać co robią dane atrybuty i się z nimi zapoznać. Jednakże ich liczba i przykład użytych były źle dobrane. No bo kto w swoim kodzie ma atrybut [SwallowExceptions]? Ręka w górę…
Sama prezentacja niesie sporo wartości – warto upraszczać kod. Im go mniej tym mniej potencjalnych miejsc powstania błędu. Warto także wiedzieć jak działa nasz kod i unikać magii. I na koniec jeszcze jedno zdanie z którym się zgadzam w 100%:
“You own all the code in your project”
Dobrze powiedziane i trzeba mieć to na uwadze gdy chcemy użyć nowej biblioteki w naszym projekcie. Jakby ktoś nie widział jeszcze tego keynote’a to polecam.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl