<?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[ Marcelo Schäffer Petry - 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[ Marcelo Schäffer Petry - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 04:46:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/m-petry/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 4 padrões de projeto que você deveria conhecer: Observer, Singleton, Strategy e Decorator ]]>
                </title>
                <description>
                    <![CDATA[ Você já esteve em uma equipe em que precisou começar um projeto do zero? Este é frequentemente o caso em muitas start-ups e outras pequenas empresas. Existem tantas linguagens de programação, arquiteturas e outras preocupações diferentes que pode ser difícil descobrir por onde começar. É aí que entram os padrões ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/4-padroes-de-projeto-que-voce-deveria-conhecer-observer-singleton-strategy-e-decorator/</link>
                <guid isPermaLink="false">63c6df5f91baea05fef70b67</guid>
                
                    <category>
                        <![CDATA[ Padrões de Projetos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcelo Schäffer Petry ]]>
                </dc:creator>
                <pubDate>Thu, 01 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/design-patterns.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/4-design-patterns-to-use-in-web-development/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">4 Design Patterns You Should Know for Web Development: Observer, Singleton, Strategy, and Decorator</a>
      </p><p><em>Você já esteve em uma equipe em que precisou começar um projeto do zero? Este é frequentemente o caso em muitas start-ups e outras pequenas empresas.</em></p><p>Existem tantas linguagens de programação, arquiteturas e outras preocupações diferentes que pode ser difícil descobrir por onde começar. É aí que entram os padrões de projeto.</p><p>Um padrão de projeto (do inglês, <em>design pattern</em>) é como um modelo para o seu projeto. Ele usa certas convenções e você pode esperar um tipo específico de comportamento dele. Esses padrões foram compostos de experiências de muitos desenvolvedores. Então, eles são realmente como diferentes conjuntos de melhores práticas.</p><p>Você e sua equipe decidem qual conjunto de melhores práticas é o mais útil para o seu projeto. Com base no padrão de projeto escolhido, todos vocês começarão a ter expectativas sobre o que o código deve fazer e sobre qual vocabulário usarão.</p><p>Os padrões de projeto de programação podem ser usados em todas as linguagens de programação e para se adequar a qualquer projeto, pois eles fornecem apenas um esboço geral de uma solução.</p><p>Existem 23 padrões oficiais no livro <em>Design Patterns - Elements of Reusable Object-Oriented Software</em>, que é considerado um dos livros mais influentes de teoria sobre a programação orientada a objetos e sobre desenvolvimento de software.</p><p>Neste artigo, abordarei quatro desses padrões de projeto para dar uma ideia do que são alguns dos padrões e quando você os usaria.</p><h2 id="o-padr-o-de-projeto-singleton"><strong>O padrão de projeto <em>Singleton</em></strong></h2><p>O padrão <em>singleton &nbsp;</em>permite que uma classe ou objeto tenha apenas uma instância e utilize uma variável global para armazenar essa instância. Você pode usar o carregamento lento (do inglês, <em>lazy loading</em>) para garantir que haja apenas uma instância da classe, pois ela só será criada quando você precisar.</p><p>Isso impede que múltiplas instâncias estejam ativas ao mesmo tempo, o que poderia causar bugs estranhos. Na maioria das vezes, isso é implementado no construtor. O objetivo do padrão <em>singleton </em>é, geralmente, regular o estado global de uma aplicação.</p><p>Um exemplo de <em>singleton </em>que você provavelmente usa o tempo todo é o seu log. Se você trabalha com alguns dos <em>frameworks </em>de <em>front-end</em>, como React ou Angular, sabe tudo sobre como pode ser difícil lidar com logs vindos de múltiplos componentes. Este é um ótimo exemplo de <em>singletons </em>em ação, pois você nunca quer mais de uma instância de um objeto de log, especialmente se estiver usando algum tipo de ferramenta de rastreamento de erros.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">class FoodLogger {
  constructor() {
    this.foodLog = []
  }
    
  log(order) {
    this.foodLog.push(order.foodItem)
    // faça um código elegante para enviar esse log para algum lugar
  }
}

// este é o singleton
class FoodLoggerSingleton {
  constructor() {
    if (!FoodLoggerSingleton.instance) {
      FoodLoggerSingleton.instance = new FoodLogger()
    }
  }
  
  getFoodLoggerInstance() {
    return FoodLoggerSingleton.instance
  }
}

module.exports = FoodLoggerSingleton</code></pre><figcaption>Um exemplo da classe <em>singleton</em></figcaption></figure><p>Agora, você não precisa se preocupar em perder logs de múltiplas instâncias, pois você só tem uma em seu projeto. Então, quando você quiser registrar o alimento que foi encomendado, pode usar a mesma instância de <em>FoodLogger </em>em múltiplos arquivos ou componentes.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">const FoodLogger = require('./FoodLogger')

const foodLogger = new FoodLogger().getFoodLoggerInstance()

class Customer {
  constructor(order) {
    this.price = order.price
    this.food = order.foodItem
    foodLogger.log(order)
  }
  
  // outras coisas legais acontecendo para o cliente
}

module.exports = Customer</code></pre><figcaption>Um exemplo de uma classe Customer usando o <em>singleton</em></figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-javascript">const FoodLogger = require('./FoodLogger')

const foodLogger = new FoodLogger().getFoodLoggerInstance()

class Restaurant {
  constructor(inventory) {
    this.quantity = inventory.count
    this.food = inventory.foodItem
    foodLogger.log(inventory)
  }
  
// outras coisas legais acontecendo no restaurante

module.exports = Restaurant</code></pre><figcaption>Um exemplo da classe Restaurant usando o mesmo <em>singleton </em>da classe Customer</figcaption></figure><p>Com esse padrão <em>singleton </em>instalado, você não precisa se preocupar apenas em obter os logs do arquivo principal da aplicação. Você pode obtê-los de qualquer lugar em sua base de código e todos eles vão exatamente para a mesma instância do <em>logger</em>, o que significa que nenhum de seus logs deve ser perdido devido a novas instâncias.</p><h2 id="o-padr-o-de-projeto-strategy"><strong>O padrão de projeto <em>Strategy</em></strong></h2><p>O padrão Strategy é como uma versão avançada de uma instrução "if else". É basicamente onde você cria uma interface para um método que você tem em sua classe base. Essa interface é usada para encontrar a implementação correta desse método que deve ser usado em uma classe derivada. A implementação, nesse caso, será decidida em tempo de execução com base no <em>client</em>.</p><p>O padrão Strategy é incrivelmente útil em situações em que você tem métodos obrigatórios e opcionais para uma classe. Algumas instâncias dessa classe não precisarão dos métodos opcionais e isso causa um problema para soluções de herança. Você poderia usar interfaces para os métodos opcionais, mas então teria que escrever a implementação toda vez que usasse essa classe, já que não haveria uma implementação padrão.</p><p>É aí que o padrão Strategy nos salva. Em vez do <em>client</em> procurar por uma implementação, ele delega para uma interface de Strategy e esta encontra a implementação correta. Um uso comum para isso é com sistemas de processamento de pagamentos.</p><p>Você poderia ter um carrinho de compras que só permite que os clientes finalizem a compra com cartões de crédito, mas perderia clientes que querem usar outros métodos de pagamento.</p><p>O padrão de projeto s<em>trategy </em>nos permite desacoplar os métodos de pagamento do processo de finalização da compra, o que significa que podemos adicionar ou atualizar estratégias sem alterar nenhum código no carrinho de compras ou no processo de finalização da compra.</p><p>Aqui está um exemplo de uma implementação do padrão <em>Strategy </em>usando o exemplo de método de pagamento.</p><figure class="kg-card kg-code-card"><pre><code class="language-typescript">class PaymentMethodStrategy {

  const customerInfoType = {
    country: string
    emailAddress: string
    name: string
    accountNumber?: number
    address?: string
    cardNumber?: number
    city?: string
    routingNumber?: number
    state?: string
  }
  
  static BankAccount(customerInfo: customerInfoType) {
    const { name, accountNumber, routingNumber } = customerInfo
    // faz coisas para receber o pagamento
  }
  
  static BitCoin(customerInfo: customerInfoType) {
    const { emailAddress, accountNumber } = customerInfo
    // faz coisas para receber o pagamento
  }
  
  static CreditCard(customerInfo: customerInfoType) {
    const { name, cardNumber, emailAddress } = customerInfo
    // faz coisas para receber o pagamento
  }
  
  static MailIn(customerInfo: customerInfoType) {
    const { name, address, city, state, country } = customerInfo
    // faz coisas para receber o pagamento
  }
  
  static PayPal(customerInfo: customerInfoType) {
    const { emailAddress } = customerInfo
    // faz coisas para receber o pagamento
  }
}</code></pre><figcaption>Um exemplo de implementação do padrão Strategy</figcaption></figure><p>Para implementar nosso método de pagamento de <em>Strategy</em>, criamos uma única classe com vários métodos estáticos. Cada método usa o mesmo parâmetro, <em>customerInfo</em>, e esse parâmetro tem um tipo definido de <em>customerInfoType</em> (viram só, vocês, desenvolvedores que usam TypeScript?). Observe que cada método tem sua própria implementação e usa valores diferentes de <em>customerInfo</em>.</p><p>Com o padrão <em>Strategy</em>, você também pode alterar dinamicamente a estratégia que está sendo usada no tempo de execução. Isso significa que você poderá alterar a estratégia ou implementação do método, sendo usado com base na entrada do usuário ou no ambiente em que a aplicação está sendo executada.</p><p>Você também pode definir uma implementação padrão em um arquivo <em>config.json</em> simples, como este:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">{
  "paymentMethod": {
    "strategy": "PayPal"
  }
}</code></pre><figcaption><em>config.json</em> para definir a implementação padrão de <em>paymentMethod </em>como "PayPal" no tempo de execução</figcaption></figure><p>Sempre que um cliente começar a fazer o <em>check-out</em> em seu site, o método de pagamento padrão que ele encontra é a implementação do PayPal que vem do <em>config.json</em>. Isso pode ser facilmente atualizado se o cliente selecionar um método de pagamento diferente.</p><p>Agora, vamos criar um arquivo para o nosso processo de <em>check-out</em>.</p><pre><code class="language-javascript">const PaymentMethodStrategy = require('./PaymentMethodStrategy')
const config = require('./config')

class Checkout {
  constructor(strategy='CreditCard') {
    this.strategy = PaymentMethodStrategy[strategy]
  }
  
  // faça algum código sofisticado aqui e obtenha a entrada do usuário e o método de pagamento
  
  changeStrategy(newStrategy) {
    this.strategy = PaymentMethodStrategy[newStrategy]
  }
  
  const userInput = {
    name: 'Malcolm',
    cardNumber: 3910000034581941,
    emailAddress: 'mac@gmailer.com',
    country: 'US'
  }
  
  const selectedStrategy = 'Bitcoin'
  
  changeStrategy(selectedStrategy)
  
  postPayment(userInput) {
    this.strategy(userInput)
  }
}

module.exports = new Checkout(config.paymentMethod.strategy)</code></pre><p>Essa classe <em>Checkout </em>é onde o padrão <em>Strategy</em> pode ser exibido. Importamos alguns arquivos para termos as estratégias de método de pagamento disponíveis e o padrão <em>Strategy</em> do <em>config</em>.</p><p>Em seguida, criamos a classe com o construtor e um valor de <em>fallback </em>para o padrão <em>Strategy</em> caso não haja um definido na configuração. Em seguida, atribuímos o valor de <em>Strategy</em> a uma variável de estado local.</p><p>Um método importante que precisamos implementar em nossa classe <em>Checkout </em>é a capacidade de alterar a estratégia de pagamento. Um cliente pode alterar o método de pagamento que deseja usar e você precisa ser capaz de lidar com isso. É para isso que serve o método <em>changeStrategy</em>.</p><p>Depois de fazer uma codificação sofisticada e obter todas as entradas de um cliente, você pode atualizar a estratégia de pagamento imediatamente com base na entrada e definir dinamicamente a variável <em>strategy </em>antes que o pagamento seja enviado para processamento.</p><p>Em algum momento, você pode precisar adicionar mais métodos de pagamento ao seu carrinho de compras e tudo o que você precisa fazer é adicioná-lo à classe <em>PaymentMethodStrategy</em>. Ele estará disponível instantaneamente em qualquer lugar em que a classe for usada.</p><p>O padrão de projeto <em>Strategy</em> é poderoso quando você está lidando com métodos que possuem múltiplas implementações. Pode parecer que você está usando uma interface, mas não precisa escrever uma implementação para o método toda vez que o chama em uma classe diferente. Ele oferece mais flexibilidade do que as interfaces.</p><h2 id="o-padr-o-de-projeto-observer"><strong>O padrão de projeto <em>Observer</em></strong></h2><p>Se você já usou o padrão MVC, você já usou o padrão de projeto <em>observer</em>. A parte do Modelo é semelhante ao "observado" e a parte da View é como um <em>observador </em>(do inglês, <em>observer) </em>do modelo. Seu modelo mantém todos os dados e o estado desses dados. Então, você tem os <em>observers</em>, como diferentes componentes, que vão pegar esses dados do observado quando os dados forem atualizados.</p><p>O objetivo do padrão de projeto <em>Observer</em> é criar essa relação de um para muitos entre o observado e todos os <em>observers</em> esperando por dados para que possam ser atualizados. Então, sempre que o estado do observado mudar, todos os <em>observers </em>serão notificados e atualizados instantaneamente.</p><p>Alguns exemplos de quando você usaria esse padrão incluem: envio de notificações de usuário, atualização, filtros e tratamento de assinantes.</p><p>Digamos que você tenha uma aplicação de página única com três listas suspensas de recursos, que dependem da seleção de uma categoria em uma lista suspensa de nível superior. Isso é comum em muitos sites de compras, como o <em>Home Depot</em>. Você tem vários filtros na página que dependem do valor de um filtro de nível superior.</p><p>O código para o menu suspenso de nível superior pode ser mais ou menos assim:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">class CategoryDropdown {
  constructor() {
    this.categories = ['appliances', 'doors', 'tools']
    this.subscriber = []
  }
  
  // finja que há algum código sofisticado aqui
  
  subscribe(observer) {
    this.subscriber.push(observer)
  }
  
  onChange(selectedCategory) {
    this.subscriber.forEach(observer =&gt; observer.update(selectedCategory))
  }
}</code></pre><figcaption>O assunto que atualiza os <em>observers</em></figcaption></figure><p>Este arquivo <em>CategoryDropdown </em>é uma classe simples com um construtor que inicializa as opções de categoria disponíveis no menu suspenso. Este é o arquivo que você usaria para recuperar uma lista do <em>back-end</em> ou qualquer tipo de classificação que deseja fazer antes que o usuário veja as opções.</p><p>O método <em>subscribe</em> é como cada filtro criado com essa classe receberá atualizações sobre o estado do <em>Observer</em>.</p><p>O método <em>onChange </em>é como enviamos uma notificação a todos os assinantes de que uma mudança de estado ocorreu no <em>Observer</em> que eles estão olhando. Apenas percorremos todos os assinantes e chamamos seu método de atualização com a categoria <em>selectedCategory</em>.</p><p>O código para os outros filtros pode parecer algo assim:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">class FilterDropdown {
  constructor(filterType) {
    this.filterType = filterType
    this.items = []
  }
  
  // mais código elegante aqui; talvez faça a chamada da API para obter a lista de itens baseada no filterType
  
  update(category) {
    fetch('https://example.com')
      .then(res =&gt; this.items(res))
  }
}</code></pre><figcaption>Um potencial <em>Observer</em> do observado.</figcaption></figure><p>Esse arquivo <em>FilterDropdown </em>é outra classe simples que representa todos os possíveis menus suspensos que podemos usar em uma página. Quando uma nova instância dessa classe é criada, ela precisa receber um <em>filterType</em>. Isso pode ser usado para fazer chamadas de API específicas para obter a lista de itens.</p><p>O método <code>update</code> é uma implementação do que você pode fazer com a nova categoria depois que ela foi enviada pelo <em>Observer</em>.</p><p>Agora, veremos o que significa usar esses arquivos com o padrão <em>Observer</em>:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">const CategoryDropdown = require('./CategoryDropdown')
const FilterDropdown = require('./FilterDropdown')

