Durante il tentativo di risolvere un problema, spiegato su Forum StackOverflow , qualcuno mi ha consigliato di utilizzare l'iniezione di dipendenza. Per motivi personali, nel momento in cui una persona mi parla dell'uso di un modello di design, comincio sempre a pensare a costruzioni molto difficili. Dopo aver riflettuto e investigato, ho inventato la seguente costruzione (pseudo-codice):
File di intestazione generale
interface ILogger {
public:
void writeMsg(std::string);
};
class Application_Logger : ILogger {
public:
void writeMsg(std::string output) {
std::printf(stringutils::format("Application : %s", output);
}
};
class Test_Logger : ILogger {
public:
void writeMsg(std::string output) {
std::printf(stringutils::format("Test : %s", output);
}
};
File di intestazione Application.h:
ILogger logger = nullptr;
File di intestazione Unit_test.h:
ILogger logger = nullptr;
Application_startup.cpp:
if (logger == nullptr)
ILogger logger = Application_Logger();
Unit_testing_startup.cpp:
if (logger == nullptr)
ILogger logger = Test_Logger();
Common_used.cpp:
logger.writeMsg("<information>");
logger.writeMsg("<more information>");
Output dell'applicazione
Application : <information>
Application : <more information>
Uscita test unità
Test : <information>
Test : <more information>
Non ho idea se funzioni o meno, ma credo che lo faccia (assumendo che sia possibile lanciare un pezzo di codice, abilitando a riempire il puntatore dell'interfaccia).
A mio parere, questa non è una costruzione speciale, ma l'uso di base delle interfacce, non degno di essere chiamato modello di progettazione. Sono corretto e, in caso contrario, cosa deve essere aggiunto / modificato al fine di creare un modello di iniezione diretta al di fuori di questo?
Dopo alcuni primi commenti, sto iniziando a capire perché non si tratta di un'iniezione diretta, quindi di seguito un altro esempio, cercando di realizzare un'iniezione diretta del costruttore molto semplice (potendo semplicemente passare da una interfaccia all'altra di ILogger):
File di intestazione generale
interface ILogger {
public:
void writeMsg(std::string;int);
};
class Simple_Logger : ILogger {
public:
void writeMsg(std::string output;int severity) {
std::printf(stringutils::format("[%d] : %s", severity, output));
}
};
class Detailed_Logger : ILogger {
public:
void writeMsg(std::string output;int severity) {
if (severity == 0) {
std::printf(stringutils::format("Very important : %s", output));
} else {
std::printf(stringutils::format("[%d] : %s", severity, output));
}
}
};
File di intestazione Application.h:
ILogger logger = nullptr;
Application_startup.cpp (basato su args
):
if (logger == nullptr) {
if args == "Simple"
ILogger logger = Simple_Logger();
else : ILogger logger = Detailed_Logger();
}
Se questo è corretto, significa che DI significa che l'elaborazione dell'applicazione è basata su interfacce e che i dati esterni (argomenti, contenuto del file di configurazione, input interattivo, ...) decidono quale implementazione è scelta per tali interfacce . Ho ragione stavolta? (Nella pagina di Wikipedia, non è chiaro da dove proviene il citato service