Sto avendo un po 'di indecisione qui e mi piacerebbe avere una prospettiva su questo.
Attualmente raccolgo oggetti da un'API di terze parti (a casa per il mio progetto e al lavoro) e sto facendo del mio meglio per aderire il più strettamente possibile ai principi SOLID. Tutto questo è scritto usando C #. Giusto per essere chiari qui: questa non è una linea di applicazione aziendale, sto creando un framework per il riutilizzo che avvolge dettagli più complicati di un'API di terze parti.
Quindi il mio problema è questo: Ho questi oggetti racchiusi nelle mie istanze concrete. Chiameremo gli oggetti nativi che sono avvolti nA e nB e i wrapper A e B che contengono rispettivamente nA e nB:
class A { private nA _nA }
class B { private nB _nB }
nB non può essere creato senza passare un riferimento a nA. Quindi, per evitare di esporre al pubblico l'oggetto nA, ho un metodo factory per creare il wrapper B in modo che possa passare in nA al costruttore di nB. Quindi, prima domanda: sto assumendo che questa sia una pratica corretta? Non voglio finire con un sacco di fabbriche o metodi di fabbrica, se posso aiutarlo (c'è un bel po 'da concludere).
Ora, va tutto bene. Posso creare A e B senza problemi a causa di quanto sopra. Ma ora ho un'altra ruga. Devo avvolgere un metodo chiamato M1 (nB) dove il parametro è di tipo nB, che è memorizzato all'interno del wrapper B:
public class A { private nA _nA; public M1(B) { _na.M1( ??? );} }
Ma nB è inaccessibile. Quindi, qual è la procedura migliore per passare nB al metodo nA.M1 () memorizzato nel wrapper A?
Potrei imporre l'uso di tipi concreti e rendere nB un membro interno sul wrapper B in questo modo:
public class B { internal nB { get; private set; } }
Ma questo introdurrà un accoppiamento stretto. Ha importanza dal momento che nA e nB sono strettamente accoppiati comunque?
Questi tipi di problemi mi fanno sempre venire il mal di testa, quindi se qualcuno potesse risparmiare qualche consiglio, sarebbe bello.
Inoltre, mentre cerco di aderire a SOLID nel miglior modo possibile, sono consapevole che sono linee guida. Dopo tutto, non sono regole fisse o una religione. Quindi, se non ho altra scelta che rompere i principi SOLIDI per ottenere ciò di cui ho bisogno, così sia.
Alcuni codici per illustrare ulteriormente il mio problema:
interface IGraphics
{
CopyResource(Texture src, Texture dest);
}
interface ITexture
{
// Stuff for textures that have no bearing on this example.
}
class Graphics
: IGraphics
{
// Native object (or object that wraps a native object).
private ID3D11Context1 _d3dContext;
public CopyResource(Texture src, Texture dest)
{
// Do validation, etc...
// How can I do this with interfaces?
// Internals are not allowed on interfaces by the language
_d3dContext.CopyResource(src._d3dTexture, dest._d3dTexture);
}
}
class Texture
: ITexture
{
// Native object (or object that wraps a native object).
private ID3D11Texture2D _d3dTexture;
// Other stuff
}