Wpis z mikrobloga

Czy okej jest stworzenie interfejsu z parametrem metody której nazwa odnosi się do czegoś innego w każdej implementacji tej metody?

Przykład:
interfejs: IRepository z metodą Get(int id);
Implementacje:

WarzywoRepository i implementacja metody Get(warzywoId)

OwocRepository i implementacja metody Get(owocId)

Wydaje mi się że to błędne podejście, ale chce się upewnić.

#programowanie
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@maestrozo: pytanie: czy taki interfejs będzie użyteczny. Typ zwracany za każdym razem będzie inny, więc masz różne sygnatury. Trochę nie widzę sensu
  • Odpowiedz
@maestrozo: piątek jest, co przy głupotach będziesz siedział. Piwka się napij.

A czy ty nie mylisz nazwy metody z sygnatura? Bo ani nazwa ani sygnatura w implementacji zmienić się nie mogą. Jedynie nazwa zmiennych w sygnaturze metod implementowanych. Tak, możesz uznać to za dobrą praktykę w twoim projekcie aby nazwy zmiennych miały znaczenie o tym samym poziomie abstrakcji co implementacja. Ale i tak wolałbym p--o niż nad tym się zastanawiać...
  • Odpowiedz
@maestrozo: różne implementacje repository się zdarzają. Np. masz repository, które czyta z postgresa albo drugie, które czyta z memcached. Możesz np. dzięki temu zrobić wzorzec dekorator: na samym dole masz repo z postgresa, które jest owrapowane repo z memcache. Repo z memcache ma taką logikę, że jak się udało coś znaleść to zwraca a jak nie to deleguje akcję do wrapowanego repo (czyli postgresa). Przez to, że masz ten sam
  • Odpowiedz
  • 0
@Saly wiem, ale nie o to mi chodziło. Chodziło mi o same nazwy parametrów metody.
W interfejscie mam Get(int id)
W 1 klasie która go implementuje Get(int owocId)
W 2 klasie Get(int warzywoId)

owocId i warzywoId to nie ta sama nazwa co w definicji metody w
  • Odpowiedz
  • 0
@Saly ale właśnie tak się składa że chcialbym użyć wzorca dekorator, ale to nie do tego przykładu. Tylko w implementacjach tej metody musiałbym mieć inne nazwy, bo obie implementacje pobierałyby to samo, ale na podstawie id różnych rzeczy. Przyklad: W 1 implementacji pobierałbym Psa na podstawie x W 2 natomiast również pobierałbym psa ale na podstawie y Tylko właśnie w takiej sytuacji różniłyby się nazwy parametrów, bo w deklaracji interfejsu byłoby
  • Odpowiedz
@maestrozo: Ogólnie nie ma przeciwwskazań, ale zastanów się jak będziesz używał tego interfejsu, bo jeżeli ma to mieć sens to nie jest to ostatnia abstrakcja, której będziesz potrzebował. Chodzi o to, że klienta też nie powinno interesować jaki identyfikator przekazuje - jeśli wie o tym że posługuje się innym id to interfejs niczego nie wnosi, bo i tak może działać tylko z daną implementacją.
  • Odpowiedz
@maestrozo: Potrzebujesz zrobić interfejs generyczny. IRepository, gdzie T to typ zwracanych elementów. I wtedy masz jedna generyczną metodę getItem(id: T::Id) -> T gdzie każda implementacja bierze idebtyfikator innego typu, skojarzonego z typem zwracanego elementu. Dzięki temu nie przekazesz przez pomyłkę owocId do IRepository i na nie potrzebujesz innych nazw parametrów, bo wszystko masz w typie.
  • Odpowiedz
@MQs: nadal może działać z więcej niż jedną, bo możesz mieć kilka implementacji repozytorium owoców, np jedno trzymające owoce w lodówce a inne w piwnicy. I dzięki interfejsowi ten aspekt implementacji ukrywasz.
  • Odpowiedz