<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Rener Lemes on Medium]]></title>
        <description><![CDATA[Stories by Rener Lemes on Medium]]></description>
        <link>https://medium.com/@renerlemess?source=rss-a517ac81733a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*VYg7jKjbLPqZpY7Z.</url>
            <title>Stories by Rener Lemes on Medium</title>
            <link>https://medium.com/@renerlemess?source=rss-a517ac81733a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 02:25:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@renerlemess/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[.NET 8 — Data Annotation]]></title>
            <link>https://medium.com/@renerlemess/net-8-data-annotation-1abfbf826628?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/1abfbf826628</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Tue, 18 Jul 2023 12:51:02 GMT</pubDate>
            <atom:updated>2023-07-18T12:51:02.962Z</atom:updated>
            <content:encoded><![CDATA[<h3>.NET 8 — Data Annotation</h3><pre>[Base64String()]<br>public string AccessToken { get; set; }<br><br>[AllowedValues(1,2,8,23,55)]<br>public uint Age { get; set; }<br><br>[DeniedValues(1,2,3,4,5)]<br>public string Age { get; set; }<br><br>[Length(7,25)]<br>public string Name { get; set; }<br><br>[Required(DisallowAllDefaultValues = true)]<br>public Guid Id{ get; set; }</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1abfbf826628" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Null Operators]]></title>
            <link>https://medium.com/@renerlemess/null-operators-2a8d6e2690e0?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/2a8d6e2690e0</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Thu, 13 Jul 2023 12:45:02 GMT</pubDate>
            <atom:updated>2023-07-13T16:46:00.102Z</atom:updated>
            <content:encoded><![CDATA[<h4>5 técnicas de manipulação de valores nulos</h4><p>É um operador abreviado usado para retornar o operando esquerdo se não for nulo e o operando direito se o operando esquerdo for nulo. Esse operador é útil quando você precisa fornecer um valor padrão se uma variável for nula.</p><pre>string name = null;<br><br>string result = name ?? &quot;Unknown&quot;;<br><br>Console.WriteLine(result); // Output: Unknown</pre><h4><strong>2 — Conditional Operator (?:)</strong></h4><p>É usado para avaliar uma condição e retornar um valor se a condição for verdadeira e outro valor se a condição for falsa. Esse operador é útil quando você precisa fornecer um valor padrão com base em uma condição.</p><pre>string name = null;<br><br>string result = (name != null) ? name : &quot;Unknown&quot;;<br><br>Console.WriteLine(result); // Output: Unknown</pre><h4><strong>3 — 𝗡𝘂𝗹𝗹 𝗖𝗼𝗻𝗱𝗶𝘁𝗶𝗼𝗻𝗮𝗹 𝗢𝗽𝗲𝗿𝗮𝘁𝗼𝗿 (?.)</strong></h4><p>É usado para acessar membros de um objeto se o objeto não for nulo, caso contrário, retornará nulo. Este operador é útil quando você precisa acessar propriedades ou métodos de um objeto que pode ser nulo</p><pre>string name = null;<br><br>int? length = name?.Length;<br><br>Console.WriteLine(length); // Output: null</pre><h4>4 — 𝗡𝘂𝗹𝗹 𝗖𝗼𝗮𝗹𝗲𝘀𝗰𝗶𝗻𝗴 𝗔𝘀𝘀𝗶𝗴𝗻𝗺𝗲𝗻𝘁 𝗢𝗽𝗲𝗿𝗮𝘁𝗼𝗿 (??=)</h4><p>É usado para atribuir o operando à direita ao operando à esquerda se o operando à esquerda for nulo. Este operador é útil para atribuir um valor padrão a uma variável se ela estiver nula no momento. Pode simplificar o código e torná-lo mais conciso.</p><p>Antes:</p><pre>string fullName = null;<br><br>if (fullName is null)<br>{<br>    fullName = &quot;No name found&quot;;<br>}</pre><p>Depois:</p><pre>string name= null;<br><br>name??= &quot;Unknown&quot;;<br><br>Console.WriteLine(name); // Output: Unknown</pre><h4>5 — Null-Forgiving Operator (!.)</h4><p>É usado para informar ao compilador que um valor não é nulo, mesmo que o compilador não consiga determinar que o valor não é nulo. Esse operador é útil quando você sabe que um valor não será nulo, mas o compilador não consegue determinar que não será nulo.</p><pre>string name = null!;<br><br>int length = name.Length;<br><br>Console.WriteLine(length); // Output: System.NullReferenceException</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2a8d6e2690e0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Middleware]]></title>
            <link>https://medium.com/@renerlemess/middleware-c0f42d843ddb?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/c0f42d843ddb</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Mon, 10 Jul 2023 13:31:38 GMT</pubDate>
            <atom:updated>2023-07-13T16:47:49.611Z</atom:updated>
            <content:encoded><![CDATA[<h3>O que é middleware ?</h3><p>Middleware é um software montado em um pipeline de aplicativo para lidar com solicitação e resposta.<br>Em palavras simples, o middleware nos dá a facilidade de adicionar lógica adicional antes e depois da solicitação HTTP.</p><h3>Como middleware funciona?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*CmQvQKesdAYdL5ar.png" /></figure><p>Suponha que tenhamos três middlewares em nosso aplicativo e, para cada middleware, inserimos duas vezes.</p><ul><li>A primeira lógica do middleware é executada e então a enviamos para o próximo middleware</li><li>Em segundo lugar, quando a solicitação voltar após a execução dos próximos middlewares</li></ul><h3>Multiplas formas de criar middlewares</h3><p>Temos três maneiras de criar middleware no .NET Core</p><ul><li>Request delegate</li><li>Convention</li><li>Middleware factory</li></ul><h3>Criando middleware usando Request Delegate</h3><p>Desta forma, podemos criar middleware usando direto em nosso <em>Program.cs</em><br>Podemos adicionar nossa lógica que queremos executar antes ou depois desse middleware.<br>Se você não quiser chamar o próximo middleware, podemos fazer isso não invocando o próximo.<br>Nosso arquivo <em>Program.cs</em> ficaria assim:</p><pre>var builder = WebApplication.CreateBuilder(args);<br><br>var app = builder.Build();<br><br>app.Use(async (context, next) =&gt;<br>{<br>    Console.WriteLine(&quot;Before&quot;);<br><br>    await next.Invoke();<br><br>    Console.WriteLine(&quot;After&quot;);<br>});<br><br>app.Run();</pre><h3>Criando middleware by Convention</h3><ul><li>Crie uma classe do seu middleware e passe RequestDelegate no seu construtor.</li><li>Agora adicione a responsabilidade do método para a lógica antes e depis do middleware, passe o HttpContext</li><li>Adicione o middleware no arquivo <em>Program.cs</em></li></ul><p>Depois dos primeiros dois passos, nosso código irá ficar assim:</p><pre>public class ConventionMiddleware<br>{<br>    private readonly RequestDelegate _next;<br><br>    public ConventionMiddleware(RequestDelegate next) =&gt; _next = next;<br><br>    public async Task InvokeAsync(HttpContext context)<br>    {<br>        Console.WriteLine(&quot;Before&quot;);<br><br>        await next.Invoke();<br><br>        Console.WriteLine(&quot;After&quot;);<br>    }<br>}</pre><p>Adicione no arquivo <em>Program.cs</em> o middleware da seguinte forma:<br>app.UseMiddleware&lt;name&gt;()</p><pre>app.UseMiddleware&lt;ConventionMiddleware&gt;();</pre><h3>Criando middleware usando Factory</h3><p>Esta é uma versão modificada da forma convencional, neste caso nós criamos uma classe e herdamos deIMiddleware. Neste caso IMiddleware obriga-nos a implementar o métodoInvokeAsync. Então o código fica assim:</p><pre>public class FactoryMiddleware: IMiddleware<br>{<br>    public async Task InvokeAsync(HttpContext context, RequestDelegate next)<br>    {<br>        Console.WriteLine(&quot;Before&quot;);<br><br>        await next.Invoke();<br><br>        Console.WriteLine(&quot;After&quot;);<br>    }<br>}</pre><p>Nessa última etapa é adicionar o middleware no arquivoProgram.cs, mas dessa vez nós não podemos fazer isso utilizando app.UseMiddleware, nós temos que adicionar no container DI integrado. Nós temos que registrar o serviço da seguinte forma:</p><pre>builder.Services.AddTransient&lt;FactoryMiddleware&gt;();<br><br>app.UseMiddleware&lt;FactoryMiddleware&gt;();</pre><p>O Factory Method é mais apreciado pelos desenvolvedores porque tem menos chance de erro e é mais limpo.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0f42d843ddb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Livro | Pai Rico, Pai Pobre]]></title>
            <link>https://medium.com/@renerlemess/livro-pai-rico-pai-pobre-28e9c0117b6d?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/28e9c0117b6d</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Tue, 27 Sep 2022 18:48:44 GMT</pubDate>
            <atom:updated>2022-09-27T18:48:44.304Z</atom:updated>
            <content:encoded><![CDATA[<p>Normalmente aprendemos que para ser bem sucedido na vida devemos ir pra escola aprender uma habilidade ou uma profissão, se formar com boas notas, ter um diploma, conseguir um emprego estável e com isso nos tornar alguém reconhecido, medindo o que somos com o que temos. <br>A escola se torna um fim, e não o início.</p><p>No livro, o autor nos mostra 8 ensinamentos sobre finanças, com pontos de vistas duas pessoas com visões bem distintas sobre enriquecimento.</p><blockquote><em>1 — As classes média e baixa trabalham por dinheiro. Os ricos fazem com que o dinheiro trabalhe para eles.</em></blockquote><p>Trabalhar bastante por dinheiro, pensando que comprará aquilo que acha que lhe trará felicidade, é também uma forma horrível de viver, assim como passar uma vida determinada pelo valor em seu contracheque ou no saldo da sua conta bancária também é terrível.</p><p>As pessoas trabalham, recebem seu salário e gastam. Mesmo que uma pessoa receba uma promoção ou encontre um emprego melhor, essa situação não melhora. Isso porque, quanto mais as pessoas ganham, mais elas tendem a gastar. Portanto, a ideia é que você saia desse ciclo e pare de gastar o seu salário com coisas que não importam.</p><p>Sair desse ciclo, parar de gastar seu salário com o que não importa e não tentar ter um padrão de vida mais caro são os primeiros passos rumo a abundância financeira.</p><blockquote>Um emprego é apenas uma solução de curto prazo para um problema de longo prazo.</blockquote><blockquote><em>2 — </em>Há uma diferença entre ser pobre e estar quebrado. Estar quebrado é algo temporário, ser pobre é algo eterno.</blockquote><p>É importantíssimo saber a diferença entre um ativo e um passivo, e só adquirir ativos. Isso é tudo que precisamos saber.</p><p>No início da nossa vida isso pode parecer longe da realidade, mas é possível iniciar cedo e ter uma vida confortável. Um luxo verdadeiro é uma recompensa por ter investido e desenvolvido uma coluna de ativos consistente.</p><p><strong>Ativos:</strong> É tudo aquilo que você possa adquirir ou construir e que lhe garanta rendimentos, que lhe gere renda. Um ativo possibilita a entrada de dinheiro em seu fluxo de caixa e acelera o crescimento financeiro.</p><ul><li><em>Negócios que não exijam a minha presença. Se tiver que trabalhar neles, não é um negócio, é uma profissão</em></li><li><em>Ações</em></li><li><em>Títulos</em></li><li><em>Imóveis que geram renda</em></li><li><em>Promissórias</em></li><li><em>Royalties de propriedade intelectual, com música, literatura e patentes</em></li><li><em>Tudo o que tenha valor, gere renda ou se valorize e tenho um mercado líquido</em></li></ul><p><strong>Passivos:</strong> É tudo aquilo que quando adquirido ou construído gera despesas, gastos periódicos e constantes, os passivos contribuem negativamente no fluxo de caixa, pois reduzem o seu saldo do mesmo.</p><ul><li><em>Financiamentos</em></li><li><em>Empréstimos</em></li><li><em>Cartão de crédito</em></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/694/1*TLV6CWYn7jjOJCfzbl_teg.png" /></figure><blockquote>3 — Cuide do seu negócio</blockquote><p>Comece a cuidar do seu negócio. Mantenha o seu emprego, mas comece a comprar ativos reais e não passivos, reduzindo também as despesas e passivos.</p><blockquote>4 — A história dos impostos e o poder das sociedades anônimas</blockquote><p>Muitas pessoas veem Robin Hood como um herói, tirando dos ricos para dar aos pobres. Mas ele está mais pra um trapaceiro.</p><p>Embora o sentimento popular seja de que os ricos deveriam pagar mais impostos e doar aos pobres, na realidade, a classe média que é altamente tributada, especialmente a parcela instruída e de alta renda.</p><p>A medida que o governo se expande, aumenta a quantidade necessária de dinheiro advindo de impostos para sustentá-lo.</p><p>Uma sociedade anônima é apenas um documento que cria uma instituição legal. Não é algo material, uma fábrica ou um grupo de pessoas. Mas ela permite uma taxa de imposto de renda mais baixa do que os indivíduos teriam, e certas despesas podem ser pagas pela corporação com o lucro antes do pagamento dos impostos.</p><p>Na Inglaterra e nos Estados Unidos, originalmente não havia impostos, apenas contribuições temporárias ocasionais para arcar com situações como a guerra.</p><p>Em 1874, a Inglaterra tornou o imposto de renda permanente para seus cidadãos. Nos Estados Unidos, a adoção ocorreu em 1913.</p><p>Quanto mais você se dedica ao seu trabalho formal, mais pagará imposto ao governo. Os impostos punem as mesmas pessoas que votaram por eles.</p><p><strong>Empresários de Sociedades Anônimas</strong></p><ul><li><em>Ganham</em></li><li>Gastam</li><li>Pagam impostos</li></ul><p><strong>Trabalhadores de Sociedades Anônimas</strong></p><ul><li><em>Ganham</em></li><li>Pagam impostos</li><li>Gastam</li></ul><blockquote>5 — Os Ricos Inventam O Dinheiro</blockquote><blockquote>Muitas vezes, no mundo real, não são os espertos que tomam a dianteira, mas os ousados.</blockquote><p>Todos temos um potencial tremendo e fomos abençoados com dons. Contudo, a única coisa que nos detém é a insegurança. Não é tanto a falta de informação, mas sim a de autoconfiança. Alguns são mais afetados do que outros.</p><p>O ativo mais poderoso que temos é a nossa mente. Se bem treinada, cria uma riqueza sem precedentes.</p><p>A inteligência financeira é constuída por essas quatro habilidades técnicas:</p><ul><li><strong>Contabilidade: </strong>é a proficiência financeira ou a habilidade de ler os números. Esta é uma habilidade vial se quiser construir negócios ou investir.</li><li><strong>Investimento: </strong>é a ciência do dinheiro que faz dinheiro</li><li><strong>Entendimento de mercado: </strong>a ciência da oferta e da procura. Graham Bell deu ao mercado o que este desejava, assim como Bill Gates e Steve Jobs. Uma casa de R$ 75 mil oferecida a R$ 60 mil e que custou R$ 20 mil também foi o resultado de perceber uma oportunidade criada pelo mercado. Alguém estava comprando e alguém, vendendo.</li><li><strong>A lei: </strong>o conhecimento de lei e regulamentos estaduais e nacionais sobre contabilidade e empresas. Recomenda-se jogar dentro das regras.</li></ul><p>Os problemas com os investimento “seguros” é que muitas vezes são herméticos, ou seja, tão seguros que os ganhos são reduzidos.<br>Se souber o que está fazendo, você não está jogando. Jogo é quando você põe dinheiro em um negócio e reza para que dê certo.<br>As grandes oportunidades não são vista com seus olhos. Mas com sua mente.</p><ul><li>Encontre oportunidades que os outros deixam passar</li><li>Levante dinheiro</li><li>Reúna pessoas espertas</li></ul><blockquote>6 — Trabalhe para aprender — não por dinheiro</blockquote><blockquote>Se aprendermos e dominarmos apenas mais uma habilidade, a nossa renda se multiplicará exponencialmente. Quando se trata de dinheiro, a única habilidade que a maioria das pessoas conhece é trabalhar arduamente.</blockquote><p>É importante quando se é novo trabalhar e experiementar diversos tipos de trabalhos, isso irá gerar experiência e conhecimentos que poucas irão ter mais a frente. Diversificar é crescer.</p><p>O objetivo é procurar um trabalho que ensine as habilidades que precisam, por mais que não goste do local ou do cargo, irá ser um aprendizado e estará recebendo para isso.</p><blockquote>7 — Supere os obstáculos</blockquote><p>Existem algumas razões pelas quais as pessoas financeiramente proficientes não desenvolvem seu fluxo de caixa, e é necessário superar essas razões como:</p><ul><li>Medo</li><li>Ceticismo</li><li>Preguiça</li><li>Maus hábitos</li><li>Arrogância</li></ul><blockquote>8 — Movimente-se</blockquote><blockquote>O ouro está por toda parte. A maioria das pessoas não foi treinada para vê-lo.</blockquote><ul><li>Ache um motivo além da realidade: <strong>o poder do espírito</strong></li><li>Faça escolhas diárias: <strong>o poder da decisão</strong></li><li>Selecione amigos com cuidado: <strong>o poder da associação</strong></li><li>Domine uma fórmula e, então, aprenda uma nova: <strong>o poder do aprendizado rápido</strong></li><li>Pague a si mesmo em primeiro lugar: <strong>o poder do autocontrole e da disciplina</strong></li><li>Pague bem seus concorrentes: <strong>o poder do bom conselho</strong></li><li>Seja um “doador inteligente”: <strong>o poder do retorno</strong></li><li>Use ativos para comprar supérfluos: <strong>o poder do foco</strong></li><li>Escolha os heróis: <strong>o poder dos mitos</strong></li><li>Ensine e receberá: <strong>o poder da doação</strong></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=28e9c0117b6d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SOLID]]></title>
            <link>https://medium.com/@renerlemess/solid-33d4cd08df31?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/33d4cd08df31</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Mon, 25 Jul 2022 15:02:37 GMT</pubDate>
            <atom:updated>2023-07-13T13:35:00.673Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>SOLID</strong> é um acrônimo criado por <em>Michael Feathers</em>, após observar que cinco princípios da orientação a objetos e design de código <em>— Criados por Robert C. Martin (Uncle Bob) e abordados no artigo </em><a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"><em>The Principles of OOD</em></a><em> — </em>poderiam se encaixar nesta palavra.</p><ol><li><strong>S — Single Responsiblity Principle </strong>(Princípio da Responsabilidade Única)</li><li><strong>O — Open-Closed Principle </strong>(Princípio Aberto-Fechado)</li><li><strong>L — Liskov Substitution Principle </strong>(Princípio da Substituição de Liskov)</li><li><strong>I — Interface Segregation Principle </strong>(Princípio da Segregação da Interface)</li><li><strong>D — Dependency Inversion Principle </strong>(Princípio da Inversão da Dependência)</li></ol><p>Esses princípios ajudam os desenvolvedores a escreverem códigos mais limpos, separando responsabilidades, diminuindo acoplamentos, facilitando na refatoração e estimulando o reaproveitamento do código.</p><h4>1. SRP — Single Responsibility Principle:</h4><p>Princípio da Responsabilidade Única — <strong>Uma classe deve ter um, e somente um, motivo para mudar.</strong></p><p>Esse princípio declara que uma classe deve ser especializada em um único assunto e possuir apenas uma responsabilidade dentro do software, ou seja, a classe deve ter uma única tarefa ou ação para executar.</p><p>O princípio da responsabilidade única não se limita somente a classes, ele também pode ser aplicado em métodos e funções, ou seja, tudo que é responsável por executar uma ação, deve ser responsável por apenas aquilo que se propõe a fazer.</p><p>Antes:</p><pre>public class User<br>{<br>    public bool LogIn(string userName, string password) {...}<br>    public bool SignUp(UserDTO user) {...}<br>    public bool SendEmail(SendEmailDTO sendEmail) {...}<br>    public void LogInformation(string message) {...}<br>}</pre><p>Depois:</p><pre>public class User<br>{<br>    public bool LogIn(string userName, string password) {...}<br>    public bool SignUp(UserDTO user) {...}<br>}<br><br>public class EmailService<br>{<br>    public bool SendEmail(SendEmailDTO sendEmail) {...}<br>}<br><br>public class LoggingService<br>{<br>    public void LogInformation(string message) {...}<br>}</pre><h4>2. OCP — Open-Closed Principle:</h4><p>Princípio Aberto-Fechado — <strong>Objetos ou entidades devem estar abertos para extensão, mas fechados para modificação</strong>, ou seja, quando novos comportamentos e recursos precisam ser adicionados no software, devemos estender e não alterar o código fonte original.</p><blockquote>Separe o comportamento extensível por trás de uma interface e inverta as dependências.<br>Uncle Bob</blockquote><p>Antes:</p><p>No primeiro código temos apenas um tipo de empregado, o <em>Contract. </em>Quando surgir a necessidade de outro tipo, adicionaríamos mais uma condição, no nosso caso o <em>Permanent</em></p><pre>public class BasicSalaryCalculator<br>{<br>    public decimal GetBasicSalary(EmployeeType employeeType)<br>    {<br>        decimal basicSalary = 0;<br><br>        if (employeeType == EmployeeType.Contract) {...}<br><br>        return basicSalary;<br>    }<br>}</pre><pre>public class BasicSalaryCalculator<br>{<br>    public decimal GetBasicSalary(EmployeeType employeeType)<br>    {<br>        decimal basicSalary = 0;<br><br>        if (employeeType == EmployeeType.Contract) {...}<br>        else if (employeeType == EmployeeType.Permanent) {...}<br><br>        return basicSalary;<br>    }<br>}</pre><p>Depois:</p><p><em>Single Responsability</em></p><pre>public abstract class BasicSalary<br>{<br>    public abstract double GetBasicSalary(EmployeeType employeeType);<br>}<br><br>public class PermanentEmployeeBasicSalary : BasicSalary<br>{<br>    public abstract double GetBasicSalary(EmployeeType employeeType) {...}<br>}</pre><p><em>Open/Close</em></p><pre>public abstract class BasicSalary<br>{<br>    public abstract double GetBasicSalary(EmployeeType employeeType);<br>}<br><br>public class PermanentEmployeeBasicSalary : BasicSalary<br>{<br>    public abstract double GetBasicSalary(EmployeeType employeeType) {...}<br>}<br><br>public class ContractEmployeeBasicSalary : BasicSalary<br>{<br>    public abstract double GetBasicSalary(EmployeeType employeeType) {...}<br>}</pre><h4>3. LSP — Liskov Substitution Principle:</h4><p>Princípio da substituição de Liskov — <strong>Uma</strong> <strong>classe derivada deve ser substituível por sua classe base</strong>.</p><p>Se S é um subtipo de T, então os objetos do tipo T podem ser substituídos pelos objetos de tipo S sem que seja necessário alterar as propriedades deste programa.</p><p><strong>Exemplos de violação do LSP:</strong></p><ul><li>Sobrescrever/implementar um método que não faz nada;</li><li>Lançar uma exceção inesperada;</li><li>Retornar valores de tipos diferentes da classe base;</li></ul><p>Seguir o <strong>LSP</strong> nos permite usar o polimorfismo com mais confiança. Podemos chamar nossas classes derivadas referindo-se à sua classe base sem preocupações com resultados inesperados.</p><pre>public abstract class Vehicle<br>{<br>    public abstract void Drive();<br>}<br><br>public class Car : Vehicle<br>{<br>    public override void Drive() {...}<br>}<br><br>public class Jeep : Vehicle<br>{<br>    public override void Drive() {...}<br>}<br><br>public class Program<br>{<br>    public static void Main(string[] args)<br>    {<br>        Vehicle car = new Car();<br>        Vehicle truck = new Jeep();<br>    }<br>}</pre><h4>4. ISP — Interface Segregation Principle:</h4><p>Princípio da Segregação da Interface — <strong>Uma classe não deve ser forçada a implementar interfaces e métodos que não irão utilizar.</strong></p><p>Esse princípio basicamente diz que é melhor criar interfaces mais específicas ao invés de termos uma única interface genérica.</p><p>Antes:</p><pre>public interface IPayment<br>{<br>    void ProcessPayment(decimal amount);<br><br>    void EnterCardDetails(string cardNumber, string expiryDate, string cvv);<br><br>    void EnterAccountDetails(string accountNumber, string routingNumber);<br>}<br><br>public class PaymentService : IPayment<br>{<br>    public void ProcessPayment(decimal amount) {...}<br><br>    public void EnterCardDetails(string cardNumber, string expiryDate, string cvv) {...}<br><br>    public void EnterAccountDetails(string accountNumber, string routingNumber) {...}<br>}</pre><p>Depois:</p><pre>public interface IPayment<br>{<br>    void ProcessPayment(decimal amount);<br>}<br><br>public interface ICreditCardPayment<br>{<br>    void VerififyCardDetails(string cardNumber, string expiryDate, string cvv);<br>}<br><br>public interface IBankTransferPayment<br>{<br>    void VerifyAccountDetails(string accountNumber, string routingNumber);<br>}</pre><pre>public class CreditCardPaymentService : IPayment, ICreditCardPayment<br>{<br>    public void ProcessPayment(decimal amount) {...}<br><br>    public void VerififyCardDetails(string cardNumber, string expiryDate, string cvv) {...}<br>}<br><br>public class BankTransferPaymentService : IPayment, IBankTransferPayment<br>{<br>    public void ProcessPayment(decimal amount) {...}<br><br>    public void VerifyAccountDetails(string accountNumber, string routingNumber) {...}<br>}</pre><h4>5. DIP — Dependency Inversion Principle:</h4><p>Princípio da Inversão de Dependência — <strong>Dependa de abstrações e não de implementações.</strong></p><p>De acordo com Uncle Bob, esse princípio pode ser definido da seguinte forma:</p><blockquote>Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender da abstração.</blockquote><blockquote>Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.</blockquote><p>No contexto da programação orientada a objetos, é comum que as pessoas confundam a <em>Inversão de Dependência (Princípio de Arquitetura) </em>com a <em>Injeção de Dependência (</em>D<em>esign Pattern)</em>, porém são coisas distintas, mas que relacionam entre si com um proposito em comum, deixar o código desacoplado.</p><p><strong>Inversão de Dependência:</strong> é a estratégia de depender de interfaces ou classes abstratas, ao invés de classes concretas.</p><p><strong>Injeção de Dependência:</strong> usado para evitar o alto nível de acoplamento de código dentro de uma aplicação.</p><p>No código abaixo criamos a interface <em>IEmailSender </em>e herdamos ela na classe.</p><pre>public interface IEmailSender<br>{<br>    void Send(string emailAddress, string message);<br>}<br><br>public class EmailSender: IEmailSender<br>{<br>    public void Send(string emailAddress, string message) {...}<br>}</pre><p>Aqui está uma forma de utilizar o <em>IEmailSender</em> como injeção de dependência na classe <em>NotificationService</em>, recebendo como parâmetro.</p><pre>public class NotificationService<br>{<br>    private IEmailSender _emailSender;<br><br>    public NotificationService(IEmailSender emailSender)<br>    {<br>        _emailSender = emailSender;<br>    }<br><br>    public void SendEmail(string emailAddress, string message)<br>    {<br>        _emailSender.Send(emailAddress, message);<br>    }<br>}</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=33d4cd08df31" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Linguagem de Programação]]></title>
            <link>https://medium.com/@renerlemess/linguagem-de-programa%C3%A7%C3%A3o-ee4e17ef8db4?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/ee4e17ef8db4</guid>
            <category><![CDATA[linguagem-de-programação]]></category>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Fri, 17 Jun 2022 13:01:34 GMT</pubDate>
            <atom:updated>2022-06-17T13:01:34.416Z</atom:updated>
            <content:encoded><![CDATA[<p>Vamos iniciar a nossa jornada partindo do princípio das linguagens de progrmação, vendo seus fundamentos e tipos.</p><h4>Linguagem Tipada</h4><p>É uma linguagem em que todas as variáveis tem um tipo específico e podem ser divididas em fortemente tipadas como Java, C#, Fortran, Cobol e fracamente tipadas como PHP e JavaScript. <br>É executada diretamente pelo sistema operacional ou pelo processador, após ser tradudizo por meio de um processo.</p><h4>Linguagem Interpretada</h4><p>É quando o código fonte é executado por um programa de computador chamado interpretador, que em seguida é executado pelo sistema operacional ou processador, como JavaScript, Lua, PHP, Python.</p><h4>Linguagem Compilada</h4><p>É uma linguagem de programação em que o código fonte é executado diretamente pelo sistema operacional ou pelo processador, após ser traduzido por meio de um processo chamado compilação, usando um programa de computador chamado compilador, para uma linguagem de baixo nível, como linguagem de montagem ou código de máquina, como C, C++, C#, Delphi.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ee4e17ef8db4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hello World :)]]></title>
            <link>https://medium.com/@renerlemess/hello-world-5abeda2f72af?source=rss-a517ac81733a------2</link>
            <guid isPermaLink="false">https://medium.com/p/5abeda2f72af</guid>
            <dc:creator><![CDATA[Rener Lemes]]></dc:creator>
            <pubDate>Sun, 12 Jun 2022 13:05:51 GMT</pubDate>
            <atom:updated>2022-06-12T15:21:42.645Z</atom:updated>
            <content:encoded><![CDATA[<h3>Hello World :)</h3><p>Acredito que todos nós temos algo a dizer e que ao compartilhar nossos conhecimentos, pensamentos e experiências, temos o poder de transformar a vida das pessoas.</p><p>Da minha parte, acredito que consigo ajudar simplificando alguns conceitos de tecnologia/desenvolvimento de software, trazendo isso de forma simples e compreensível, e com isso impactar, nem que seja em uma proporção menor essas pessoas.</p><blockquote>“Eu posso aceitar o fracasso. Todo mundo falha em alguma coisa. Mas eu não posso aceitar não tentar.” <br><strong>Michael Jordan</strong></blockquote><p>Este é o primeiro artigo que escrevo (o título não poderia ser outro), e espero que possa ser o primeiro de muitos. O principal tema será tecnologia, mas especificamente em desenvolvimento de software na linguagem C#, que é onde possui mais confiança e experiência, mas não deixa de ser referência também para outras linguagens.</p><p>Irei abordar diversos itens, como:</p><ul><li>Linguagem de programação</li><li>Princípios e conceitos básicos da linguagem</li><li>Estrutura de dados</li><li>Design patterns</li><li>Arquitetura de software</li><li>Banco de dados</li><li>Metodologias ágeis</li><li>…</li></ul><p>O conhecimento se torna maior quando é compartilhado e colaborativo. Se você achar que os artigos possam ser útil para alguém, compartilhe, vamos espalhar o conhecimento e levá-los mais longe. Sugestões são sempre bem-vindas e agrega valor a esse conhecimento.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5abeda2f72af" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>