Gdzie w aplikacji powinny znajdować się interfejsy

1

Myślałem nad 3 rozwiązaniami:

  • interfejsy znajdują się w module w którym są implementowane i inne moduły używające tego interfejsu importują go
  • interfejsy używane w wielu modułach znajdują się w folderze shared, a te używane w jednym module, znajdują się w tym module
  • interfejsy znajdują się w module, w którym są używane nawet jeżeli oznacza to duplikację kodu

Użycie oznacza sytuację typu:

constructor(accountRepository: IAccountRepository)
0
  1. Pierwsze nie (bo dependency inversion)
  2. Drugie nie, bo jest bez sensu.
  3. Czemu miałoby oznaczać duplikacje?

I w ogóle skąd pomysł że powinieneś je gdzieś wynosić? Trzymaj je blisko klas które z nich korzystają (nie koniecznie blisko tych które je implementują, chyba że to strategia albo open/close).

3

No albo w module, których ich używa (posiada np. metody przyjmujące dany interfejs jako argument), albo w oddzielnym module z "abstrakcjami" - jeśli taka separacja ma sens.

1

Musisz też sprecyzować o jaki język chodzi, w większości języków typowanych statycznie w większości sytuacji trzecie rozwiązanie nie jest możliwe bo taki interfejs będzie traktowany jako osobny typ

2

Za dużo kombinujesz. Lepiej pomyśl, co będzie najbardziej naturalne w danym przypadku.

accountRepository: IAccountRepository

Jeśli masz interfejs IAccountRepository, to ja bym szukał go w pierwszej kolejności w module, który zajmuje się kontami. Czyli szukałbym modułu account-repository czy accounts (albo o innej podobnej nazwie).

interfejsy używane w wielu modułach znajdują się w folderze shared, a te używane w jednym module, znajdują się w tym module

Folder „shared” to taki escape hatch, jak się nie wie, gdzie coś wrzucić.

interfejsy znajdują się w module, w którym są używane nawet jeżeli oznacza to duplikację kodu

Ale to po co wtedy robić interfejsy w takim razie, jeśli każdy moduł będzie reimplementował je sobie po swojemu?

0
Riddle napisał(a):
  1. Czemu miałoby oznaczać duplikacje?

Przykładowo moduł api-requester, w którym znajduje się implementacja interfejsu ApiRequester - AxiosApiRequester. Jego celem jest uniezależnienie kodu aplikacji od konkretnej biblioteki. W zasadzie to każdy moduł używający tej klasy będzie używał tego samego interfejsu.

interface IApiRequester {
  requestApi<ResponseType>(req: ApiRequest): Promise<ResponseType>;
}
2

Ale gdy np. moduł posts będzie korzystał z interfejsu z modułu account to moduł posts nie będzie w stanie działać bez modułu account, czyli wydzielenie modułu posts do oddzielnej aplikacji albo umożliwienie tworzenia postów komuś innemu niż użytkownik (np. organizacji) będzie trudne lub niemożliwe.

No dobrze, ale to w takim razie należy się zastanowić:

  1. czy to dobrze, że te dwa moduły są tak bardzo ze sobą powiązane?
  2. czemu chcielibyśmy wydzielać moduł z jednej aplikacji do innej?
  3. czy faktycznie istnieje realna potrzeba, aby ktoś inny niż użytkownik tworzył posty?

I każde z tych pytań operuje na znacznie wyższym poziomie niż "gdzie umieścić interfejsy".

1 użytkowników online, w tym zalogowanych: 0, gości: 1