const categoryDropdown = new CategoryDropdown() 

const colorsDropdown = new FilterDropdown('colors')
const priceDropdown = new FilterDropdown('price')
const brandDropdown = new FilterDropdown('brand')

categoryDropdown.subscribe(colorsDropdown)
categoryDropdown.subscribe(priceDropdown)
categoryDropdown.subscribe(brandDropdown)</code></pre><figcaption>Um exemplo do padrão <em>Observer</em> em ação</figcaption></figure><p>O que este arquivo nos mostra é que temos 3 menus suspensos que são assinantes da categoria <em>drop-down</em> observável. Em seguida, assinamos cada um desses <em>drop-downs</em> para o <em>Observer</em>. Sempre que a categoria do <em>Observer </em>for atualizada, ele enviará o valor para cada assinante, o que atualizará as listas de <em>drop-down</em> individuais instantaneamente.</p><h2 id="o-padr-o-de-projeto-decorator"><strong>O padrão de projeto <em>Decorator</em></strong></h2><p>Usar o padrão de projeto <em>Decorator </em>é bastante simples. Você pode ter uma classe base com métodos e propriedades que estão presentes quando você cria um objeto com a classe. Agora, digamos que você tenha algumas instâncias da classe que precisam de métodos ou propriedades que não vieram da classe base.</p><p>Você pode adicionar esses métodos e propriedades extras à classe base, mas isso poderia estragar suas outras instâncias. Você poderia até criar subclasses para conter métodos e propriedades específicos que você precisa e que não pode colocar na sua classe base.</p><p>Qualquer uma dessas abordagens resolverá o seu problema, mas são desajeitadas e ineficientes. É aí que entra o padrão <em>Decorator</em>. Em vez de deixar o seu código base feio só para adicionar algumas coisas a uma instância de objeto, você pode colar essas coisas específicas diretamente na instância.</p><p>Então, se você precisar adicionar uma nova propriedade que contenha o preço de um objeto, você pode usar o padrão <em>decorator </em>para adicioná-lo diretamente a essa instância de objeto particular e isso não afetará qualquer outra instância desse objeto de classe.</p><p>Você já comprou comida <em>on-line</em>? Então, provavelmente, já encontrou o padrão <em>Decorator</em>. Se você estiver pegando um sanduíche e quiser adicionar coberturas especiais, o site não está adicionando essas coberturas a todas as instâncias de sanduíche que os usuários estão tentando pedir.</p><p>Aqui está um exemplo de uma classe de cliente:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">class Customer {
  constructor(balance=20) {
    this.balance = balance
    this.foodItems = []
  }
  
  buy(food) {
    if (food.price) &lt; this.balance {
      console.log('you should get it')
      this.balance -= food.price
      this.foodItems.push(food)
    }
    else {
      console.log('maybe you should get something else')
    }
  }
}

