Padrões Eficazes em JavaScript
Padrões Eficazes em JavaScript
Stoyan Stefanov
Padrões JavaScript
Dominando o Desenvolvimento de Aplicativos com
Padrões Eficazes em JavaScript
Escrito por Bookey
Saiba mais sobre o resumo de Padrões JavaScript
Ouvir Padrões JavaScript Audiolivro
Sobre o livro
Desvende os segredos do desenvolvimento eficaz de
aplicações JavaScript com este guia essencial do especialista
Stoyan Stefanov. "Padrões JavaScript" apresenta uma coleção
abrangente de padrões de codificação e melhores práticas,
especialmente desenvolvidas para enfrentar os desafios
complexos de objetos, funções, herança e muito mais, ideal
para desenvolvedores experientes. Seja ao criar aplicações do
lado do cliente, do lado do servidor ou para desktop, você
encontrará abstrações valiosas e modelos de código que
aprimoraram suas soluções. Mergulhe em conselhos práticos e
exemplos práticos que ilustram cada padrão, enquanto também
adquire insights sobre armadilhas comuns da programação a
serem evitadas. Eleve suas habilidades em JavaScript e crie
aplicações robustas com a sabedoria de um profissional
experiente ao seu alcance.
Sobre o autor
Stoyan Stefanov é um destacado desenvolvedor web, autor e
palestrante reconhecido por sua especialização em JavaScript e
desenvolvimento front-end. Com uma sólida formação em
ciência da computação e um profundo entendimento das
tecnologias web, Stoyan fez contribuições significativas para a
comunidade por meio de seus escritos, notavelmente o
aclamado livro "Padrões JavaScript", que explora as melhores
práticas e padrões de design para escrever código eficiente e
de fácil manutenção. Ele trabalhou com várias empresas de
tecnologia de ponta e compartilha ativamente suas percepções
sobre padrões web modernos, otimização de performance e
metodologias de programação, tornando-se uma voz respeitada
no campo do desenvolvimento JavaScript. Sua paixão pelo
ensino e sua clareza ao explicar conceitos complexos o
tornaram um recurso valioso para desenvolvedores que
buscam aprimorar suas habilidades.
Lista de conteúdo do resumo
Capítulo 1 : Padrões JavaScript
Capítulo 2 : 2. Essenciais
Capítulo 4 : 4. Funções
Capítulo 1: Introdução
Público-Alvo
Este livro tem como público-alvo desenvolvedores e
programadores profissionais que desejam elevar suas
habilidades em JavaScript. Presume-se que os leitores
estejam familiarizados com conceitos básicos de
programação. Tópicos avançados são explorados sob a
perspectiva de padrões.
Convenções do Livro
Agradecimentos
Padrões Explicados
Conceitos de JavaScript
Padrão ECMAScript
JSLint
Uso do Console
Tópico Descrição
Escrevendo Código O custo para corrigir bugs aumenta com o tempo; o código manutenível deve ser legível, consistente,
Manutenível previsível e documentado.
Minimizando Globais Evite variáveis globais para prevenir colisões de nomes e declare variáveis com `var` para evitar
globais implícitas.
Padrão de var Única Declare múltiplas variáveis no início das funções usando uma única declaração `var` para melhorar a
legibilidade.
Otimização de Loop Armazene o comprimento de arrays em loops `for` para melhorar o desempenho e evitar acessos
repetidos.
Usando Loops for-in Use loops for-in apenas para objetos não-array e aplique `hasOwnProperty()` para filtrar
propriedades de protótipos.
Prevenindo Conversão Use igualdade estrita (`===` e `!==`) para prevenir problemas causados pela conversão de tipo
de Tipo Implícita implícita do JavaScript.
Evitando eval() Evite usar `eval()` devido a preocupações de segurança; explore melhores alternativas para acesso
dinâmico a propriedades.
Escrevendo Use comentários para documentar o código e explicar lógicas complexas, mantendo-os atualizados
Comentários para evitar interpretações equivocadas.
Escrevendo Considere gerar automaticamente a documentação da API a partir dos comentários para facilitar os
Documentação de API processos de documentação.
Revisões por Pares Participe de revisões de código por pares para melhorar a qualidade do código e compartilhar
conhecimento com a equipe.
JSLint Execute o JSLint para identificar e corrigir problemas de codificação com base nas melhores práticas
discutidas no capítulo.
Minimizando Globais
Otimização de Loop
Evitando eval()
Escrevendo Comentários
JSLint
Resumo
Introdução
Literal de Objeto
Capítulo 4: Funções
Introdução às Funções
Desambiguação da Terminologia
Elevação de Funções
Padrão de Callback
Retornando Funções
Funções Imediatas
Padrões de Performance
Objetos de Configuração
Conclusão
Declaração de Dependências
Ao usar bibliotecas modulares, declarar dependências no
início de uma função melhora a clareza e a performance. Isso
permite a identificação explícita de scripts necessários e
depende de variáveis locais para acesso mais rápido.
Membros Estáticos
Constantes de Objeto
Embora JavaScript não tenha uma declaração de constante
incorporada, convenções de nomenclatura (usando
MAIÚSCULAS) podem informar os desenvolvedores sobre
valores fixos que devem permanecer inalterados. Um objeto
de constantes dedicado pode reforçar esse conceito.
Padrão de Encadeamento
O Método Método
Resumo
Padrão Singleton
Padrão Factory
Padrão Iterator
Padrão Decorator
Padrão Strategy
Padrão Facade
Padrão Mediator
Padrão Observer
-
Singleton
: Garante que exista uma única instância.
-
Factory
: Cria objetos com base em identificadores de string.
-
Iterator
: Navega por estruturas de dados complexas.
-
Decorator
: Adiciona funcionalidade em tempo de execução.
-
Strategy
: Seleciona algoritmos apropriados dinamicamente.
-
Facade
: Simplifica a interação com sistemas complexos.
-
Proxy
: Media o acesso a um objeto para melhoria de desempenho.
-
Mediator
: Reduz as dependências entre objetos.
-
Observer
: Gerencia notificações entre publicadores e assinantes.
Pensamento crítico
Ponto chave:Implementação de Padrões em
JavaScript
Interpretação crítica:O capítulo enfatiza a utilidade de
padrões como Singleton e Factory em JavaScript,
ressaltando sua adaptabilidade a um contexto de
linguagem dinâmica. No entanto, é preciso questionar se
a adesão rígida a esses padrões é sempre benéfica,
especialmente em um ambiente prototípico onde
soluções mais simples podem existir. Críticos sugerem
que, embora os padrões de design possam oferecer
abordagens estruturadas, eles também podem introduzir
uma complexidade desnecessária (Gamma et al.,
'Padrões de Design: Elementos de Software Orientado a
Objetos Reutilizáveis', 1994). Assim, os
desenvolvedores são incentivados a avaliar criticamente
quando aplicar padrões, considerando a natureza única
do JavaScript e o potencial para que recursos nativos da
linguagem sejam suficientes.
Capítulo 8 Resumo : 8. Padrões DOM e
de Navegador
Seção Resumo
Capítulo 8: Padrões de Este capítulo foca em padrões específicos para navegadores, abordando desafios devido a
DOM e Navegador inconsistências no DOM e promovendo as melhores práticas para scripting do lado do cliente.
Separação de Distingue três áreas no desenvolvimento web: Conteúdo (HTML), Apresentação (CSS) e
Preocupações Comportamento (JavaScript) para melhorar a usabilidade e a entrega de aplicações.
Scripting de DOM Enfatiza a performance no acesso e manipulação do DOM, defendendo técnicas de otimização como
evitar loops e minimizar atualizações do DOM.
Scripts de Longa Discute estratégias para manter a responsividade com setTimeout() para dividir tarefas e Web
Duração Workers para processamento em segundo plano.
Scripting Remoto Explora técnicas como XMLHttpRequest para comunicação assíncrona com o servidor e JSONP para
contornar restrições da política de mesma origem.
Frames e Beacons de Descreve o uso de iframes e beacons de imagem para comunicação com o servidor sem esperar uma
Imagem resposta.
Estratégias de Sugere colocar scripts antes da tag de fechamento e usar atributos defer/async para evitar bloquear a
Carregamento renderização da página.
Separação de Preocupações
Manipulação de Eventos
Programação Remota
Implantação de JavaScript
Estratégias de Carregamento
[Link]
Quem é o público-alvo de 'Padrões JavaScript'?
Resposta:O livro é destinado a desenvolvedores e
programadores profissionais que desejam aprimorar suas
habilidades em JavaScript. Ele não aborda tópicos para
iniciantes, como laços e condicionais, mas se concentra em
conceitos mais avançados a partir de uma perspectiva de
padrões.
[Link]
Que tipos de padrões 'Padrões JavaScript' discute?
Resposta:O livro explora três tipos principais de padrões:
Padrões de design, que se originam do 'Gang of Four';
Padrões de codificação, que se concentram em práticas
específicas de JavaScript; e Antipadrões, que destacam
práticas comuns que podem criar mais problemas do que
solucioná-los.
[Link]
Como o tratamento de objetos no JavaScript difere de
linguagens baseadas em classes?
Resposta:JavaScript não possui classes; em vez disso, ele
utiliza protótipos para herança e criação de objetos. Isso
permite uma composição de objetos mais simples, sem a
sobrecarga de definir classes e cadeias de herança. Os
desenvolvedores podem criar objetos diretamente e
modificá-los sem uma estrutura de classe formal.
[Link]
Quais conceitos básicos uma pessoa deve entender sobre
JavaScript para codificação eficaz, segundo o livro?
Resposta:Os conceitos-chave incluem entender que o
JavaScript é uma linguagem orientada a objetos, com funções
como objetos de primeira classe. Os desenvolvedores
também devem estar familiarizados com a natureza dos
objetos JavaScript, protótipos e como lidar com objetos
internos e definidos pelo usuário.
[Link]
Qual é a importância do 'modo estrito' no ECMAScript 5
(ES5)?
Resposta:O modo estrito no ES5 simplifica o JavaScript ao
remover certos recursos que muitas vezes levam a erros. Ele
encoraja práticas de codificação mais limpas e ajuda a
identificar problemas potenciais mais cedo, tornando o
código menos propenso a bugs.
[Link]
O que é JSLint e como ele ajuda os desenvolvedores
JavaScript?
Resposta:JSLint é uma ferramenta de qualidade de código
projetada para JavaScript que ajuda os desenvolvedores a
identificar problemas potenciais em seu código. Ela incentiva
as melhores práticas e pode detectar erros que, de outra
forma, poderiam passar despercebidos até a execução. Usar
JSLint pode melhorar significativamente a confiança na
codificação e a qualidade geral do código.
[Link]
Como a dependência ambiental do JavaScript afeta os
padrões de programação discutidos no livro?
Resposta:Embora o livro discuta principalmente padrões
centrais de JavaScript que são independentes do ambiente, é
importante notar que o JavaScript opera dentro de diferentes
ambientes que podem introduzir comportamentos únicos.
Reconhecer objetos host e suas funcionalidades pode
influenciar como os padrões são aplicados em situações
práticas.
[Link]
Qual o papel do objeto console na programação
JavaScript, conforme mencionado no livro?
Resposta:O objeto console serve como uma ferramenta para
os desenvolvedores output de dados, testar trechos de código
e depurar aplicações de forma não invasiva. Ele facilita o
aprendizado e a experimentação com o código JavaScript
sem interromper o fluxo da página da web.
Capítulo 2 | 2. Essenciais| Perguntas e respostas
[Link]
Por que é importante escrever um código que seja fácil de
manter?
Resposta:Escrever código que é fácil de manter
reduz o custo de correção de bugs, que aumenta ao
longo do tempo. Garante que tanto os
desenvolvedores originais quanto os subsequentes
possam entender e trabalhar facilmente com o
código, prevenindo frustrações e perda de tempo ao
revisitar projetos. Essa prática não só beneficia os
prazos do projeto, mas também aumenta a
satisfação dos desenvolvedores.
[Link]
Quais são alguns padrões comuns para minimizar
variáveis globais em JavaScript?
Resposta:Para minimizar variáveis globais, sempre use 'var'
ao declarar variáveis, utilize o padrão de namespacing e
considere funções autoexecutáveis. Essas estratégias ajudam
a evitar colisões de nomes e tornam o código mais limpo e
gerenciável.
[Link]
Qual é a prática recomendada para declarações de
variáveis em funções?
Resposta:O padrão de uma única declaração 'var' é
recomendado, onde todas as variáveis necessárias pela
função são declaradas no início. Isso ajuda a evitar erros
lógicos que podem surgir devido ao hoisting e mantém o
escopo da variável claro.
[Link]
Como seguir convenções de codificação pode melhorar a
qualidade do código?
Resposta:Convenções de codificação garantem consistência,
o que torna o código mais fácil de ler e entender. Quando
todos os desenvolvedores de uma equipe seguem convenções
estabelecidas, novos membros da equipe podem entender
rapidamente a estrutura do projeto, levando a uma
colaboração mais eficaz.
[Link]
Que passos os desenvolvedores podem seguir para
documentar suas APIs de maneira eficaz?
Resposta:Os desenvolvedores podem escrever comentários
em formatos especiais diretamente no código e usar
ferramentas como JSDoc ou YUIDoc para gerar
automaticamente a documentação da API. Isso combina os
benefícios de criar uma documentação útil com a eficiência
de manter o código.
[Link]
Por que os desenvolvedores devem rodar o JSLint em seu
código?
Resposta:Rodar o JSLint ajuda a identificar violações das
melhores práticas e padrões discutidos no capítulo, como
usar 'var' de forma consistente, lidar corretamente com
'eval()' e garantir a legibilidade do código. Ele serve como
uma ferramenta valiosa para manter a qualidade do código.
[Link]
O que deve ser evitado para prevenir colisões de nomes
em uma aplicação JavaScript?
Resposta:Para prevenir colisões de nomes, é crucial limitar o
uso de variáveis globais, garantir nomes únicos para funções
e variáveis, e escopar adequadamente as variáveis dentro das
funções. Utilizar um design modular também pode ajudar a
isolar o código e prevenir sobreposições.
[Link]
Qual é a diferença entre globais implícitas e explícitas em
JavaScript?
Resposta:Globais implícitas são variáveis que são criadas
sem declaração e se tornam automaticamente propriedades
do objeto global, enquanto globais explícitas são variáveis
globais devidamente declaradas usando 'var'. Globais
implícitas podem ser criadas inadvertidamente, levando à
poluição do escopo global.
[Link]
Como armazenar o comprimento em loops pode melhorar
o desempenho?
Resposta:Ao armazenar o comprimento de um array ou
coleção no início de um loop, você evita acessar
repetidamente a propriedade de comprimento em cada
iteração, o que pode melhorar significativamente o
desempenho, especialmente para HTMLCollections.
[Link]
Quais são as implicações de aumentar protótipos nativos
em JavaScript?
Resposta:Aumentar protótipos nativos pode levar a
comportamentos imprevisíveis no código, já que outros
desenvolvedores podem não esperar por essas mudanças. Isso
também pode levar a complicações em métodos que
dependem do comportamento padrão do protótipo,
potencialmente criando dores de cabeça na manutenção.
[Link]
Quais são algumas práticas eficazes para convenções de
nomenclatura em JavaScript?
Resposta:Algumas convenções de nomenclatura eficazes
incluem usar camel case para funções e variáveis (por
exemplo, 'minhaFuncao'), capitalizar construtores (por
exemplo, 'MeuConstrutor'), usar letras maiúsculas para
constantes (por exemplo, 'LARGURA_MAXIMA'), e
empregar um prefixo de sublinhado para propriedades
privadas (por exemplo, '_varPrivada'). Manter consistência
na nomenclatura torna o código mais compreensível.
Capítulo 3 | 3. Literais e Construtores| Perguntas e
respostas
[Link]
O que são literais em JavaScript e por que são preferidos
em relação a construtores?
Resposta:Literais em JavaScript são uma forma
concisa de definir objetos, arrays e expressões
regulares diretamente usando sintaxes como `{}`,
`[]`, ou `/padrão/`. Eles são preferidos em relação a
construtores como `Object()` ou `Array()` porque os
literais são mais concisos, expressivos, menos
propensos a erros e enfatizam que os objetos são
pares chave-valor mutáveis. Por exemplo, usar `var
dog = {name: 'Benji'}` é mais curto e claro do que
usar `var dog = new Object(); [Link] = 'Benji';`.
[Link]
O que é JSON e como ele se relaciona com literais
JavaScript?
Resposta:JSON, ou Notação de Objetos JavaScript, é um
formato de intercâmbio de dados leve que é derivado de
literais de objetos JavaScript. Ele é utilizado para
transferência de dados e permite a representação de objetos e
arrays usando uma sintaxe semelhante à dos literais
JavaScript, onde os nomes das propriedades devem estar
entre aspas duplas, e.g., `{`.
[Link]
Como podem ser criadas funções construtoras
personalizadas em JavaScript?
Resposta:Funções construtoras personalizadas em JavaScript
são definidas como funções regulares, mas são usadas com a
palavra-chave 'new' para criar instâncias de objetos. Por
exemplo:
javascript
function Person(name) {
[Link] = name;
[Link] = function() {
return 'Eu sou ' + [Link];
};
}
var adam = new Person('Adam');
[Link]([Link]()); // 'Eu sou Adam'
```
Esse padrão imita a criação de objetos baseada em classes e
permite métodos específicos de objetos.
[Link]
Qual é a diferença entre literais de objetos e funções
construtoras em termos de mutabilidade?
Resposta:Literais de objetos são inerentemente mutáveis,
permitindo que propriedades e métodos sejam adicionados,
modificados ou excluídos a qualquer momento após sua
criação. Por exemplo, você pode começar com `var dog = {}`
e adicionar `[Link] = 'Benji'` depois. Funções construtoras
também podem criar instâncias mutáveis, mas elas
frequentemente exigem mais código padrão e precisam
garantir que 'new' seja usado para evitar comportamentos
inesperados.
[Link]
Por que é importante garantir o uso de 'new' com funções
construtoras?
Resposta:Esquecer de usar 'new' ao chamar um construtor
pode levar a erros lógicos, já que `this` se referiria ao objeto
global em vez de uma nova instância de objeto. Isso pode
criar propriedades no escopo global inadvertidamente. Para
prevenir isso, padrões como verificar com 'instanceof' ou
invocar o construtor automaticamente com 'new' podem
ajudar a garantir um comportamento correto.
[Link]
Quais problemas podem surgir ao usar o construtor
`Array()`?
Resposta:Usar o construtor `Array()` pode levar a resultados
inesperados, especialmente ao passar um único número para
ele. Por exemplo, `new Array(3)` cria um array vazio de
comprimento 3, enquanto usar a notação de literal de array
`[]` diretamente é mais direto e previne confusões. É
recomendável sempre usar literais de array para clareza e
evitar essas armadilhas.
[Link]
Quando se deve preferir objetos wrapper primitivos, e
por que não usá-los geralmente?
Resposta:Objetos wrapper primitivos como `Number()`,
`String()`, e `Boolean()` geralmente não são necessários
porque primitivos podem se comportar como objetos por
meio de 'boxing' temporário para acesso a métodos. Isso
significa que você pode usar uma string como
`'hi'.toUpperCase()`, que funciona bem sem precisar de um
wrapper. Objetos wrapper são necessários apenas quando
você precisa especificamente aumentar um valor primitivo
com propriedades adicionais.
[Link]
O que são literais de expressões regulares e por que são
preferidos em relação ao construtor `RegExp`?
Resposta:Literais de expressões regulares são criados com
uma sintaxe concisa usando barras, e.g., `/padrão/`. Eles são
preferidos em relação ao construtor `RegExp` porque os
literais são mais fáceis de ler, menos verbosos e evitam
complicações com escapes de caracteres. Por exemplo, criar
uma regex para coincidir com uma barra invertida é direto
como `var re = /\/;`, comparado a `var re = new
RegExp('\\');`.
[Link]
Qual é a importância dos construtores de erro em
JavaScript?
Resposta:Construtores de erro como `Error()`, `TypeError()`,
e outros são importantes para tratamento de exceções em
JavaScript. Eles criam objetos de erro com propriedades
como `name` e `message`, que podem ser usados para
identificar e tratar erros específicos de forma adequada.
Objetos de erro personalizados também podem ser lançados
para melhor rastreamento e gerenciamento de erros.
[Link]
Como o JavaScript lida com o retorno de funções
construtoras?
Resposta:Em JavaScript, quando uma função construtora é
invocada com `new`, ela automaticamente retorna o objeto
criado referenciado por `this`, a menos que outro objeto seja
explicitamente retornado. Isso permite a flexibilidade de
retornar qualquer objeto, enquanto mantém um
comportamento consistente de retornar a instância
recém-criada por padrão.
Capítulo 4 | 4. Funções| Perguntas e respostas
[Link]
Por que dominar as funções é crucial para
programadores JavaScript?
Resposta:Dominar funções é crucial porque o
JavaScript depende fortemente de funções para
executar diversas tarefas, tornando-as essenciais
para uma programação eficaz. As funções, sendo
objetos de primeira classe, permitem
comportamento dinâmico, encapsulamento de lógica
e APIs mais limpas.
[Link]
Quais são as duas principais características das funções
em JavaScript que as distinguem das funções em outras
linguagens de programação?
Resposta:1. As funções são objetos de primeira classe, o que
significa que podem ser armazenadas em variáveis, passadas
como argumentos e retornadas de outras funções. 2. As
funções fornecem escopo, o que significa que criam um
escopo local para variáveis, ao contrário dos escopos de
bloco encontrados em algumas outras linguagens.
[Link]
Como a elevação de variáveis afeta as declarações de
funções em comparação com expressões de função em
JavaScript?
Resposta:Nas declarações de funções, tanto a existência da
função quanto seu corpo são elevados ao topo de seu escopo,
tornando-as utilizáveis antes de sua declaração real no
código. Em contrapartida, nas expressões de função, apenas a
declaração da variável é elevada, não o corpo da função,
resultando em 'undefined' se chamada antes de sua definição.
[Link]
O que é o padrão de callback e como ele é benéfico na
programação JavaScript?
Resposta:O padrão de callback envolve passar funções como
argumentos para outras funções. Isso permite programação
assíncrona, onde uma função pode executar uma função de
callback uma vez que uma tarefa é concluída, levando a
estruturas de código mais responsivas e flexíveis.
[Link]
O que são objetos de configuração e como eles melhoram
a usabilidade das funções?
Resposta:Objetos de configuração consolidam múltiplos
parâmetros em um único argumento de objeto, melhorando a
usabilidade das funções ao eliminar a necessidade de lembrar
a ordem e a presença de muitos argumentos individuais,
tornando as chamadas de função mais limpas e menos
propensas a erros.
[Link]
Você pode explicar o que é currying e dar um exemplo de
seu benefício?
Resposta:Currying é uma técnica de programação funcional
onde uma função com múltiplos argumentos é transformada
em uma série de funções, cada uma aceitando um único
argumento. Isso possibilita a aplicação parcial de argumentos
e pode resultar em um código mais reutilizável e conciso. Por
exemplo, currying uma função como add(a, b) pode permitir
que você crie uma nova função add5 que automaticamente
adiciona 5 a qualquer número dado.
[Link]
O que é memoização e em quais cenários ela é
particularmente útil?
Resposta:Memoização é uma técnica de otimização onde os
resultados de chamadas de funções caras são armazenados
em cache e retornados quando os mesmos insumos ocorrem
novamente. É particularmente útil em aplicações que
invocam repetidamente funções com os mesmos parâmetros,
como funções recursivas, pois pode reduzir
significativamente o tempo de computação.
[Link]
Descreva o que é uma função imediata e seu caso de uso.
Como ela ajuda a proteger o escopo global?
Resposta:Uma função imediata (função auto-invocada) é
executada assim que é definida e envolve o código dentro de
seu próprio escopo local. Isso protege o escopo global da
poluição, mantendo as variáveis localizadas na função
imediata, tornando-a ideal para código de inicialização onde
variáveis globais são desnecessárias.
[Link]
Por que entender closures é importante ao trabalhar com
funções em JavaScript?
Resposta:Closures permitem que funções mantenham acesso
às variáveis definidas em seu escopo externo mesmo após
esse escopo ter terminado de executar. Isso é crucial para
criar código encapsulado, possibilitando armazenamento de
dados privados e manutenção de estado em aplicações.
[Link]
O que são funções autodefinidas e quais vantagens elas
oferecem?
Resposta:Funções autodefinidas se redefinem ao serem
executadas, permitindo otimizações de recursos e
desempenho, pois podem eliminar cálculos desnecessários
após sua primeira invocação. Inicialmente, elas realizam um
trabalho de configuração e, em seguida, ajustam sua
implementação com base no que é necessário a seguir.
Capítulo 5 | 5. Padrões de Criação de Objetos|
Perguntas e respostas
[Link]
Quais são alguns dos principais padrões para criação de
objetos em JavaScript abordados neste capítulo?
Resposta:Este capítulo discute vários padrões
importantes para criação de objetos em JavaScript:
namespaces para organização e para evitar a
poluição global, o padrão de módulo para
encapsular código, padrões de privacidade para
controlar o acesso a propriedades e o padrão
sandbox, que cria ambientes isolados para a
execução de código.
[Link]
Como os namespaces podem ajudar em aplicações
JavaScript?
Resposta:Os namespaces ajudam a reduzir o número de
variáveis globais e a prevenir colisões de nomes ao permitir
que os desenvolvedores agrupem código relacionado dentro
de um único objeto global. Por exemplo, em vez de ter várias
funções globais, você pode criar um objeto global (como
MYAPP) e definir todas as suas funções como propriedades
desse objeto.
[Link]
O que é um membro privado em JavaScript e como você
pode implementar um?
Resposta:Um membro privado em JavaScript é uma
propriedade ou método que não é acessível fora de uma
determinada função ou objeto. Você pode implementar um
membro privado usando um closure. Por exemplo, definindo
uma variável dentro de uma função construtora e fornecendo
métodos públicos que podem acessar essa variável, você a
protege de ser acessada diretamente de fora do construtor.
[Link]
O que são métodos privilegiados?
Resposta:Métodos privilegiados são métodos públicos que
têm acesso a membros privados de um objeto. Por exemplo,
se você tem uma variável privada dentro de um construtor e
um método público definido dentro do mesmo construtor que
acessa essa variável privada, esse método é considerado
privilegiado.
[Link]
Qual é a vantagem de usar o padrão de módulo em
JavaScript?
Resposta:O padrão de módulo fornece uma maneira de
organizar e encapsular funções e propriedades relacionadas,
permitindo melhor gerenciamento do código à medida que as
aplicações crescem. Ele cria uma estrutura que ajuda os
desenvolvedores a criarem módulos autônomos com APIs
públicas claras, enquanto mantém os detalhes de
implementação interna privados.
[Link]
Como o padrão sandbox melhora o padrão de
namespaces?
Resposta:O padrão sandbox permite que múltiplas instâncias
de uma aplicação ou biblioteca sejam executadas na mesma
página sem interferir umas nas outras, algo que o padrão de
namespaces geralmente não consegue alcançar. Ao
encapsular o código em um ambiente sandbox, você pode
prevenir colisões acidentais e manter o namespace global
limpo.
[Link]
Como você pode criar membros estáticos em um
construtor JavaScript?
Resposta:Em JavaScript, membros estáticos podem ser
criados adicionando propriedades diretamente à função
construtora. Por exemplo, ao definir um método como
'[Link]étodo', você pode tornar esse
método chamável sem precisar de uma instância do
construtor.
[Link]
Qual é o padrão de encadeamento em JavaScript e por
que ele é útil?
Resposta:O padrão de encadeamento permite que múltiplas
chamadas de métodos sejam encadeadas em uma única
instrução. Isso é útil porque pode tornar o código mais
conciso e legível, permitindo que operações sejam realizadas
sequencialmente de forma fluida.
[Link]
Qual é a desvantagem ao usar o padrão de encadeamento
em JavaScript?
Resposta:Embora o padrão de encadeamento possa levar a
um código mais limpo e conciso, ele pode dificultar a
depuração, uma vez que pode não ser claro qual método
específico em uma cadeia causou um erro se algo der errado.
Isso pode levar a desafios na legibilidade e na manutenção.
[Link]
O que é clonagem de objetos e por que é importante ao
lidar com membros privados?
Resposta:Clonagem de objetos é o processo de criar uma
duplicata de um objeto. É importante ao lidar com membros
privados porque, se você estiver expondo um objeto ou array
privado por meio de um método privilegiado, retornar uma
referência a ele pode permitir que código externo modifique
esse conteúdo privado. Portanto, é mais seguro clonar o
objeto antes de retorná-lo.
Capítulo 6 | 6. Padrões de Reuso de Código|
Perguntas e respostas
[Link]
Qual é o principal objetivo da reutilização de código na
programação?
Resposta:O principal objetivo da reutilização de
código é escrever o menor código possível enquanto
reutiliza código existente, bom, testado, fácil de
manter, extensível e documentado.
[Link]
Como a herança se relaciona com a reutilização de
código?
Resposta:A herança é um dos meios para alcançar a
reutilização de código, permitindo que uma nova classe ou
objeto herde propriedades e métodos de um já existente, mas
não é o único caminho.
[Link]
Qual conselho o 'Gang of Four' fornece sobre a criação de
objetos?
Resposta:O 'Gang of Four' aconselha a 'Preferir a composição
de objetos à herança de classes', destacando que compor
objetos pode ser muitas vezes mais flexível e adequado do
que confiar apenas na herança.
[Link]
O que se refere 'herança clássica'?
Resposta:Herança clássica refere-se aos padrões de herança
que usam classes como modelos para objetos, como em
linguagens como Java, onde um objeto deve ser uma
instância de uma classe específica.
[Link]
Qual é a diferença entre padrões de herança clássica e
moderna em JavaScript?
Resposta:A herança clássica assume a presença de classes e
muitas vezes se baseia em funções construtoras, enquanto os
padrões de herança modernos focam na composição de
objetos e na cadeia de protótipos sem o paradigma do
construtor de classe.
[Link]
Por que os desenvolvedores devem evitar usar o termo
'classe' ao discutir herança em JavaScript?
Resposta:Os desenvolvedores devem evitar usar o termo
'classe' porque em JavaScript, pode significar coisas
diferentes para pessoas diferentes, e a linguagem opera
fundamentalmente com protótipos em vez de estruturas
clássicas de classes.
[Link]
O que é o padrão 'Rent-a-Constructor'?
Resposta:O padrão 'Rent-a-Constructor' resolve o problema
de passar argumentos de um construtor filho para um
construtor pai, emprestando o construtor pai e aplicando-o no
contexto do construtor filho.
[Link]
O que é herança prototípica?
Resposta:A herança prototípica é um padrão moderno em
JavaScript onde objetos herdam diretamente de outros
objetos, permitindo uma criação de objetos mais flexível e
reutilização sem a necessidade de estruturas baseadas em
classes.
[Link]
Como a função 'extend()' funciona no contexto da
herança por cópia de propriedades?
Resposta:A função 'extend()' cria uma cópia rasa das
propriedades de um objeto pai para um objeto filho,
permitindo que o filho herde funcionalidade sem estabelecer
uma relação formal de herança.
[Link]
Você pode descrever o padrão 'mix-in'?
Resposta:O padrão 'mix-in' permite a mesclagem de
propriedades de vários objetos fontes em um objeto alvo,
criando efetivamente um novo objeto que combina
funcionalidades de vários pais sem estabelecer uma cadeia de
herança.
[Link]
Qual é o propósito do método 'bind()' em JavaScript?
Resposta:O método 'bind()' em JavaScript é usado para criar
uma nova função que, quando chamada, tem sua
palavra-chave 'this' definida para o valor fornecido,
permitindo o compartilhamento de métodos enquanto
mantém o contexto correto.
[Link]
Quais são algumas desvantagens dos padrões de herança
clássica?
Resposta:Desvantagens incluem complexidade desnecessária,
potencial para problemas de desempenho devido a várias
chamadas de construtores e o risco de modificar propriedades
de protótipo compartilhadas, o que pode levar a efeitos
colaterais indesejados.
[Link]
Como o ECMAScript 5 impactou a herança prototípica?
Resposta:O ECMAScript 5 introduziu o método
[Link](), que permite uma herança prototípica mais
fácil e oficial, criando um novo objeto com um protótipo
especificado.
[Link]
Qual consideração chave os desenvolvedores devem ter
em mente sobre a reutilização de código?
Resposta:Os desenvolvedores devem ter em mente que,
embora a herança seja uma maneira de alcançar a reutilização
de código, técnicas mais simples, como emprestar métodos,
vincular, copiar propriedades e misturar funcionalidades,
costumam ser mais eficazes.
Capítulo 7 | 7. Padrões de Design| Perguntas e
respostas
[Link]
O que é o padrão Singleton e como ele se aplica ao
JavaScript?
Resposta:O padrão Singleton garante que uma
classe tenha apenas uma instância e fornece um
ponto de acesso global a ela. No JavaScript, como
não existem classes no sentido tradicional, todo
objeto criado usando um literal de objeto é, por
natureza, um singleton. Por exemplo, quando você
cria um objeto usando `var obj = { myprop: 'meu
valor' };`, `obj` já é um singleton. Mesmo que você
crie outro objeto com propriedades semelhantes
como `var obj2 = { myprop: 'meu valor' };`, `obj` e
`obj2` não serão a mesma instância porque ocupam
localizações de memória diferentes.
[Link]
O que é o padrão Factory e como ele é implementado em
JavaScript?
Resposta:O padrão Factory é utilizado para criar objetos sem
especificar a classe exata do objeto que será criado. No
JavaScript, isso pode ser implementado utilizando uma
função construtora que inclui um método estático para criar
instâncias com base em um tipo dado. Por exemplo, um
construtor `CarMaker` pode ter um método estático
`factory()` que cria diferentes tipos de objetos de carro com
base em uma entrada de string, como 'Compacto' ou 'SUV',
permitindo que os clientes criem objetos de carro sem
conhecer os tipos específicos com antecedência.
[Link]
Você pode explicar o propósito do padrão Observer?
Resposta:O padrão Observer permite que objetos se
comuniquem entre si sem acoplamento rígido em suas
implementações. Neste padrão, um objeto (o publicador)
mantém uma lista de observadores que estão interessados em
certos eventos. Quando um evento ocorre, o publicador
notifica todos os observadores registrados, permitindo que
eles reajam de acordo. Isso promove um acoplamento solto e
torna o sistema mais flexível.
[Link]
Quais são as vantagens de usar o padrão Proxy no
JavaScript?
Resposta:O padrão Proxy fornece uma interface para outro
objeto, controlando o acesso a ele. Pode ser utilizado para
inicialização preguiçosa, onde um objeto é criado apenas
quando necessário, economizando recursos. Proxies também
podem combinar múltiplas operações em uma única
operação, reduzindo o número de chamadas feitas ao
interagir com recursos caros, como requisições de rede,
tornando as aplicações mais eficientes.
[Link]
Como o padrão Mediator melhora a comunicação entre
objetos em um sistema?
Resposta:O padrão Mediator centraliza a comunicação entre
objetos, reduzindo dependências diretas entre eles. Em vez de
os objetos chamarem os métodos uns dos outros diretamente,
eles se comunicam através de um objeto mediador, que
gerencia a coordenação. Essa abordagem reduz o
acoplamento rígido, simplifica a manutenção e torna mais
fácil modificar comportamentos ou adicionar novos objetos
sem afetar o sistema como um todo.
[Link]
O que é o padrão Decorator e como ele alcança a
melhoria de funcionalidade?
Resposta:O padrão Decorator permite que comportamento
seja adicionado a objetos individuais, seja estaticamente ou
dinamicamente, sem afetar o comportamento de outros
objetos da mesma classe. No JavaScript, isso pode ser
implementado envolvimento um objeto dentro de outro
objeto que estende sua funcionalidade, permitindo
efetivamente a personalização do comportamento do objeto
em tempo de execução.
[Link]
Qual é a importância de entender padrões de design no
desenvolvimento JavaScript?
Resposta:Compreender padrões de design é crucial no
desenvolvimento JavaScript, pois eles fornecem soluções
comprovadas para problemas comuns de programação. Eles
incentivam melhores práticas, melhoram a organização do
código, aumentam a manutenibilidade e promovem código
reutilizável. Familiaridade com esses padrões permite que os
desenvolvedores escrevam códigos mais eficientes e
escaláveis, resultando em uma melhor arquitetura de
software.
Capítulo 8 | 8. Padrões DOM e de Navegador|
Perguntas e respostas
[Link]
Qual é o foco principal do Capítulo 8: Padrões do DOM e
do Navegador?
Resposta:Este capítulo enfoca principalmente
padrões específicos de navegador para o uso do
JavaScript, abordando várias preocupações
relacionadas à scriptagem do lado do cliente,
manipulação do DOM, tratamento de eventos e
estratégias de implantação.
[Link]
Quais são as três principais preocupações no
desenvolvimento de aplicações web discutidas neste
capítulo?
Resposta:As três principais preocupações são Conteúdo (o
documento HTML), Apresentação (os estilos CSS) e
Comportamento (o JavaScript que trata das interações do
usuário).
[Link]
Por que a separação de preocupações é importante no
desenvolvimento web?
Resposta:Separar preocupações ajuda a manter a usabilidade
entre diferentes agentes de usuário, melhora a eficiência do
desenvolvimento, facilita a resolução de problemas e
promove a melhoria progressiva para os usuários com base
nas capacidades de seus navegadores.
[Link]
O que é detecção de capacidade e por que é preferida em
relação à detecção de agente de usuário?
Resposta:A detecção de capacidade verifica se um método ou
propriedade existe no ambiente atual, tornando-se uma
abordagem mais confiável e à prova de futuro em
comparação com a detecção de agente de usuário, que é
considerada um antipadrão.
[Link]
Explique a importância de reduzir o acesso ao DOM no
desempenho do JavaScript.
Resposta:O acesso ao DOM pode ser um gargalo de
desempenho; portanto, é crucial minimizá-lo evitando
acessos em loops, armazenando referências ao DOM e
usando seletores eficientes para melhorar o desempenho.
[Link]
Como a manipulação do DOM pode ser otimizada para
reduzir reflows e repaints no navegador?
Resposta:Agrupe as atualizações do DOM criando alterações
em um fragmento de documento primeiro e, em seguida,
anexe-o ao DOM ativo de uma só vez, o que minimiza
operações de repaint e reflow onerosas.
[Link]
O que é delegação de eventos e como isso beneficia o
desempenho no JavaScript?
Resposta:A delegação de eventos usa um único listener de
eventos em um elemento pai para lidar com todos os eventos
de elementos filhos, reduzindo o número de listeners e
melhorando o desempenho e a clareza do código.
[Link]
Descreva como lidar com scripts de longa duração em
JavaScript para evitar falta de responsividade no
navegador.
Resposta:Scripts de longa duração devem ser divididos em
tarefas menores usando setTimeout para permitir que o
navegador permaneça responsivo, ou utilizar workers da web
para cálculos pesados em segundo plano.
[Link]
O que são JSONP e suas vantagens em relação ao
XMLHttpRequest tradicional?
Resposta:JSONP permite requisições entre domínios
envolvendo dados em uma chamada de função, contornando
a política de mesma origem, tornando-o útil para acessar
dados de APIs de terceiros.
[Link]
Quais estratégias podem ser usadas para otimizar o
desempenho de carregamento do JavaScript para
produção?
Resposta:As estratégias incluem combinar scripts para
minimizar requisições HTTP, minificar e comprimir arquivos
para reduzir o tamanho, configurar cache usando cabeçalhos
Expires, e utilizar CDNs para entrega mais rápida.
[Link]
Qual é a importância de usar o elemento script na
otimização dos tempos de carregamento da página?
Resposta:A colocação e os atributos do elemento <script>
podem afetar significativamente o desempenho de
carregamento; os scripts devem ser colocados no final do
documento e usar atributos como defer ou async para evitar
bloquear a renderização da página.
Padrões JavaScript Quiz e teste
Ver a resposta correta no site do Bookey