Advertisement
Guest User

Untitled

a guest
May 20th, 2018
779
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. O nadużywaniu get'a
  2.  
  3. 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().
  4.  
  5. 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.
  6.  
  7. Tyle teoria. W praktyce możemy spotkać różne dziwne zastosowania get'a w nazwach metod.
  8.  
  9. Przykład 1. Repozytorium
  10.  
  11. public interface IFooRepository {
  12. IQueryable<Foo> GetAll();
  13. Foo GetSingle(int fooId);
  14.  
  15. void Add(Foo entity);
  16. void Delete(Foo entity);
  17. void Edit(Foo entity);
  18. void Save();
  19. }
  20.  
  21. 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źć.
  22.  
  23. Przykład 2. Provider
  24.  
  25. public interface IUserProvider {
  26. User GetCurrentUser();
  27. }
  28.  
  29. 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ść?
  30.  
  31. public interface IUserProvider {
  32. User CurrentUser { get; }
  33. }
  34.  
  35. Po refaktoring kod klientów naszego API się uprościł:
  36.  
  37. var userName = userProvider.GetCurrentUser().Name;
  38.  
  39. vs
  40.  
  41. var userName = userProvider.CurrentUser.Name;
  42.  
  43. Przykład 3. Get Builder
  44.  
  45. public class User {
  46. // ...
  47. public static UserBuilder GetBuilder() {
  48. return new UserBuilder();
  49. }
  50. }
  51.  
  52. 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:
  53.  
  54. User.GetBuilder()
  55. .WithName("foo").WithEmail("bar@example.com")
  56. .Build();
  57.  
  58. Ponieważ tworzymy tutaj nowy obiekt, Create byłoby bardziej właściwą nazwą metody porównajmy:
  59.  
  60. User.CreateBuilder()
  61. .WithName("foo").WithEmail("bar@example.com")
  62. .Build();
  63.  
  64. Dzięki użyciu Create wiemy dokładnie co ta metoda robi - tworzy nowy obiekt.
  65.  
  66. 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
  67. 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