module.exports = Customer</code></pre><figcaption>Exemplo de classe de cliente (customer)</figcaption></figure><p>Aqui está um exemplo de uma classe de sanduíche:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">class Sandwich {
  constructor(type, price) {
    this.type = type
    this.price = price
  }
  
  order() {
    console.log(`Você pediu um sanduíche de ${this.type} no valor de $ ${this.price}.`)
  }
}

class DeluxeSandwich {
  constructor(baseSandwich) {
    this.type = `${baseSandwich.type} deluxe`
    this.price = baseSandwich.price + 1.75
  }
}

class ExquisiteSandwich {
  constructor(baseSandwich) {
    this.type = `${baseSandwich.type} delicioso`
    this.price = baseSandwich.price + 10.75
  }
  
  order() {
    console.log(`Você pediu um sanduíche ${this.type}. Ele tem o que você precisa para ficar feliz por dias.`)
  }
}

module.exports = { Sandwich, DeluxeSandwich, ExquisiteSandwich }</code></pre><figcaption>Exemplo de classe de sanduíche</figcaption></figure><p>A classe de sanduíche é onde o padrão <em>Decorator </em>é usado. Temos uma classe base <em>Sandwich </em>que estabelece as regras para o que acontece quando um sanduíche regular é encomendado. Os clientes podem querer atualizar os sanduíches e isso significa apenas uma mudança de ingredientes e preço.</p><p>Você só queria adicionar a funcionalidade de aumentar o preço e atualizar o tipo de sanduíche para o <em>DeluxeSandwich </em>sem mudar como é encomendado. Embora possa ser necessário um método de pedido diferente para o <em>ExquisiteSandwich </em>devido à mudança drástica na qualidade dos ingredientes.</p><p>O padrão <em>decorator </em>permite que você altere dinamicamente a classe base sem afetá-la ou a qualquer outra classe. Você não precisa se preocupar em implementar funções que não sabe, como com interfaces, e não precisa incluir propriedades que não usará em todas as classes.</p><p>Agora, vamos passar por um exemplo onde essa classe é instanciada como se um cliente estivesse fazendo um pedido de sanduíche.</p><pre><code class="language-javascript">const { Sandwich, DeluxeSandwich, ExquisiteSandwich } = require('./Sandwich')
const Customer = require('./Customer')

