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

Enum com todas as UF's do Brasil e métodos para popular combos.

Recentemente eu publiquei no meu blog uma maneira de dar descrições amigáveis a enums e a popular combos com essas descrições.

Esta classe que eu fiz abaixo, UnidadeFederacao.cs, usa as extensões e helpers que eu fiz para enums e tem dentro dela todas as UF's do nosso país com descrições amigáveis (os nomes dos estados).


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using VtrFramework.Extensions;

namespace VtrFramework.Domain
{

    /// <summary>
    /// uma classe com um enum com todas as unidades da federação e um conjunto de métodos para popular listas e combos com esses enums
    /// está em português porque é muito característica do Brasil
    /// </summary>
    public  class UnidadeFederacao
    {
        #region public properties
        /// <summary>
        /// id do elemento, correspondente a ordem dele no enum
        /// </summary>
        public int Id {get; set;}
        /// <summary>
        /// sigla da unidade
        /// </summary>
        public string Sigla {get; set;}
        /// <summary>
        /// nome da unidade
        /// </summary>
        public string Nome {get; set;}
        #endregion


        #region public static methods

        /// <summary>
        /// Obtém uma lista dos elementos do Enum em si
        /// </summary>
        /// <returns>list of UnidadeFederacaoSigla</returns>
        public static List<UnidadeFederacaoSigla> GetUnidadeFederacaoSiglaList()
        {
            var values = Enum.GetValues(typeof(UnidadeFederacaoSigla)).Cast<UnidadeFederacaoSigla>();
            return values.ToList<UnidadeFederacaoSigla>();
        }

        /// <summary>
        /// obtém uma lista de elementos UnidadeFederacao, que é representado através de uma classe, tem id numérico e o nome completo
        /// </summary>
        /// <returns></returns>
        public static List<UnidadeFederacao> GetUnidadeFederacaoList()
        {
            return (from v in UnidadeFederacao.GetUnidadeFederacaoSiglaList()
             select new UnidadeFederacao
             {
                 Id = (int) v,
                 Sigla = v.ToString(),
                 Nome = v.ToText()
             }).ToList<UnidadeFederacao>();
        }

        /// <summary>
        /// [WebForms]preenche um combo webforms com as unidades da federação
        /// permite que se crie combos onde a descrição é o estado e o value é a UF,
        /// ou a descrição é a UF e o value é um id numérico
        /// </summary>
        /// <param name="ddl">o combo</param>
        /// <param name="text">o que vai ser o text d combo</param>
        /// <param name="value">o que vai ser o value do combo</param>
        /// <param name="primeiroVazio">indica se o primeiro item deve vir vazio</param>
        /// <param name="placeholderPrimeiroVazio">indica o placeholder do primeiro item</param>
        /// <param name="valorPrimeiroVazio">o valor do primeiro item, caso permita vazio, pode ser 0, String.Empty ou null</param>
        public static void PopulaCombo(DropDownList ddl, string text = "Nome", string value = "Sigla", bool primeiroVazio = true, string placeholderPrimeiroVazio = "Escolha um Estado", string valorPrimeiroVazio = "")
        {


            ddl.DataTextField = text;
            ddl.DataValueField = value;
            ddl.DataSource = UnidadeFederacao.GetUnidadeFederacaoList();
            ddl.DataBind();

            if (primeiroVazio)
            {
                ddl.Items.Insert(0, new ListItem(placeholderPrimeiroVazio, valorPrimeiroVazio));
            }
        }

        /// <summary>
        /// [WebForms]preenche um combo webforms com as unidades da federação
        /// permite que se crie combos onde a descrição é o estado e o value é a UF,
        /// ou a descrição é a UF e o value é um id numérico
        /// </summary>
        /// <param name="ddl">o combo</param>
        /// <param name="map">uma expressão lambda que papeia um UnidadeFederacao para um  ListItem</param>
        /// <param name="primeiroVazio">indica se o primeiro item deve vir vazio</param>
        /// <param name="placeholderPrimeiroVazio">indica o placeholder do primeiro item</param>
        /// <param name="valorPrimeiroVazio">o valor do primeiro item, caso permita vazio, pode ser 0, String.Empty ou null</param>
        public static void PopulaCombo(DropDownList ddl, Func<UnidadeFederacao, ListItem> map, bool primeiroVazio = true, string placeholderPrimeiroVazio = "Escolha um Estado", string valorPrimeiroVazio = "")
        {
            if (primeiroVazio)
            {
                ddl.Items.Add(new ListItem(placeholderPrimeiroVazio, valorPrimeiroVazio));
            }

            foreach (var v in UnidadeFederacao.GetUnidadeFederacaoList())
            {
                ddl.Items.Add(map(v));
            }

        }

        #endregion

        #region enum UnidadeFederacaoSigla

        /// <summary>
        /// enum com as UF's de fato
        /// </summary>
        public enum UnidadeFederacaoSigla
        {
            [Text("Acre")]
            AC,
            [Text("Alagoas")]
            AL,
            [Text("Amapá")]
            AP,
            [Text("Amazonas")]
            AM,
            [Text("Bahia")]
            BA,
            [Text("Ceará")]
            CE,
            [Text("Distrito Federal")]
            DF,
            [Text("Espirito Santo")]
            ES,
            [Text("Goiás")]
            GO,
            [Text("Maranhão")]
            MA,
            [Text("Mato Grosso")]
            MT,
            [Text("Mato Grosso do Sul")]
            MS,
            [Text("Minas Gerais")]
            MG,
            [Text("Pará")]
            PA,
            [Text("Paraiba")]
            PB,
            [Text("Paraná")]
            PR,
            [Text("Pernambuco")]
            PE,
            [Text("Piauí")]
            PI,
            [Text("Rio de Janeiro")]
            RJ,
            [Text("Rio Grande do Norte")]
            RN,
            [Text("Rio Grande do Sul")]
            RS,
            [Text("Rondônia")]
            RO,
            [Text("Roraima")]
            RR,
            [Text("Santa Catarina")]
            SC,
            [Text("São Paulo")]
            SP,
            [Text("Sergipe")]
            SE,
            [Text("Tocantis")]
            TO
        }

        #endregion


    }
}


Esta classe faz parte de um pacote maior, um framework que estou fazendo para aplicações web (geralmente Web Forms) simples, pequenas e data - centric. Em breve farei um post explicando o porque dessa decisão.

Comentários

  1. Boa tarde, meu nome é Jiolasio, gostaria de saber como eu faço pramim reaproveitar esse codigo seu no meu projeto java pois criei um enum parecido com esse e na hora da edição não consigo trazer os dados correto, exemplo se for alterar a cidade Barreiras,BA, não traz a Uf correta

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Factory Reset do Samsung Galaxy S

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Detectar o encoding de um arquivo para não corromper ao transformá-lo