Created
January 11, 2019 20:38
-
-
Save MarcoNicolodi/2519f162fa92140ba811d58e30814f1b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
namespace ChainOfResponsability { | |
//pseudo classes | |
public class Eficacia | |
{ | |
public int Eficaz { get; internal set; } | |
} | |
public class Avaliacao | |
{ | |
public bool IsAvaliado { get; set; } | |
public bool IsAprovado { get; set; } | |
} | |
//Abstractions | |
public interface IRuleHandler<Requisicao, Retorno> { | |
IRuleHandler<Requisicao, Retorno> ProximaRegra (IRuleHandler<Requisicao, Retorno> handler); | |
Retorno Rodar (Requisicao request); | |
} | |
public abstract class Regra<Requisicao, Retorno> : IRuleHandler<Requisicao, Retorno> where Retorno : class { | |
private IRuleHandler<Requisicao, Retorno> _proximaRegra; | |
public IRuleHandler<Requisicao, Retorno> ProximaRegra (IRuleHandler<Requisicao, Retorno> regra) { | |
_proximaRegra = regra; | |
return regra; | |
} | |
public virtual Retorno Rodar (Requisicao request) => _proximaRegra?.Rodar(request); | |
} | |
//Request | |
public class Requisicao { | |
public bool Aprovar { get; } | |
public Avaliacao Avaliacao { get; } | |
public bool CriterioExiste { get; } | |
public Eficacia Eficacia { get; } | |
public Requisicao () { | |
} | |
} | |
//Result | |
public class Label | |
{ | |
protected Label(string Result) | |
{ | |
this.Valor = Result; | |
} | |
public string Valor { get; } | |
public static Label AprovadoOn() => new Label("aprovadoOn"); | |
public static Label AprovadoOff() => new Label("aprovadoOff"); | |
public static Label ReprovadoOn() => new Label("reprovadoOn"); | |
public static Label ReprovadoOff() => new Label("reprovadoOff"); | |
} | |
public class AvaliacaoInexistente : Regra<Requisicao, Label> { | |
public override Label Rodar(Requisicao request) | |
{ | |
var avaliacao = request.Avaliacao; | |
if(avaliacao == null) | |
{ | |
return avaliacao.IsAvaliado | |
? request.Aprovar | |
? avaliacao.IsAprovado | |
? Label.AprovadoOn() | |
: Label.AprovadoOff() | |
: !avaliacao.IsAprovado | |
? Label.ReprovadoOn() | |
: Label.ReprovadoOff() | |
: avaliacao.IsAprovado | |
? Label.AprovadoOff() | |
: Label.ReprovadoOff(); | |
} else { | |
return base.Rodar(request); | |
} | |
} | |
} | |
public class CriterioInexistente : Regra<Requisicao, Label> { | |
public override Label Rodar(Requisicao request) | |
{ | |
if (!request.CriterioExiste) | |
return request.Aprovar ? Label.AprovadoOff() : Label.ReprovadoOff(); | |
else | |
return base.Rodar(request); | |
} | |
} | |
public class EficaciaInexistente : Regra<Requisicao, Label> { | |
public override Label Rodar(Requisicao request) | |
{ | |
if (request.Eficacia == null) | |
return request.Aprovar ? Label.AprovadoOff() : Label.ReprovadoOff(); | |
else | |
return base.Rodar(request); | |
} | |
} | |
public class Eficaz : Regra<Requisicao, Label> { | |
public override Label Rodar(Requisicao request) | |
{ | |
switch (request.Eficacia.Eficaz) | |
{ | |
case 0: | |
return request.Aprovar ? Label.AprovadoOff() : Label.ReprovadoOn(); | |
case 1: | |
return request.Aprovar ? Label.AprovadoOn() : Label.ReprovadoOff(); | |
default: | |
return request.Aprovar ? Label.AprovadoOff() : Label.ReprovadoOff(); | |
} | |
} | |
} | |
class Program { | |
static void Main (string[] args) { | |
var request = new Requisicao(); | |
var regras = new AvaliacaoInexistente() | |
.ProximaRegra(new CriterioInexistente()) | |
.ProximaRegra(new EficaciaInexistente()) | |
.ProximaRegra(new Eficaz()); | |
var resultado = regras.Rodar(request); | |
return resultado.Valor; | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment