6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr

Duas funções úteis para manipulação de datas

De tempos em tempos precisamos fazer aquele processamento que só pode ser feito em dias úteis. Seja a data de pagamento de um boleto, o agendamento de uma entrevista e assim por diante.

O desafio disso está no fato de que temos feriados nacionais com dia fixo, feriados com dia variável porém computável (através de algoritmos) e feriados municipais.

Os municipais não tem outra forma de atender senão consultando uma tabela do banco de dados pelo código do município, mas os feriados nacionais fixos nós podemos dar uma bom começo.

Segue abaixo a função fn_dia_util que retorna 1 se o dia for útil e 0 se for sábado, domingo ou feriado (usando a função weekday para isso) e a função fn_proximo_dia_util, que verifica se o próximo dia é util e se não for vai acrescentando um em loop. Mesmo se o feriado cair numa sexta-feira ela retornará o próximo dia útil.


-- ############################################################################################################################################
-- # NOME   : fn_dia_util
-- # PRODUTO  : blog.vitorrubio.com.br
-- # DEVELOPER  : Vitor Luiz Rubio
-- # COPYRIGHT  : 
-- # OBJETIVO  : Dada uma data, diz se é dia útil (1) ou não (0)
-- # VERSAO   : 1.0
-- # DT. CRIACAO : 2014-10-16
-- # DT. ALTERACAO : 
-- #
-- # DEPENDENCIAS :
-- # 
-- # DEPENDENTES :
-- #
-- # HISTÓRICO
-- # 2014-10-16 : Criação
-- #  
-- ############################################################################################################################################ 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo.fn_dia_util
(
 @data datetime
)
RETURNS integer
AS
BEGIN

  declare @result integer
  
  if (
    --VERIFICA SE É SÁBADO OU DOMINGO
    (datepart(weekday, @data) IN (1,7)) or 
    --VERIFICA SE É ALGUM FERIADO NACIONAL DE DIA FIXO
    (convert(Varchar, day(@data))+'/'+convert(Varchar, month(@data)) in (
     '1/1',
     '21/4',
     '1/5',
     '7/9',
     '12/10',
     '2/11',
     '15/11',
     '25/12' 
    ))
    
    --TODO: COLOCAR AQUI OS OUTROS FERIADOS NACIONAIS DE DIA "COMPUTÁVEL" E FAZER UMA CONSULTA A OUTRA TABELA PARA VER OS FERIADOS MUNICIPAIS
   )
  begin
   set @result =  0
  end;
  else
  begin
   set @result = 1
  end;


  RETURN @result

END
GO


/*
TESTE:

 SELECT dbo.fn_dia_util('2015-1-1') -- 0 
 SELECT dbo.fn_dia_util(GETDATE()) -- 1 SE HOJE NÃO FOR FERIADO :)
 --drop function fn_dia_util
*/


-- ############################################################################################################################################
-- # NOME   : fn_next_dia_util
-- # PRODUTO  : blog.vitorrubio.com.br
-- # DEVELOPER  : Vitor Luiz Rubio
-- # COPYRIGHT  : 
-- # OBJETIVO  : retorna o próximo dia útil a partir de uma data
-- # VERSAO   : 1.0
-- # DT. CRIACAO : 2014-10-16
-- # DT. ALTERACAO : 
-- #
-- # DEPENDENCIAS :
-- # 
-- # DEPENDENTES :
-- #
-- # HISTÓRICO
-- # 2014-10-16 : Criação
-- #  
-- ############################################################################################################################################ 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo.fn_next_dia_util
(
 @data datetime
)
RETURNS datetime
AS
BEGIN

  declare @result datetime
  
  set @result = dateadd(day, 1, @data)
  
  while (dbo.fn_dia_util(@result) = 0)
  begin
   set @result = dateadd(day, 1, @result)
  end 


  RETURN @result

END
GO


/*
TESTE:

 SELECT dbo.fn_next_dia_util('2014-12-31') -- 2015-1-2 
 SELECT dbo.fn_next_dia_util('2014-04-18') -- 2014-4-22 porque segunda-feira é feriado
 SELECT dbo.fn_next_dia_util(GETDATE()) -- amanhã SE NÃO FOR FERIADO :)
 --drop function fn_dia_util
*/


Comentários

Postagens mais visitadas deste blog

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Botão Add This para adicionar seu post em qualquer rede

Uso de memória no SQL Server