Obsessão por tipos primitivos

  Рет қаралды 6,462

EximiaCo - Excelência Tecnológica

EximiaCo - Excelência Tecnológica

Күн бұрын

Пікірлер: 81
@plablooo
@plablooo 4 жыл бұрын
Cara, até momento não tinha encontrado em nenhum outro canal um conteúdo tão rico e técnico como os que tem no EximiaCo. Parabéns!
@jeffersonferreira43
@jeffersonferreira43 4 жыл бұрын
Programação Avançada...que todo mundo deveria saber.
@edudolino
@edudolino 4 жыл бұрын
Um vídeo de menos de 20 minutos que vale mais que muitos livros. E eu achava que já sabia alguma coisa de programação.
@EusouFeioEdai
@EusouFeioEdai 4 жыл бұрын
Utilizar struct faz total sentido. Ótimo conteúdo
@karamazovsc
@karamazovsc 3 жыл бұрын
Esse tipo de conteúdo agrega muito, obrigado!
@DiasDeDev
@DiasDeDev 4 жыл бұрын
Usar exceções como controle de fluxo é um baita assunto eu eu gostaria muito de te ouvir falar sobre isso. Abraços e parabéns pelo trabalho. Sou seu fã!
@rhmuller
@rhmuller 4 жыл бұрын
Excelente vídeo, parabéns. Uma didática muito boa, e mesmo com um exemplo "simples" como um CPF, conseguiu deixar claro o problema e a solução.
@wagnerbreggi2943
@wagnerbreggi2943 3 жыл бұрын
Muito bom e muito obrigado por todas as AULAS que vc está disponibilizando nesse canal. Muito obrigado mesmo !
@ruandias6257
@ruandias6257 Жыл бұрын
Explodiu minha mente! Parabéns pelo excelente conteúdo! 🎉🎉🎉
@ciroformenton
@ciroformenton Жыл бұрын
Conhecimento que vale OURO!!!!
@ddrsdiego
@ddrsdiego 4 жыл бұрын
Eu tinha aprendido sobre obsessão por tipos primitivos num post do Vladimir Khorikov aonde por consequência entendi sobre Value Objects. A diferença da implementação é que ele cria um método estático para criar o objeto encapsulamento numa classe Result que diz se foi possível ou não criar a classe. Excelente vídeo.
@daltoncorbetta7206
@daltoncorbetta7206 4 жыл бұрын
Sou programador iniciante no C# e tenho que concordar, raramente vi conteúdo técnico com tanta riqueza de detalhes e tão bem explicado como os da EximiaCo. Parabéns e sucesso a vocês! Vocês mais que merecem.
@danielchagas9502
@danielchagas9502 4 жыл бұрын
Muito obrigado por compartilhar conhecimento. Muito precioso para quem é Jr. e quer se aprimorar! Vlw!
@adsonsantos1930
@adsonsantos1930 Жыл бұрын
Que aula maravilhosa! Conteudo super rico, simples mas muito util
@MrRomviana
@MrRomviana 4 жыл бұрын
Excelente exposição. Eu aprendi a programar nos anos 80, quando muitos computadores eram limitados a 64k, 128k de RAM, no máximo; quando os dados tinham que ser gravados em diskettes. Tínhamos que economizar memória em tudo... até no nome da variável;no tamanho do código fonte, pra poupar memória. Muitas vezes usávamos C ao invés de CONTADOR num laço FOR. A exemplo de CPF e CNPJ, são números, portanto, o ideal, no meu entendimento, é usar o tipo correto para o dado. No caso do CPF, é preciso uma variável numérica de 8 bytes pra gravar um CPF, mas se usar string, precisará de 11. Multiplique esses 3 bytes a mais trafegando pelo seu HD, seu banco de dados, pela sua rede, pela memória de servidores de banco, de aplicações, e client´s. O mesmo vale para aquele campo "S" ou "N", que, no MS-SQL por exemplo, pode ser representado por um campo tipo BIT ao invés de um CHAR(1), sendo que BIT é 8 vezes MENOR que CHAR(1). Em muitas tabelas pequenas, onde o identificador do registro não vai passar de 100, pode-se usar o campo Tynint. Esse identificador poderá ser replicado em muitas outras tabelas filhas ( FK ) e essas normatizações ajudam muito a reduzir o peso do banco e das aplicações. Eu me assusto quando vejo muitas APPS com 20, 30, até 40 MB em executáveis e agregados, sendo que a maioria delas poderia facilmente não ultrapassar os 10MB.
@dcernach
@dcernach Жыл бұрын
Excelente ponto!
@kevinallen4872
@kevinallen4872 4 жыл бұрын
Que eloquência, meus amigos... que eloquência!
@dcernach
@dcernach Жыл бұрын
Isso de fato é ótimo... Costumo usar Records no .NET7, uma coisa que acaba deixando um pouco mais chato é a serialização, onde há de se implementar os devidos JSON/XML Serializers e Value Converters no caso de utilizar esses tipos em WebApi's e no Entity Framework... No meu caso, eu evito implementar os Implicit Operators, escolhendo geralmente um factory method, como por exemplo Cpf.From(value). Sou meio contra a lançar Exceptions de construtores, No fim, eu acredito que é um trabalho que vale muito a pena e sempre o faço... Existem até Code Generators em .NET7 para implementar automaticamente esses tipos...
@AndreAbrantesBR
@AndreAbrantesBR 4 жыл бұрын
Parabéns, ElemarJr! Vídeos de excelente qualidade! Está contribuindo muito com a comunidade. Já pensou em fazer uma "live" com Perguntas e Respostas? Acho que isso poderia contribuir ainda mais! Grande abraço!
@EximiaCo
@EximiaCo 4 жыл бұрын
Por agora, ainda nada planejado.
@lsalomao07
@lsalomao07 4 жыл бұрын
Conteúdo do canal está incrível! E com uma explicação simples.. Parabéns Elemar
@devPauloPinheiro
@devPauloPinheiro 4 жыл бұрын
Agora você me puxou na memória uma obra que me marcou na juventude e início da carreira, o livro de Gane e Sarson, "Análise Estruturada de Sistemas", em que um dos entregáveis do analista era algo como um dicionário de dados. Interessante porque saía dos tipos primitivos e forçava a pensar em propriedades comuns. O ORM que trabalho atualmente é o Django (Python) e ele tem suporte a criação de tipos personalizados para uso no ORM, e vejo como um recurso importante para tirar esses detalhes do 'utils' :) e concentrar em um lugar mais apropriado. Abraço e parabéns pelos vídeos, que tem sido muito úteis até para mim, que não sou do mundo .net.
@felipemelo437
@felipemelo437 4 жыл бұрын
Ótimo conteúdo, com certeza um dos melhores canais BR sobre dot net. Obs : Vale um video sobre o mapemaneto em ORMs hein... Obrigado ...
@rodcorporation
@rodcorporation 4 жыл бұрын
Explicação perfeita Elemar!!!! boa perspectiva sobre a situação. Achei mto bacana.
@perciodalpozzo
@perciodalpozzo 2 жыл бұрын
Elemar sou teu fã :) Obrigado sempre pelos conteúdos
@diegocantelli
@diegocantelli 4 жыл бұрын
Vendo essas aulas percebo que não sei programar, mas aos poucos chego lá!
@alessandrodesouza
@alessandrodesouza 4 жыл бұрын
#tmj
@vmamore
@vmamore 4 жыл бұрын
Muito massa Elemar, obrigado, depois que começamos a criar tipos para as coisas é um caminho sem volta kkkk abraço
@rafaelrosa3841
@rafaelrosa3841 4 жыл бұрын
o que eu vejo nisso é que utilizando o CPF como classe isso pode dificultar no mapeamento para um ORM, o que praticamente obriga a utilizar outra camada de classes que serão mapeadas e de classes que são de domínio, é um trade-off, além de no caso de utilizar um MVC faríamos 3 conversões de objeto, objeto mapeado -> entidade de dominio -> model, mais camadas mais complexidade e mais processamento também, muitas vezes não é uma decisão tão trivial.
@AlbertoMonteiro
@AlbertoMonteiro 4 жыл бұрын
Esses drops em vídeos são sensacionais!!
@vagnermello
@vagnermello 4 жыл бұрын
É sempre um prazer assistir seus videos! Muuuuuuuuuito obrigado :)
@carloswanderley8868
@carloswanderley8868 4 жыл бұрын
Que abordagem incrível! Uma aula de conhecimento e boas práticas. Adotarei essa abordagem a partir de agora. Parabéns!!!
@putzz67767
@putzz67767 2 жыл бұрын
Bela aula!
@nacasadobeirinha1524
@nacasadobeirinha1524 4 жыл бұрын
Sempre com otimo conteudo, meus parabens! Eu acho que faz total sentido, sempre que faz sentido para não tornar "complexo" demais transformo atributos em campos. Outra coisa que tenho costume de fazer é quando classes tem algumas regras, crio algo relacionado a regras que é consumindo pela classe em si. Exemplo se CPF tivesse muitas regras, teria um CPFRegra ou validacao e as implementações estariam ai, sendo consumidas pela CPF via agregação, mas isso pensando em casos grandes e é claro em arquitetura. O que acha do uso de agregação pensando em casos maiores, onde temos uma classe Processo e ela contem regras, validacoes e outros itens, acharia valido adicionar outras classes com essas responsabilidades via agregacao. O implicit realmente nos codigos que ja visitei de empresas que trabalhei não havia o costume de ser utilizado o que acho um desperdicio, pois fazemos conversao implicita com primitivos direto. Mais uma vez parabéns pelo conteudo. Grande abraço!
@CleberRobertoMovio
@CleberRobertoMovio 3 жыл бұрын
só uma dúvida, no caso do nome, seria correto tratar como tipo também, levando em consideração a abordagem, seria um tipo porque o nome poderíamos ter a separação do nome como lastname, middlename e firstname, seria essa a ideia?
@davidg12bh
@davidg12bh 4 жыл бұрын
Excelente Aula.
@rafaelsanjosify
@rafaelsanjosify 4 жыл бұрын
Excelente conteúdo, parabéns.
@omaximilliam
@omaximilliam 4 жыл бұрын
Muito bom, Elemar. Seu conteúdo é excelente. O seu mindset está agregando muito na minha carreira, obrigado!
@gustavoferrazfontes6981
@gustavoferrazfontes6981 4 жыл бұрын
Elemar, o ideal é que tenhamos as nossas regras e validações encapsuladas em nosso Domain model, como você exemplificou no vídeo, você deu uma expressividade maior para o que é o CPF, criando o tipo CPF. Imagine que há um Fail Fast ou qualquer validação previa dos dados de um payoload que um endpoint recebe. Entre esses dados, eu tenho o CPF onde eu já queria valida-lo. Gostaria de saber: Como você trataria essa questão de validação? Como você evitaria a duplicação de código e a descentralização de regras e validações do seu Domain Model? Excelente o vídeo. Parabéns.
@rodolfonat
@rodolfonat 4 жыл бұрын
Quando voce mandar enviar o request com o seu payload, o campo cpf vai vir como string (ou nulo, ou qlq coisa pq vc nao garante o que vem do client). Esse request vai bater no endpoint. O .net vai converter a string cpf do payload para o Tipo Cpf usando o operador implicit e nesse momento vai fazer a validação.
@rodolfonat
@rodolfonat 4 жыл бұрын
No caso, o Elemar tá falando que validação de CPF é tão básico que nao deveria ser considerada como regra de negócio.
@HumbertoPereira1994
@HumbertoPereira1994 4 жыл бұрын
Excelente video Elemar !!
@viniciusbeloni3199
@viniciusbeloni3199 2 жыл бұрын
Preciso fazer algumas perguntas. Criei minha classe de CNPJ e CPF e tive alguns problemas: 1. O Dapper não reconhece, precisa implementar um TypeHandler pra resolver e implementar um operador implicito para string 2. JSON não serializa como string, preciso entender como resolver sem fazer gambiarra 3. O Swagger não sabe mostrar os tipos CNPJ e CPF como string Teoricamente são problemas esperados, afinal, é uma struct e não uma string, mas é uma dor de cabeça a mais pra resolver. Pensei em só criar esses tipos para as camadas da API, pq assim eu garanto a entrada. De qualquer maneira, ficou muito legal.
@ojuliomiguel
@ojuliomiguel 3 жыл бұрын
Nossa, muito bom!
@cjaferre
@cjaferre 4 жыл бұрын
Grande Elemar! No modelo proposto, a validação de Cpf ocorre ao construir o objeto. Num cenário onde vou ler grandes quantidades de "Employee" de um storage, onde previamente já validei o Cpf, o que recomenda para evitar ter que revalidar um Cpf desnecessariamente? Grande abraço!
@rodolfonat
@rodolfonat 4 жыл бұрын
é a função Parse que ele mostrou no vídeo. Parse: Converte sem validar. TryParse: Converte com validação.
@cjaferre
@cjaferre 4 жыл бұрын
@@rodolfonat Parse chama TryParse e a validação ficaria no TryParse (mas não foi implementado), como citado em 11:10. Como não fazer a validação?
@lucasoliveira1026
@lucasoliveira1026 Жыл бұрын
Talvez você poderia tornar o construtor de CPF público e, nesse caso, utilizar o "new Cpf(repository.Employees.Cpf)"
@BwolfDev
@BwolfDev 4 жыл бұрын
Exelente video =D
@abraaohonorio
@abraaohonorio 4 жыл бұрын
Mais um excelente vídeo, parabéns pelo incrível trabalho 0/
@otechlead
@otechlead 4 жыл бұрын
niiicoo
@379Felipe
@379Felipe 4 жыл бұрын
Caramba, gostei bastante do conteúdo. Só alguns minutos de vídeo que acabei vendo umas coisas que nunca tinha visto antes. Dúvida, acha que vale a pena fazer esse tipo de implementação quando se trabalha com grande volume de dados? ou nesse caso seria melhor se manter nos tipos primitivos?
@carloslima8858
@carloslima8858 4 жыл бұрын
Muito Bom!
@EduardoSpaki
@EduardoSpaki 4 жыл бұрын
ótimo conteúdo. dúvida ingênua: como mapear isso para um ORM, ex EF? (obs: eu sei que temos que priorizar o design ao invés da ferramenta/orm)
@Renanfa1
@Renanfa1 4 жыл бұрын
Acredito que seja preciso fazer um mapeamento customizado. No mongo pelo menos é preciso, pois ele não entende a conversão implicita
@fanturyP
@fanturyP 4 жыл бұрын
Muito bom, mais eu tenho uma duvida caso tenha uma classe Cliente com um tipo Endereco, onde contem varias propriedades como Logradouro, Numero, Bairro, Cidade, UF etc... todas essas informações estão dentro de uma unica tabela "Cliente" no banco de dados, a duvida é como o EF Core irar tratar isso ?
@ricardovicentini
@ricardovicentini 4 жыл бұрын
Muito bom Elemar, pode se dizer que essa uma implementação de ValueObject do DDD? Com struct tiramos o objeto da heap e poupamos recursos, mas existe algum efeito colateral? Obrigado.
@carlosl8832
@carlosl8832 3 жыл бұрын
👍🏽
@niss2011
@niss2011 4 жыл бұрын
O struct tem um construtor sem parâmetros obrigatório e sem possibilidade de sobreescrever, ou seja, seria possível criar um CPF vazio. Faz sentido?
@otechlead
@otechlead 4 жыл бұрын
Muito interessante este tipo de conteúdo, tenho uma dúvida: O uso de structs no lugar de classes é uma boa prática para quando representamos objetos de dados em um ORM (Entity, Dapper, etc)?
@ddrsdiego
@ddrsdiego 4 жыл бұрын
Se eu puder dar uma contribuição como trabalho, geralmente eu uso struct com dapper para trazer um objeto POCO e depois "hidratar" minhas entidades. Não sei se já viu assim mas o que acha?
@otechlead
@otechlead 4 жыл бұрын
​@@ddrsdiego Eu acho interessante, a minha dúvida maior é se isso pode gerar benefício de desempenho.
@otechlead
@otechlead 4 жыл бұрын
Eu estou com um app pra refatorar que está consumindo muita memoria e estou avaliando melhorias neste ponto
@carloswanderley8868
@carloswanderley8868 4 жыл бұрын
Olá Elemar. Uma dúvida a respeito: na implementação de uma classe (Employee) que representa uma tabela de dados de um banco de dados, para uso com frameworks como o Entity Framework, o definição da propriedade Cpf como do tipo Cpf - e não string - traz algum problema com o uso de Fluent API e até mesmo Migrations?
@alessandrodesouza
@alessandrodesouza 4 жыл бұрын
Elemar, sem querer abusar da sua bondade, mas poderia criar um vídeo falando sobre Exceptions .. fiquei curioso e pra variar devo estar fazendo errado :(
@angelorfontana
@angelorfontana Жыл бұрын
Show
@rafaelferreira4011
@rafaelferreira4011 4 жыл бұрын
A maior dúvida e como salvar isso em banco. O jeito correto usando ORM ou Dapper
@tjlimaster
@tjlimaster 3 жыл бұрын
Essa e minha dúvida também
@MSMaldi
@MSMaldi 4 жыл бұрын
A struct de CPF minha fica parecida com a sua, mas value que vc usa string uso int, e guardo apenas o CPF sem o digito, ou seja, para 123.456.789-09 após a validação guardo apenas como inteiro 123.456.789, o que acha?
@EximiaCo
@EximiaCo 4 жыл бұрын
Lindo! :)
@ncvjr
@ncvjr 4 жыл бұрын
E como você faz com cpfs que começam com 0?
@MrRomviana
@MrRomviana 4 жыл бұрын
@@ncvjr não tem nenhum problema... armazena no banco sem os zeros da esquerda. Estes, apenas são exibidos na app usando formatadores de números.
@rafapioli75
@rafapioli75 4 жыл бұрын
Uma dúvida, tem como seguir essa mesma abordagem com uso da conversão implícita para um campo cujo retorno tem o tipo primitivo diferente de string? Exemplo, Idade do tipo int. Nesse caso não poderia usar o ToString() para retornar o valor automaticamente.
@lucasoliveira1026
@lucasoliveira1026 Жыл бұрын
@@rafapioli75 No exemplo do CPF, você pode querer converter de string com máscara (999.999.999-99) para string sem máscara (99999999999); ou de double para string com máscara. No caso da idade, qual seria a razão para conversão?
@BrunoSilva-sq6xr
@BrunoSilva-sq6xr 4 жыл бұрын
Devo criar também objetos para nome e Id?
@eduardotovao
@eduardotovao 4 жыл бұрын
Caraca.. refatorando minha classe de utils em 3..2..1 kkkkkkkkkkkk
@roqlee
@roqlee 4 жыл бұрын
Top!
@alessandrodesouza
@alessandrodesouza 4 жыл бұрын
Nunca mais uso tipos primitivos nas minhas entidades .... :( .. e parece ser ótimo.. kkkkk
@alessandrodesouza
@alessandrodesouza 3 жыл бұрын
@Soluções Simples vc tem razão.. mas não foi em sentindo literal.. :)
@IsmaelGasparinBill
@IsmaelGasparinBill 4 жыл бұрын
Excelente!!!
Como funciona o "yield return", do C#, "por baixo do capô"?
18:00
EximiaCo - Excelência Tecnológica
Рет қаралды 6 М.
10 Principles for Coding with AI Beyond the Basics
20:06
Sourcegraph
Рет қаралды 4
Enumeráveis e LINQ, por baixo do capô
23:43
EximiaCo - Excelência Tecnológica
Рет қаралды 4,4 М.
Pequenas mudanças no código, grandes ganhos (10x) na performance em aplicações .NET
20:33
EximiaCo - Excelência Tecnológica
Рет қаралды 6 М.
Linguagem Onipresente (Ubiquitous Language) | DDD do jeito certo | Parte 02
17:07
EximiaCo - Excelência Tecnológica
Рет қаралды 25 М.
Paralelismo em .NET com Thread, ThreadPool, TPL e CUDA
22:52
EximiaCo - Excelência Tecnológica
Рет қаралды 7 М.
Entendendo a área de memória conhecida como Stack
17:36
EximiaCo - Excelência Tecnológica
Рет қаралды 6 М.
Entidades e Objetos de Valor | DDD do jeito certo | Parte 05
14:56
EximiaCo - Excelência Tecnológica
Рет қаралды 18 М.
Como o Garbage Collector (GC) afeta a performance em .NET: Validação de CPF
21:44
EximiaCo - Excelência Tecnológica
Рет қаралды 6 М.