interface czy concrete class?

0

Cześć
mam klasę Order:

public class Order
{
public void AddOrderItem(OrderItem orderItem)
{
//...
}
}

oraz klasę OrderItem

public class OrderItem
{
}

Tak się zastanawiam, bo element zamówieniea jest zawsze ściśle związany z zamówieniem więc pytanie czy dobre praktyki pozwalają robić tak jak to robię wyżej czy pomimno że to ścisłe powiazanie jest oczywiste, to zrobć tak:

public class Order
{
public void AddOrderItem(IOrderItem orderItem)
{
//...
}
}

i wtedy też

public class OrderItem :IOrderItem
{
}

Czy ktoś może mi wytłumaczyć jak jest lepiej i podać argumenty?

1

Nie to (interfejsy) nie ma sensu w tym przypadku bo albo to jest encja albo DTO.

0

To zależy. Jeśli masz jedną jedyną klasę OrderItem i nie zamierzasz po niej dziedziczyć, ani wstrzykiwać zależności (inna klasa np. do testów zamiast tego), to wtedy interfejs Ci w niczym nie pomoże.

Jeśli jednak chciałbyś mieć możliwość zmiany zachowania w pewnych sytuacjach, np. podczas testów... Taki przykład:
Normalnie klasa OrderItem pobiera bezpośrednio dane z bazy danych albo z jakiegoś pliku. Jeśli chciałbyś móc przetestować jednostkowo klasę Order, to wtedy powinieneś stworzyć taki dummy obiekt typu OrderItem, który nie pobiera danych z zewnętrznego źródła, tylko ma je wklepane na stałe. To się nazywa "mockowanie". I w takim przypadku interfejs jak najbardziej będzie użyteczny.

Podsumowując: Jeśli klasa OrderItem pobiera bezpośrednio dane z jakiegoś zewnętrznego źródła i chcesz testować jednostkowo klasę Order, to użyj interfejsu.

3
Juhas napisał(a):

Podsumowując: Jeśli klasa OrderItem pobiera bezpośrednio dane z jakiegoś zewnętrznego źródła i chcesz testować jednostkowo klasę Order, to użyj interfejsu.

W skrócie - jeśli masz zepsutą architekturę użyj interfejsu. :)

0

Ja jestem ogólnie za programowaniem z uzyciem interfejsów. Pod warunkiem, że się wie po co i dlaczego :).
No i faktycznie OrderItem jako klasa nie powinna miec metod pobierania samej siebie, chyba że coś źle zrozumiałem. Co do testowalności kodu to zgoda.

1

@lampasss: generalnie ja też lubię międzymordzia, ale do takich rzeczy jak klasy do obsługi rest api, logiki biznesowej itd. a nie do pojemników na dane ;)

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