<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Qualidade do código - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Qualidade do código - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 28 May 2026 16:39:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/qualidade-do-codigo/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como (e por que) incorporar conceitos de domínio no código ]]>
                </title>
                <description>
                    <![CDATA[ Imagine que o código é como uma receita de bolo: ele precisa ser fácil de entender para que qualquer um possa seguir os passos e ter o resultado esperado. Para isso, é fundamental que ele reflita claramente o problema que está resolvendo, como se estivesse falando a língua do problema. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-e-por-que-incorporar-conceitos-de-dominio-no-codigo/</link>
                <guid isPermaLink="false">668ad46823266d03fc8b8468</guid>
                
                    <category>
                        <![CDATA[ Qualidade do código ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kris Lagerström ]]>
                </dc:creator>
                <pubDate>Tue, 23 Jul 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/07/2015-Gran-Paradiso-007.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/embedding-domain-concepts-in-code/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How (and why) to embed domain concepts in code</a>
      </p><p>Imagine que o código é como uma receita de bolo: ele precisa ser fácil de entender para que qualquer um possa seguir os passos e ter o resultado esperado. Para isso, é fundamental que ele reflita claramente o problema que está resolvendo, como se estivesse falando a língua do problema.</p><p>Incorporar os conceitos do problema no código exige atenção e habilidade. Isso não acontece automaticamente só porque você está usando TDD (Desenvolvimento Orientado a Testes). Acredite, porém, que esse esforço extra vale a pena, pois resulta em um código muito mais fácil de entender e manter.</p><p>Para ilustrar, vou usar um exemplo que vivenciei em um encontro de programadores. O desafio era criar um Relógio de Berlim simplificado, que mostra as horas através de luzes que piscam em um padrão específico (veja a imagem abaixo). No nosso caso, a saída era em formato de texto, mas a ideia é a mesma.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/07/berlin-clock-2.gif" class="kg-image" alt="berlin-clock-2" width="600" height="400" loading="lazy"></figure><h2 id="solu-o-inicial-com-tdd">Solução Inicial com TDD</h2><p>Muitas duplas usaram a técnica de TDD "de dentro para fora" e chegaram a soluções parecidas com esta (o <a href="https://github.com/ceddlyburge/berlin-clock-initial-tdd-solution/blob/master/BerlinClock.py">código completo está no GitHub</a>).</p><pre><code class="language-python">def berlin_clock_time(julian_time):
    hours, minutes, seconds = list(map(int, julian_time.split(":")))

    return [
        seconds_row_lights(seconds % 2)
        , five_hours_row_lights(hours)
        , single_hours_row_lights(hours % 5)
        , five_minutes_row_lights(minutes)
        , single_minutes_row_lights(minutes % 5)
    ]

def five_hours_row_lights(hours):
    lights_on = hours // 5
    lights_in_row = 4
    return lights_for_row("R", lights_on, lights_in_row)

# ...</code></pre><p>Essa solução surge naturalmente ao aplicar o TDD, mas observe que alguns detalhes importantes sobre como o relógio funciona ficam escondidos nas funções auxiliares, como a <code>get_five_hours</code>.</p><h2 id="elevando-os-conceitos">Elevando os conceitos</h2><p>Para melhorar a clareza, podemos trazer alguns desses detalhes para o topo do código, mesmo que isso quebre alguns testes (o <a href="https://github.com/ceddlyburge/berlin-clock-elevated-concepts/blob/master/BerlinClock.py">código completo está no GitHub</a>).</p><pre><code class="language-python">def berlin_clock_time(julian_time):
    hours, minutes, seconds = list(map(int, julian_time.split(":")))

    single_seconds = seconds_row_lights(seconds % 2)
    five_hours = row_lights(
        light_colour="R",
        lights_on=hours // 5,
        lights_in_row=4)
    single_hours = row_lights(
        light_colour="R",
        lights_on=hours % 5,
        lights_in_row=4)
    five_minutes = row_lights(
        light_colour="Y",
        lights_on=minutes // 5,
        lights_in_row=11)
    single_minutes = row_lights(
        light_colour="Y",
        lights_on=minutes % 5,
        lights_in_row=4)

    return [
        single_seconds,
        five_hours,
        single_hours,
        five_minutes,
        single_minutes
    ]

# ...</code></pre><p>Agora, fica mais evidente que:</p><ul><li>Existem 5 linhas no relógio.</li><li>A linha dos segundos é um caso especial.</li><li>Há 2 linhas para as horas e 2 para os minutos.</li><li>As linhas usam cores diferentes (vermelho e amarelo).</li><li>Cada linha tem um número diferente de luzes.</li></ul><h2 id="nomeando-conceitos-impl-citos">Nomeando conceitos implícitos</h2><p>Apesar da melhoria, ainda não está claro como as linhas se relacionam entre si e o que cada luz representa em termos de tempo. Para resolver isso, precisamos tornar esses conceitos implícitos explícitos, dando nomes a eles.</p><p>Por exemplo, podemos passar um valor <code>time_per_light</code> para a função <code>row_lights</code>. Isso nos leva a perceber que existem dois tipos de linhas:</p><ul><li>Linhas que representam a divisão inteira do tempo (<code>//</code>).</li><li>Linhas que representam o resto da divisão (<code>%</code>).</li></ul><p>Ao analisarmos o primeiro caso, notamos que o segundo parâmetro é sempre 5 (5 horas ou 5 minutos). Já no segundo caso, o <code>time_per_light</code> (tempo por luz) é sempre 1 (1 hora ou 1 minuto), complementando o primeiro caso.</p><p>Com essa percepção, podemos reescrever as linhas da seguinte maneira:</p><pre><code class="language-python">five_hour_row = row_lights(
    time_per_light=5,
    value=hours, 
    light_colour="R",
    lights_in_row=4)</code></pre><p>Essa mudança deixa claro que existe uma relação de pai e filho entre as linhas, onde a linha do resto depende da linha da divisão inteira.</p><p>Com base nisso, podemos criar uma função específica para as linhas "filhas" e o código fica assim (o <a href="https://github.com/ceddlyburge/berlin-clock">código completo está no GitHub</a>):</p><pre><code class="language-python">def berlin_clock_time(julian_time):
    hours, minutes, seconds = list(map(int, julian_time.split(":")))

    return [
        seconds_row_lights(
            seconds % 2),
        parent_row_lights(
            time_per_light=5,
            value=hours, 
            light_colour="R",
            lights_in_row=4),
        child_remainder_row_lights(
            parent_time_per_light=5,
            value=hours,
            light_colour="R"),
        parent_row_lights(
            time_per_light=5,
            value=minutes, 
            light_colour="Y",
            lights_in_row=11),
        child_remainder_row_lights(
            parent_time_per_light=5,
            light_colour="Y",
            value=minutes)
    ]

# ...</code></pre><p>Agora, com uma rápida olhada no código, podemos entender quase todos os conceitos do domínio do problema:</p><ul><li>A primeira linha representa os segundos e é um caso especial.</li><li>Na segunda linha, cada luz "R" representa 5 horas.</li><li>A terceira linha mostra o resto da divisão das horas por 5.</li><li>Na quarta linha, cada luz "Y" representa 5 minutos.</li><li>A quinta linha mostra o resto da divisão dos minutos por 5.</li></ul><h2 id="conclus-es">Conclusões</h2><p>Incorporar os conceitos de domínio no código exige tempo e esforço – e o TDD não faz isso para você, necessariamente. No entanto, esses conceitos tornam o código muito mais fácil de entender e manter, o que economiza tempo e dinheiro a longo prazo. Lembre-se de que, como em uma receita de bolo, um código claro e organizado é essencial para que todos possam "colaborar na cozinha" sem dificuldades.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
