Sto lavorando per cercare di capire i principi di progettazione orientata agli oggetti SOLID. Sono stato in grado di ottenere il "SOL" abbastanza facilmente, anche se "L" ha richiesto un po 'di tenuta perché sono cattivo nelle definizioni. Io penso capisco l '"io" (potrei non farlo, il che potrebbe smentire la mia confusione). Ma "D" o Dependency Inversion mi sta facendo incazzare. A seconda delle astrazioni, piuttosto che delle concrezioni ha senso in un certo senso, ma l'applicazione effettiva mi sta facendo inciampare, specialmente quando il termine "nuovo è colla" è gettato lì dentro. Puoi dirmi dove sto sbagliando in un esempio di codice mentre sto cercando di fare il salto da un concetto all'altro.
Supponiamo di avere una classe astratta in C #:
public abstract class IMakeAnIntSetArray
{
public void Populate(int FirstItem, int NumberOfItems)
{
mySet.Add(FirstItem);
NumberOfItems--;
for (int i = 0; i < NumberOfItems; i++)
{
mySet.Add(GetNext());
}
}
protected abstract int GetNext();
protected List<int> mySet;
public List<int> Set
{
get { return mySet; }
}
}
È implementato dalle classi
public class CountNumbersLikeAHuman : IMakeAnIntSetArray
{
protected override int GetNext()
{
int next = mySet.Last();
next++;
return next;
}
}
e
public class SomeMathInvolved : IMakeAnIntSetArray
{
protected override int GetNext()
{
int next = mySet.Last();
if(next % 2 == 0)
{
return next / 2;
}
else
{
return ((next * 3) + 1);
}
}
}
Uno dei seguenti è un modo corretto per applicare il principio di inversione delle dipendenze o mi manca qualcosa? Come modifico questo per utilizzare correttamente il DIP? O sono semplicemente attaccato a "new is glue"?
class Program
{
static void Main()
{
CountNumbersLikeAHuman simpleEnough = new CountNumbersLikeAHuman(); //wrong?
SomeMathInvolved akaChangeYourMajorToEnglish = new SomeMathInvolved(); //also wrong?
//Or . . .
IMakeAnIntSetArray useYouFingersAndToes = new CountNumbersLikeAHuman();
IMakeAnIntSetArray makeItWayMoreComplicated = new SomeMathInvolved();
//Or am I completely off here?
}
}