const cust1 = new Customer(57)

const turkeySandwich = new Sandwich('Peru', 6.49)
const bltSandwich = new Sandwich('Bacon, alface e tomate', 7.55)

const deluxeBltSandwich = new DeluxeSandwich(bltSandwich)
const exquisiteTurkeySandwich = new ExquisiteSandwich(turkeySandwich)

cust1.buy(turkeySandwich)
cust1.buy(bltSandwich)</code></pre><h2 id="considera-es-finais"><strong>Considerações finais</strong></h2><p>Eu costumava achar que os padrões de projeto eram essas orientações de desenvolvimento de software loucas e distantes. Mais tarde, descobri que os utilizo o tempo todo!</p><p>Alguns dos padrões que abordei são usados em tantas aplicações que fariam sua cabeça girar. Eles são apenas teoria no fim das contas. Cabe a nós, desenvolvedores, usar essa teoria de maneiras que tornem nossas aplicações fáceis de implementar e de manter.</p><p>Você já usou algum dos outros padrões de projeto em seus projetos? A maioria dos lugares geralmente escolhe um padrão de projeto e adere a ele. Então, gostaria de ouvir de vocês sobre os padrões que vocês usam.</p><p>Obrigado pela leitura.</p><p></p><p>Siga a autora no <a href="https://twitter.com/FlippedCoding">Twitter</a>, onde ela publica sobre coisas úteis e/ou divertidas.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
