Outro ponto que gosto de usar bastante é o Return Early Pattern. Isso ajuda muito na redução do uso de ifs alinhados, bem como melhora a legibilidade do código.
Utilizo bastante a técnica de Fail First. No geral procuro manter baixos níveis de identação pra melhorar a leitura do código. Conteúdo top demais, obrigado
E infelizmente ainda existem muitos lugares que tem medo de refatorar código, a famosa história da tartaruga em cima da árvore, que ninguém sabe como está lá, mas é melhor não mexer. A dica é sempre seguir devar e sempre, uma função de cada vez, um tempo investido no momento para se economizar muito o futuro, um código bem escrito não tem preço.
Vcs são fantásticos! Adoro o canal! Eu sempre fui paranóico com tratamento de erros. Pesquisei, pesquisei, sobre 'melhores práticas', e tals... Resolvi usar o throw, gerar uma exceção, pra tratar erros de validação. exatamente como vcs citaram. Porém, outro dia, vi o conteúdo de um programador fera, q disse: 'exceções, servem para informar erros de runtime, acesso negado, na escrita de arquivos...etc' Throw, usado em JS, em Promise, testei outro dia, não funcionou corretamente, quando executado dentro da Promise, de forma async.... Ó dúvida cruel...kkk Grande abraço! Sucesso! Sempre!
essa parte de retornar se a função deu erro é um ponto que me dói, mas não sei se encher o código de try catch seria uma forma mais elegante de resolver o problema.
Aprendi muita coisa na Alura, Solid, Object Calistheniscs e design patterns. No inicio voce nao vai conseguir aperfeiçoar todas as boas praticas. Mas com o tempo e maturidade para enxergar os problemas, as oportunidades aparecem naturalmente
Fala meus amores conterrâneos, poxa, vocês poderiam lançar cursos de desenvolvimento no seu canal, por exemplo, não vi ninguém ensinar C# pelo vscode, são sempre IDE's parrudas e pesadas, ia ser uma honra aprender com vocês, tipo um Código Fonte Academy, por favor, levem em consideração, um abraço na Vanessa e um Beixo no Gabriel
Aquela parte de alterar os dados com um método só para vida e pontuação acho que precisaria de pelo menos um facade para manter compatibilidade com os métodos Aumentar e Diminuir pois realmente tanto para a questão de semântica quanto de lógica de um jogo faz sentido querer só incrementar ou decrementar em um certo momento e também pode ser necessário mudar o valor do incremento ao invés de ser sempre unitário. Mas parabéns pelo conteúdo e obrigado por estarem variando a linguagem! Finalmente vi como posso fazer testes com o C# graças a este vídeo e me surpreendi com a simplicidade.
só uma obs., No C# não é recomendado tratar erros de negocio com exceção pois os mesmo são muito pesados para a execução do aplicativo, é utilizado usar apenas para coisa externas do código, como conexões a banco de dados, IO de arquivos, requests Http, etc
Como sempre um excelente conteúdo. Seria uma boa vocês mostrarem exemplos substituindo tipos primitivos. Já que mencionaram a importância dos testes, essa substituição por tipos específicos também deixa o código mais seguro.
Na minha opinião, diminuir a quantidade de linhas no código, contanto que não crie linhas sejam muito extensas p isso. melhora muito a leitura dos códigos. O c# ele possibilita vc escrever muita coisa em uma linha só, se souber dosar isso seu código fica bem limpo esteticamente.
Assunto muito importante! Para conseguir refatorar um código, é necessária muita atenção e precisa entender a regra de negócio que o código está executando. Em linguagens como Delphi (object Pascal) "não teremos problemas" com nomes de variáveis, pois elas devem ser declaradas antes de usá-las. Agora PHP, Javascript, e muitas outras corremos sérios riscos de alterar em um lugar e não alterar em outro, aí só iremos perceber a bagunça durante o funcionamento do código, na maioria das vezes. Abração CDF´s
Sinto que estou na melhor época pra assistir esse tipo de vídeos estou terminando o curso da trybe, e eu mato meus vícios antes de serem fixados na matrix do meu cérebro
Eu tenho aqui uma duvida!!, eu tinha lido um artigo(acho que foi do Martin Fowler) que fala para não usar Exceptions para para validação e sim o Notification pattern. Ele argumenta que Exceções deve sinalizar algo fora do esperado que deve interromper o fluxo. Eu sinceramente não vejo problemas nas duas abordagens. Mas sempre fico na duvida quando eu devo adotar Notification Pattern ou lançar uma exception. Muito bom video...value obrigado!!
1. Aquelas palavras entre colchetes são o quê? 2. Um vídeo legal de ser feito seria mostrando testes em algumas linguagens, até porque não é algo que é "natural", mas deveria. 3. Já que dei ideia de testes, surgiu mais uma. Teste de interface, não lembro se já fizeram, mas lembro de ter vídeo do Cypress e do Selenium, mas acho que tem uma forma sem ser "gráfica" de fato que roda e exibe os resultados pelo terminal.
C# 😍Um pequeno comentário para quem trabalha com a linguagem: erguer exceções é sim mais seguro e força o consumidor do código a tratá-las, ou ao menos a estar ciente de que elas podem ocorrer. Infelizmente, em alguns cenários onde a performance é importante, essa estratégia pode não ser a mais adequada. Exceções são caras e vale a pena entender seu custo para utilizá-las com parcimônia. Existem algumas alternativas que podem ser interessantes, por exemplo th-cam.com/video/a1ye9eGTB98/w-d-xo.html (em Inglês). Abraços!
Olá! Então, entrei nos comentários exatamente por esse linha de pensamento. Utilizo sempre a forma das excessões como apresentado no vídeo do código fonte. Óbvio que existem outras formas, mas o que se precisa lembrar que uma excessão é uma excessão ou seja por exemplo em uma compra de carrinho se passar um valor negativo isso é uma excessão ou seja é.contra a lógica
Bem a única coisa que eu aprendi que deixaria o códico mais limpo seria aretirada dos elses em alguns dos métodos utilizados nos código, pois já que se não de certo ou der certo ele retorna ou levanta uma exceção não ter o porquê ter um else.
Uma questão sobre o ponto do retorno de exceção, acho que quando se é criado no Controller por exemplo é aceitavel, mas se for dentro de um Model, acho que retornar um false é válido, pois pode ser que eu em alguma reutilização de código para uma devida validação utilizar o return false seria utilizado em um if por exemplo para fazer uma outra ação... Não sei se soube expor o que pensei nesse caso...
Talvez pode ser algo de novato, mas eu entenderia melhor os testes se rolasse um Debug estilo ao comando SOUT do Java para entender o retorno do que está sendo feito no console... Embora que foi usado C# no exemplo eu achei que era Java de inicio 🤔
Ola´..sempre estou vendo os videos de vcs e tenho uma duvida..Estou estudando Python e gostaria de saber qual melhor biblioteca no Python para trabalhar com Big data ?? Obrigado
Só uma sugestão, deem uma olhada no concurso do Banco do Brasil. É uma sacanagem o que estão fazendo. Vaga de nível médio para cargo de cientista de dados e desenvolvedor mobile juntos.
Antes que apareça um professor de física para puxar a orelha de vocês... velocidade tem unidade m/s e aceleração m/s². Então os nomes aceleração e desaceleração são inadequados. Dá para entender perfeitamente, mas é um erro físico. Talvez algo como IncrementoVelocidade ou VariacaoVelocidade. E como o valor é o mesmo ficaria uma única variável.
Adorei as técnicas meus queridos! mas tenho uma dúvida, vocês utilizaram o strategy na segunda técnica que consistem em criar uma interface(contrato) pra obrigar todas classes que implementam(assinam) essa interface a implementar a lógica, desta maneira vocês fazem o bom uso do polimorfismo manipulando qualquer objeto que retorne, até ai mil maravilhas, mas qual pattern ou técnica eu poderia usar pra decidir qual objeto instanciar? Pq ao meu ver se eu tivesse uma função que retornasse por exemplo uma string com o método de pagamento, eu ainda teria que usar IFs pra decidir qual objeto instanciar pra dps usar o método que ele implementou. Valeu e abraços! Sucesso pra vcs sempre!
Tem várias formas de vc decidir qual vai instanciar, daí vc tem q analisar qual eh a melhor para sua aplicação, dependendo de como ela funciona. Por exemplo, imagina q vc está num ambiente onde tem uma UI onde o usuário pode escolher qual opção ele quer usar: nesse caso, em cada método da opção (botão) vc instancia o objeto referente àquela opção, então com essa instância vc pode passar ela pro Strategy chamar a implementação do método correspondente. Outra coisa nesse cenário q vc ainda pode melhorar: ao invés de ter várias funções de botões apenas para instanciar um objeto diferente pra cada tipo e chamar o strategy em todas, vc pode usar um dicionário que guarda cada instância de cada objeto, e a chave pode ser uma string ou um ENUM q representa aquele objeto. Então vc teria a chave por exemplo "PIX" e o valor eh a instância da classe, assim: Dictionary payDict = new Dictionary { {"PIX", new PixType()} }; Cada botão carrega uma referência (pode ser string ou ENUM) da chave correspondente do objeto, então vc só teria um método assim: void OnButtonClicked(string payType) { IPaymentType paymentInstance = payDict[payType]; paymentInstance.SetValues(value); // Aqui vc implementa na classe do tipo "PIX" um método pra passar o valor q vai usar pro Strategy, mas caso queria simplificar ainda mais (q eu recomendo) vc pode combinar tudo isso com o Factory Pattern, pra criar a instância de forma mais dinâmica ainda! strategy.CallStrategy(paymentInstance); } Um método só, pra cada opção de pagamento disponível. Claro q isso eh um exemplo com uma interface gráfica, onde temos botões, mas vc pode usar a mesma lógica pra outros tipos de situações tb, basta guardar a referência/chave q o objeto representa.
@@videoaulasmayleoneMuito obrigado pelas explicações, você me deu umas ideias muito boas pra resolver esse problema da instanciação correta, o pattern que você diz no final é o Factory Method ou Abstract Factory?
Entendi as técnicas, no entanto uma ou outra são limitadas a linguagem de programação ao qual você usa. Eu programo em C, Octave/Matlab também, irei aplicar essas técnicas nos algoritmos de redes neurais e estimadores lineares para identificação de sistemas. Muito obrigado!
Tenho minhas dúvidas, com If/Else tava mais fácil o entendimento. Teria que ter o conhecimento do Math para entender. Um Jr teria dificuldades ao bater o olho
1 Técnica: 2:40
2 Técnica: 6:23
3 Técnica: 11:02
4 Técnica: 15:34
5 Técnica: 20:23
Outro ponto que gosto de usar bastante é o Return Early Pattern. Isso ajuda muito na redução do uso de ifs alinhados, bem como melhora a legibilidade do código.
Utilizo bastante a técnica de Fail First. No geral procuro manter baixos níveis de identação pra melhorar a leitura do código. Conteúdo top demais, obrigado
mais um vídeo, com dicas incríveis sobre um assunto extremamente importante na área.💯
Muito obrigado Victor! Vamos voltar a falar de refatoração mais vezes, adoramos esse tema.
E infelizmente ainda existem muitos lugares que tem medo de refatorar código, a famosa história da tartaruga em cima da árvore, que ninguém sabe como está lá, mas é melhor não mexer. A dica é sempre seguir devar e sempre, uma função de cada vez, um tempo investido no momento para se economizar muito o futuro, um código bem escrito não tem preço.
Melhor vídeo do canal até hoje, isso que acompanho a anos, muito obrigado CDF TV
Vcs são fantásticos! Adoro o canal!
Eu sempre fui paranóico com tratamento de erros.
Pesquisei, pesquisei, sobre 'melhores práticas', e tals...
Resolvi usar o throw, gerar uma exceção, pra tratar erros de validação. exatamente como vcs citaram.
Porém, outro dia, vi o conteúdo de um programador fera, q disse: 'exceções, servem para informar erros de runtime, acesso negado, na escrita de arquivos...etc'
Throw, usado em JS, em Promise, testei outro dia, não funcionou corretamente, quando executado dentro da Promise, de forma async....
Ó dúvida cruel...kkk
Grande abraço! Sucesso! Sempre!
essa parte de retornar se a função deu erro é um ponto que me dói, mas não sei se encher o código de try catch seria uma forma mais elegante de resolver o problema.
Gostei tanto desse vídeo que assisti várias vezes.
Aprendi muita coisa na Alura, Solid, Object Calistheniscs e design patterns. No inicio voce nao vai conseguir aperfeiçoar todas as boas praticas. Mas com o tempo e maturidade para enxergar os problemas, as oportunidades aparecem naturalmente
Show de bola, excelente vídeo, parabéns ao casal!
Confesso que me surpreendeu. :)
Fala meus amores conterrâneos, poxa, vocês poderiam lançar cursos de desenvolvimento no seu canal, por exemplo, não vi ninguém ensinar C# pelo vscode, são sempre IDE's parrudas e pesadas, ia ser uma honra aprender com vocês, tipo um Código Fonte Academy, por favor, levem em consideração, um abraço na Vanessa e um Beixo no Gabriel
Oi Jorge, muito obrigado pelo seu comentário. Estamos empenhados em lançar nossos cursos esse ano. É um dos nossos objetivos sim. Grande abraço.
@@codigofontetv Opa, já to aqui roendo as unhas do pé
Mas não faz diferença a IDE que o curso usa. Você sempre pode usar o vscode ou qualquer outro editor seguindo um tutorial que usa uma IDE.
Tem o curso do Nélio Alves na udemy
Ótimo vídeo.
Vocês indix um vídeo explicando técnicas para os Testes?
Sensacional!!!
Aquela parte de alterar os dados com um método só para vida e pontuação acho que precisaria de pelo menos um facade para manter compatibilidade com os métodos Aumentar e Diminuir pois realmente tanto para a questão de semântica quanto de lógica de um jogo faz sentido querer só incrementar ou decrementar em um certo momento e também pode ser necessário mudar o valor do incremento ao invés de ser sempre unitário.
Mas parabéns pelo conteúdo e obrigado por estarem variando a linguagem! Finalmente vi como posso fazer testes com o C# graças a este vídeo e me surpreendi com a simplicidade.
Sugestão, programação defensiva
só uma obs., No C# não é recomendado tratar erros de negocio com exceção pois os mesmo são muito pesados para a execução do aplicativo, é utilizado usar apenas para coisa externas do código, como conexões a banco de dados, IO de arquivos, requests Http, etc
Esse tipo de problema já foi corrigido nas novas versões do C#
Como sempre um excelente conteúdo. Seria uma boa vocês mostrarem exemplos substituindo tipos primitivos. Já que mencionaram a importância dos testes, essa substituição por tipos específicos também deixa o código mais seguro.
Na minha opinião, diminuir a quantidade de linhas no código, contanto que não crie linhas sejam muito extensas p isso. melhora muito a leitura dos códigos. O c# ele possibilita vc escrever muita coisa em uma linha só, se souber dosar isso seu código fica bem limpo esteticamente.
Assunto muito importante!
Para conseguir refatorar um código, é necessária muita atenção e precisa entender a regra de negócio que o código está executando.
Em linguagens como Delphi (object Pascal) "não teremos problemas" com nomes de variáveis, pois elas devem ser declaradas antes de usá-las. Agora PHP, Javascript, e muitas outras corremos sérios riscos de alterar em um lugar e não alterar em outro, aí só iremos perceber a bagunça durante o funcionamento do código, na maioria das vezes.
Abração CDF´s
Muito bom!
Sinto que estou na melhor época pra assistir esse tipo de vídeos estou terminando o curso da trybe, e eu mato meus vícios antes de serem fixados na matrix do meu cérebro
Pra eliminar if...else... eu tb costumo usar objetos. Explicando:
Vamos supor que eu queira converter UF para o nome do estado.
[ANTES]
if (uf === 'BA') {
return 'Bahia'
} else if (uf === 'SP') {
return 'São Paulo'
} // ...
[DEPOIS]
const MAPPING = {
BA: 'Bahia',
SP: 'São Paulo'
// ...
}
return MAPPING[uf]
Eu tenho aqui uma duvida!!, eu tinha lido um artigo(acho que foi do Martin Fowler) que fala para não usar Exceptions para para validação e sim o Notification pattern. Ele argumenta que Exceções deve sinalizar algo fora do esperado que deve interromper o fluxo. Eu sinceramente não vejo problemas nas duas abordagens. Mas sempre fico na duvida quando eu devo adotar Notification Pattern ou lançar uma exception. Muito bom video...value obrigado!!
1. Aquelas palavras entre colchetes são o quê?
2. Um vídeo legal de ser feito seria mostrando testes em algumas linguagens, até porque não é algo que é "natural", mas deveria.
3. Já que dei ideia de testes, surgiu mais uma. Teste de interface, não lembro se já fizeram, mas lembro de ter vídeo do Cypress e do Selenium, mas acho que tem uma forma sem ser "gráfica" de fato que roda e exibe os resultados pelo terminal.
Testes unitários até tem bastante, o que não tem muito é teste de integração e ponta a ponta
@@luizAugustoll no caso, não teria como automatizar os testes unitários, mas um grupo maior sim, seria isso?
C# 😍Um pequeno comentário para quem trabalha com a linguagem: erguer exceções é sim mais seguro e força o consumidor do código a tratá-las, ou ao menos a estar ciente de que elas podem ocorrer. Infelizmente, em alguns cenários onde a performance é importante, essa estratégia pode não ser a mais adequada. Exceções são caras e vale a pena entender seu custo para utilizá-las com parcimônia. Existem algumas alternativas que podem ser interessantes, por exemplo th-cam.com/video/a1ye9eGTB98/w-d-xo.html (em Inglês). Abraços!
Olá! Então, entrei nos comentários exatamente por esse linha de pensamento. Utilizo sempre a forma das excessões como apresentado no vídeo do código fonte. Óbvio que existem outras formas, mas o que se precisa lembrar que uma excessão é uma excessão ou seja por exemplo em uma compra de carrinho se passar um valor negativo isso é uma excessão ou seja é.contra a lógica
Vem logo ChatGPT versão 7 e acaba logo com essa bolha de mercado chamado programação...
Ótimo vídeo!
Bem a única coisa que eu aprendi que deixaria o códico mais limpo seria aretirada dos elses em alguns dos métodos utilizados nos código, pois já que se não de certo ou der certo ele retorna ou levanta uma exceção não ter o porquê ter um else.
A utilização de "flag" dentro de loops evita bastante q sejam utilizados "ifs" desnecessariamente :)
Uso de breaks também
geniaaaaaaal \0/
Uma questão sobre o ponto do retorno de exceção, acho que quando se é criado no Controller por exemplo é aceitavel, mas se for dentro de um Model, acho que retornar um false é válido, pois pode ser que eu em alguma reutilização de código para uma devida validação utilizar o return false seria utilizado em um if por exemplo para fazer uma outra ação... Não sei se soube expor o que pensei nesse caso...
Talvez pode ser algo de novato, mas eu entenderia melhor os testes se rolasse um Debug estilo ao comando SOUT do Java para entender o retorno do que está sendo feito no console... Embora que foi usado C# no exemplo eu achei que era Java de inicio 🤔
Ola´..sempre estou vendo os videos de vcs e tenho uma duvida..Estou estudando Python e gostaria de saber qual melhor biblioteca no Python para trabalhar com Big data ?? Obrigado
video sensacional Duas palavras Para Bens kkkk
Meu sonho é um dia ter a oportunidade de trabalhar com esse casal maravilhoso
Csharp, é amoor!
Só uma sugestão, deem uma olhada no concurso do Banco do Brasil. É uma sacanagem o que estão fazendo. Vaga de nível médio para cargo de cientista de dados e desenvolvedor mobile juntos.
Antes que apareça um professor de física para puxar a orelha de vocês... velocidade tem unidade m/s e aceleração m/s². Então os nomes aceleração e desaceleração são inadequados. Dá para entender perfeitamente, mas é um erro físico. Talvez algo como IncrementoVelocidade ou VariacaoVelocidade. E como o valor é o mesmo ficaria uma única variável.
falem sobre power bi
Adorei as técnicas meus queridos! mas tenho uma dúvida, vocês utilizaram o strategy na segunda técnica que consistem em criar uma interface(contrato) pra obrigar todas classes que implementam(assinam) essa interface a implementar a lógica, desta maneira vocês fazem o bom uso do polimorfismo manipulando qualquer objeto que retorne, até ai mil maravilhas, mas qual pattern ou técnica eu poderia usar pra decidir qual objeto instanciar? Pq ao meu ver se eu tivesse uma função que retornasse por exemplo uma string com o método de pagamento, eu ainda teria que usar IFs pra decidir qual objeto instanciar pra dps usar o método que ele implementou. Valeu e abraços! Sucesso pra vcs sempre!
Tem várias formas de vc decidir qual vai instanciar, daí vc tem q analisar qual eh a melhor para sua aplicação, dependendo de como ela funciona.
Por exemplo, imagina q vc está num ambiente onde tem uma UI onde o usuário pode escolher qual opção ele quer usar: nesse caso, em cada método da opção (botão) vc instancia o objeto referente àquela opção, então com essa instância vc pode passar ela pro Strategy chamar a implementação do método correspondente.
Outra coisa nesse cenário q vc ainda pode melhorar: ao invés de ter várias funções de botões apenas para instanciar um objeto diferente pra cada tipo e chamar o strategy em todas, vc pode usar um dicionário que guarda cada instância de cada objeto, e a chave pode ser uma string ou um ENUM q representa aquele objeto.
Então vc teria a chave por exemplo "PIX" e o valor eh a instância da classe, assim:
Dictionary payDict = new Dictionary
{
{"PIX", new PixType()}
};
Cada botão carrega uma referência (pode ser string ou ENUM) da chave correspondente do objeto, então vc só teria um método assim:
void OnButtonClicked(string payType) {
IPaymentType paymentInstance = payDict[payType];
paymentInstance.SetValues(value);
// Aqui vc implementa na classe do tipo "PIX" um método pra passar o valor q vai usar pro Strategy, mas caso queria simplificar ainda mais (q eu recomendo) vc pode combinar tudo isso com o Factory Pattern, pra criar a instância de forma mais dinâmica ainda!
strategy.CallStrategy(paymentInstance);
}
Um método só, pra cada opção de pagamento disponível.
Claro q isso eh um exemplo com uma interface gráfica, onde temos botões, mas vc pode usar a mesma lógica pra outros tipos de situações tb, basta guardar a referência/chave q o objeto representa.
@@videoaulasmayleoneMuito obrigado pelas explicações, você me deu umas ideias muito boas pra resolver esse problema da instanciação correta, o pattern que você diz no final é o Factory Method ou Abstract Factory?
@@Felipe_Matheus_1991 Nesse caso o Factory Method
Tem umas coisas aí que deveriam dar em demissão por justa causa! Números mágicos me levam a loucura! Excelente conteúdo!
Entendi as técnicas, no entanto uma ou outra são limitadas a linguagem de programação ao qual você usa. Eu programo em C, Octave/Matlab também, irei aplicar essas técnicas nos algoritmos de redes neurais e estimadores lineares para identificação de sistemas. Muito obrigado!
Não renomeou em 13:45 pq o comando é Ctrl+F2 :D
TINHA QUE SER JS!!!!!
Já dei like logo quando falou que era C#
Vocês Já pensaram em desenvolver suas próprias Ferramentas No Code??
Viish tô no começo ainda, fico boiando nesses assuntos kkkkkk
❤
Fala mestres 😂😂🤣🤣🤣🤣🤣🤣.
Lógico né 🤣🤣🤣😂🤣
Tenho minhas dúvidas, com If/Else tava mais fácil o entendimento. Teria que ter o conhecimento do Math para entender. Um Jr teria dificuldades ao bater o olho
Bom demais, vídeo gostosíssimo!
Estão programando JS no C#. kkkkkkkkkkkkkkkkk!
#ateofinal
#querocamisacdf
Muito bom mesmo show 😊 csharp #