Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- O nadużywaniu get'a
- Angielskie get możemy przetłumaczyć na polski jako dostać, otrzymać, wziąć lub co miałoby większe zastosowanie w programowaniu jako daj (pobierz z punktu widzenia ergonomii API jest zbyt długie). Na przykład GetCurrentDirectory() moglibyśmy przetłumaczyć jako DajKatalogRoboczy().
- O metodach nazwanych GetXXX zakłada się że działają szybko, w czasie O(1) lub co najgorzej O(n) oraz że nie tworzą nowych obiektów ani nie zmieniają stanu systemu. Możemy to porównać z metodą GET protokołu HTTP która również nie powinna zmieniać stanu serwera.
- Tyle teoria. W praktyce możemy spotkać różne dziwne zastosowania get'a w nazwach metod.
- Przykład 1. Repozytorium
- public interface IFooRepository {
- IQueryable<Foo> GetAll();
- Foo GetSingle(int fooId);
- void Add(Foo entity);
- void Delete(Foo entity);
- void Edit(Foo entity);
- void Save();
- }
- W 99% przypadków repozytorium będzie użyte do interakcji z bazą danych. W tym wypadku bardziej stosowną nazwą dla metod GetAll i GetSingle byłoby FindAll i FindSingle. Przyznacie że lepiej brzmi, dodatkowo Find sugeruje że wykonanie operacji może trochę zająć. System nie daje nam wartości tylko musi ją znaleźć.
- Przykład 2. Provider
- public interface IUserProvider {
- User GetCurrentUser();
- }
- W tym wypadku provider zwraca dane aktualnie zalogowanego użytkownika. Dane znajdują się już w pamięci a więc w teorii Get pasuje jak ulał. W tym wypadku użycie Get's sugeruje nam coś innego, nasza metoda GetCurentUser to nic innego jak klasyczny getter. Więc dlaczego by nie zamienić naszej metody na właściwość?
- public interface IUserProvider {
- User CurrentUser { get; }
- }
- Po refaktoring kod klientów naszego API się uprościł:
- var userName = userProvider.GetCurrentUser().Name;
- vs
- var userName = userProvider.CurrentUser.Name;
- Przykład 3. Get Builder
- public class User {
- // ...
- public static UserBuilder GetBuilder() {
- return new UserBuilder();
- }
- }
- Tutaj z kolei Get użyte jest w nazwie metody która tworzy obiekt buildera. W zamyśle autora API powinno być użyte w następujący sposób:
- User.GetBuilder()
- .WithName("foo").WithEmail("bar@example.com")
- .Build();
- Ponieważ tworzymy tutaj nowy obiekt, Create byłoby bardziej właściwą nazwą metody porównajmy:
- User.CreateBuilder()
- .WithName("foo").WithEmail("bar@example.com")
- .Build();
- Dzięki użyciu Create wiemy dokładnie co ta metoda robi - tworzy nowy obiekt.
- Podsumowując mam nadzieję że po przeczytaniu tego posta będziecie bardziej uważać na dobór czasowników w nazwach metod. Gdybyście mieli problemy z wymyśleniem nazwy metody, to warto zajrzeć tutaj: http://blog.joda.org/2011/08/common-java-method-names.html
- znajduje się tam lista czasowników wraz z wyjaśnieniem (w języku angielskim) kiedy dany czasownik powinien być użyty.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement