No dia a dia de arquiteto, percebo a imensa redundância de código, pois os programadores de modo geral possuem uma imensa dificuldade para identificar quem é responsável pela funcionalidade. Os desenvolvedores, em geral, estão preocupados em colocar seus códigos para funcionar custe o que custar. Enxergando essa dificuldade, resolvi a partir de um Cenário para demonstrar a aplicação correta de um código que foi feito de forma redundante, por estar fora de sua governança. O exemplo é meramente ilustrativo e utilizei uma funcionalidade básica que sempre esta fora de governança em nossos códigos.
Cenário:
Em nosso sistema possuimos Mensagens (Alert, Dialogs) disparados utilizando o mesmo padrão, mudando apenas a mensagem e possivelmente um redirect ou não.
Solução Senso Comum:
O desenvolvedor chama uma rotina que dispara a Mensagem na tela e a coloca dentro de cada formulario web, assim tendo que replicar o mesmo código a cada novo formulario.
Exemplo de codigo:
ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, "alert('Alteração realizada com sucesso');", true);
Problema da implementação:
Em uma eventual alteração, por exemplo de javascript para jquery, teríamos que ir formulário à formulário implementando a alteração, além de dar a responsabilidade de alerta a cada formulário e não ao conjunto de formulários nesse caso a implementação esta errada pois esta fora de sua governança, pois quem deveria possuir tal método seria uma classe responsável pelas funcionalidades que pode ser usadas por qualquer formulário.
Solução:
A solução para o problema é a criação de uma classe que será delegada a responsabilidade de disponibilizar as funcionalidade que podem ser usadas de forma genérica pelos formulários. E nela colocaremos o nosso código.
public static class FormularioFuncionalidades
{
public static void Alert(Page page, string mensagem, string identificador)
{
string strScript = "alert('" + mensagem + "')";
ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, strScript, true);
}
}
Em nossos formulários web chamaríamos o alert dessa maneira:
FormularioFuncionalidades.Alert(page, "Atualização efetuada com sucesso.", href, "OK2");Vantagens:
Respeitaremos o principio SOLID, assim em caso de alteração teremos que faze-la em apenas 1 unico lugar. Por exemplo imagine que agora queremos implementar um redirect e que a Mensagem seja disparada utilizando Jquery UI, nesse caso seria facil em nosso medoto Alert fariamos as alterações abaixo e já estaria replicado para todo formulario que estivesse chamando o Alert.
public static void Alert(Page page, string mensagem, string href, string identificador)
{
page.Controls.Add(PreparaMensagem(mensagem));
ScriptManager.RegisterStartupScript(page, page.GetType(), identificador, PreparaScript(href), true);
}
private static string PreparaScript(string href)
{
string strScript = string.Format("$(document).ready(function () {"
+ "$('#dialog').dialog({"
+ " modal: true,"
+ " width: 400,"
+ " show: 'drop',"
+ " hide: 'drop',"
+ " resizable: false,"
+ " buttons: {"
+ " Ok: function () {"
+ " $(this).dialog('close');"
+ " }"
+ " }"
+ "}).bind('dialogclose', "
+ " function(event, ui) "
+ " { {0}"
+ " }"
+ ");;"
+ "});", (string.IsNullOrEmpty("")) ? "" : "window.location.href = '" + href + "'; ");
return strScript;
}
private static Literal PreparaMensagem(string mensagem)
{
return new Literal() { Text = String.Format("{0}
", mensagem) };
}
Nenhum comentário:
Postar um comentário