1
resposta

[Dúvida] Resolução/Dúvida - Fiz um pouco diferente

Fiz de uma forma mais simplificada. Usei um objeto como modelo para a criação dos novos pensamentos, e nele "capturei" os valores contidos nos inputs. Também adicionei um alert apenas para cumprir o papel de confirmação do salvamento.

Tenho uma dúvida. Há uma grande diferença (seria um problema?), nesse caso especificamente, de criar essa função dentro do arquivo main.js em vez de criar no ui.js? Criei ele assim por conta de já haver uma função de evento dentro do main.js, meio que para "seguir um padrão".

import api from "./api.js";
import ui from "./ui.js";

const form = document.getElementById("pensamento-form");
const idPensamento = document.getElementById("pensamento-id");
const pensamento = document.getElementById("pensamento-conteudo");
const autoria = document.getElementById("pensamento-autoria");

document.addEventListener("DOMContentLoaded", async () => {
  ui.renderizarPensamentos();
});

form.addEventListener("submit", async (e) => {
  e.preventDefault();

  const novoPensamento = {
    id: idPensamento.value,
    conteudo: pensamento.value.trim(),
    autoria: autoria.value.trim(),
  };

  alert("Salvei o seu pensamento!");

  await api.salvarPensamento(novoPensamento);
  await ui.renderizarPensamentos();
});
1 resposta

Olá, Gabriel. Como vai?

A sua resolução ficou excelente! Criar um objeto literal capturando os dados dos inputs com o método .trim() é uma abordagem muito limpa e segura, pois evita que o usuário salve textos compostos apenas por espaços em branco. O uso do alert também funciona perfeitamente para dar esse feedback visual imediato.

Respondendo diretamente à sua dúvida: não há um problema técnico imediato, mas existe uma diferença importante sobre arquitetura de software e organização de código.

Vamos entender o porquê e analisar as boas práticas para esse cenário:

O papel de cada arquivo (Separação de Conceitos)

Quando dividimos o projeto em arquivos como api.js, ui.js e main.js, estamos aplicando um princípio chamado Separação de Responsabilidades. A ideia é que cada arquivo cuide de apenas um "assunto":

  • api.js: Cuida exclusivamente da comunicação com o servidor (requisições HTTP como GET, POST, PUT, DELETE).
  • ui.js (User Interface): Cuida estritamente da manipulação do DOM (capturar dados da tela, limpar formulários, renderizar elementos na página).
  • main.js: Funciona como o "orquestrador" ou o cérebro principal do aplicativo. Ele importa as funções dos outros arquivos e dita o fluxo dos acontecimentos, geralmente escutando os eventos (como o submit).

Onde deve ficar a captura dos dados?

A criação do objeto novoPensamento extrai os valores diretamente dos elementos HTML (pensamento.value, autoria.value). Como isso envolve interagir diretamente com a interface do usuário (DOM), a boa prática sugere que essa lógica de extração fique encapsulada dentro do ui.js.

Se você mantiver a captura no main.js, o seu arquivo principal precisa conhecer detalhes internos do HTML (como os IDs dos inputs). Se amanhã você mudar o ID de um input no HTML, precisará mexer no main.js, quando o ideal seria alterar apenas o ui.js.


Sugestão de Refatoração

Para manter o seu padrão de escutar o evento dentro do main.js, mas isolar a responsabilidade da interface no ui.js, você pode criar uma função auxiliar no ui.js que apenas extrai e devolve esses dados para o main.js.

Veja como o seu main.js ficaria ainda mais limpo e elegante:

import api from "./api.js";
import ui from "./ui.js";

const form = document.getElementById("pensamento-form");

document.addEventListener("DOMContentLoaded", async () => {
  ui.renderizarPensamentos();
});

form.addEventListener("submit", async (e) => {
  e.preventDefault();

  // O ui.js isola o DOM e nos devolve apenas o objeto pronto
  const novoPensamento = ui.obterDadosDoFormulario();

  alert("Salvei o seu pensamento!");

  await api.salvarPensamento(novoPensamento);
  await ui.renderizarPensamentos();
  
  ui.limparFormulario(); // Opcional: boa prática para resetar os campos
});

E dentro do seu arquivo ui.js, você implementaria a função que lê os inputs:

// Exemplo de como ficaria no ui.js
const ui = {
  obterDadosDoFormulario() {
    return {
      id: document.getElementById("pensamento-id").value,
      conteudo: document.getElementById("pensamento-conteudo").value.trim(),
      autoria: document.getElementById("pensamento-autoria").value.trim(),
    };
  },
  
  // suas outras funções como renderizarPensamentos()...
};

export default ui;

Dessa forma, você mantém o seu padrão de gerenciar os eventos no main.js, mas o seu código ganha muito mais maturidade, facilitando futuras manutenções e testes.

Parabéns pelo questionamento arquitetural, pensar na organização do código é o que diferencia um desenvolvedor júnior de um pleno!

Espero que possa ter lhe ajudado!