Sto vivendo un acceso dibattito sul Principio di Responsabilità Unica e su un codice che ho scritto. Sento strongmente che ho ragione e vorrei un feedback imparziale.
Fondamentalmente, abbiamo deciso di registrare un certo modo nei nostri metodi API. Dato che questo codice è esattamente lo stesso in tutti i metodi API, ho scritto un codice per avvolgerlo in una classe che sto chiamando MethodSupport. Penso che dovrei notare, eventualmente pianifichiamo di passare all'utilizzo di un attributo che aggiungerà la registrazione e la gestione degli errori ai nostri metodi API .
public class MethodSupport
{
public string ClassName { get; private set; }
public string MethodName { get; private set; }
public Dictionary<string, string> Parameters { get; private set; }
public MethodSupport (string className, string methodName, Dictionary<string, string> parameters)
{
this.ClassName = className;
this.MethodName = methodName;
this.Parameters = parameters;
}
public string GetSignature()
{
var parametersCsv = String.Join(", ", this.Parameters);
var message = $"{this.ClassName}.{this.MethodName}({parametersCsv})";
return message;
}
public void LogBegin()
{
var message = this.GetSignature() + " : Begin";
Logger.Debug(message);
}
public void LogEnd()
{
var message = this.GetSignature() + " : End";
Logger.Debug(message);
}
public HttpResponseMessage RunLogic(HttpRequestMessage request, Func<HttResponseMessage> func)
{
this.LogBegin();
HttpResponseMessage response;
try
{
response = func();
}
catch (Exception e)
{
response = ExceptionHelper.HandleException(request, this, e);
}
this.LogEnd();
return response;
}
}
Usato così ...
public class TestController : ApiController
{
public HttpResponseMessage Get(int id)
{
var methodSupport = new MethodSupport(this.ToString(), nameof(Get), new Dictionary<string, string> { { nameof(id), id.GetType() } });
var result = methodSupport.RunLogic(Request, () =>
{
//logic for the api method...
});
return result;
}
}
Quindi, sono aperto a una discussione completa sulla validità di questo codice. Detto questo, la risposta specifica del mio collega è che MethodSupport
ha due responsabilità. Log e log in esecuzione. La mia risposta è che il logging non è una responsabilità di questa classe perché potremmo cambiare il modo in cui registriamo e non avrebbe effetto su questa classe (a meno che non cambiassimo contratti / interfaccia). Quali sono i tuoi pensieri?
Dovrei aggiungere, è il nostro architetto e vuole che elimini il codice lasciandoci ripetere tutto ciò che MethodSupport
fa per tutti i nostri metodi API. A sua difesa, c'è un piano per rifare l'applicazione ma non abbiamo nemmeno iniziato su quello.