Ho due gerarchie di ereditarietà separate che rappresentano oggetti che possono essere "abbinati" l'un l'altro per costituire un FooBarMatch (che contiene riferimenti ai partner FooBase e Bar abbinati):
_____________
| FooBarMatch |
|-------------|
---<>|FooBase |<>---
| |Bar | |
| |_____________| |
| |
| |
______|_______ ________|_____
| <<abstract>> | | Bar |
| FooBase | |______________|
|______________|
^
|
--------------------
_______|______ _______|______
| FooA | | FooB |
|______________| |______________|
La logica effettiva per determinare se una FooBase
è una corrispondenza per una Bar
dipende da quale sottotipo FooBase
finisce per essere (se FooBase
è una FooA
dobbiamo eseguire una logica diversa da quella che sarebbe se fosse a FooB
). Ma tutti gli oggetti FooBase
possono essere confrontati con un Bar
per vedere se sono una corrispondenza.
Attualmente sto gestendo questo come segue: creando un'interfaccia IBarMatchable
con un metodo IsMatch(Bar) : bool
, che è implementato da un metodo astratto in FooBase
. FooA
e FooB
quindi contengono diverse implementazioni per IsMatch(Bar)
. Assomiglia a questo:
_____________
| FooBarMatch |
|-------------|
_______________ ---<>|FooBase |<>---
| IBarMatchable | | |Bar | |
|---------------| | |_____________| |
| IsMatch(Bar) | | |
|_______________| | |
^ ______|_______ ________|_____
| | <<abstract>> | | Bar |
---| FooBase | |______________|
|--------------|
|*IsMatch(Bar)*|
|______________|
^
|
--------------------
_______|______ _______|______
| FooA | | FooB |
|--------------| |--------------|
|IsMatch(Bar) | |IsMatch(Bar) |
|______________| |______________|
Ora per determinare le partite possiamo riguardare solo noi stessi con IBarMatchable
. Questo sembra portare a termine quello che voglio, tuttavia sono curioso di sapere se questo è "buon design" o meno-- Sono molto preoccupato che ora sembra
-
Introduce una dipendenza da
Bar
aFooBase
per supportare funzionalità che alla fine non rientrano inFooBase
(FooBase
non si preoccupa affatto della corrispondenza).FooBase
altrimenti non ha nulla a che fare conBar
. -
Introduce un secondo "motivo per cambiare" (ovvero il modo in cui definiamo una corrispondenza cambia) in
FooBase
- quindi potenzialmente una violazione SRP.
Questo viola SOLID? C'è un modo migliore per progettare ciò che non richiede FooBase
per dipendere da Bar
?