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
BaraFooBaseper supportare funzionalità che alla fine non rientrano inFooBase(FooBasenon si preoccupa affatto della corrispondenza).FooBasealtrimenti 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 ?