Ho trovato questo esempio di codice che spiega il principio Open / Closed .
Codice prima dell'applicazione del principio:
public class Logger
{
public void Log(string message, LogType logType)
{
switch (logType)
{
case LogType.Console:
Console.WriteLine(message);
break;
case LogType.File:
// Code to send message to printer
break;
}
}
}
public enum LogType
{
Console,
File
}
E codice refactored:
public class Logger
{
IMessageLogger _messageLogger;
public Logger(IMessageLogger messageLogger)
{
_messageLogger = messageLogger;
}
public void Log(string message)
{
_messageLogger.Log(message);
}
}
public interface IMessageLogger
{
void Log(string message);
}
public class ConsoleLogger : IMessageLogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
public class PrinterLogger : IMessageLogger
{
public void Log(string message)
{
// Code to send message to printer
}
}
Puoi spiegarmi il motivo per mantenere ancora Logger
class con private IMessageLogger
istanza? Lo eviterei semplicemente:
public interface ILogger
{
public void Log(string message);
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
public class PrinterLogger : ILogger
{
public void Log(string message)
{
// Code to send message to printer
}
}
L'unica ragione per cui posso pensare è che nella soluzione suggerita con Logger
class, potremmo ancora fare riferimento a questa classe nel codice client, ma dobbiamo ancora modificare tutte le chiamate Log(msg)
per rimuovere gli argomenti LogType
.