Skip to content

Sumários

Miguel Gamboa edited this page Nov 9, 2020 · 51 revisions

Aulas

Livro de Referência:


06-10-2020

  • Apresentação da disciplina de Programação na Internet -- PI
  • Regras de avaliação
  • Bibliografia
  • Documentação suplementar: nodeschool.io
  • Evolução histórica do Javascript desde o seu aparecimento em 1995 com o objectivo inicial de uma linguagem de scripting para o browser até à sua execução no ambiente Node.js
  • Papel da linguagem Javascript como: alto nível (e.g. Java, C, etc) e intermédia (e.g. bytecodes, IL).
  • SLIDES: pi-52d-aula01.pdf

08-10-2020

  • Análise das características da linguagem de programação Javascript como: dinâmica, untyped, e interpretada.
  • Duck Typing
  • Dinâmica -- Adicionar e remover propriedades em Tempo de Execução:
    • obj.nova_prop -- adicionar uma propriedade que não existe
    • delete obj.prop -- remover uma propriedades existente
  • Ambiente de desenvolvimento:
    • Modo use strict
    • ESLint -- Javascript linter
    • Editor e.g. Visual Code, Notepad, InteliJ, etc.
  • Scopes:
    • let e const – variáveis que NÃO podem ser usadas fora do bloco em que foram declaradas. Temporal Dead Zone
    • var - scope da função onde é declarada. Recomendação de NÃO usar.
  • Sistema de tipos EcmaScript edição 6: Object e Primitivos (todos os outros que não são Object)
  • Tipos Primitivos: Undefined, Null, Boolean, Number, String.
  • operador typeof e instanceof
  • Objecto Literal: { prop1: valor1, prop: valor2, …}
  • propriedades são membros de um objecto que armazenam valores.
  • SLIDES: pi-52d-aula02.pdf

09-10-2020

  • Node.js:
    • = AVE + gestão de dependencias (bibliotecas)
    • = V8 + NPM package manager
  • V8 JavaScript Engine projecto open-source de uma máquina virtual da Google, parte integrante do Browser Chrome, lançado em 2008.
  • V8 como um Ambiente Virtual de Execução com as mesmas características de outros ambientes como JVM, ou CLR.
  • Os componentes são distribuídos em código fonte JavaScript, podendo o JavaScript ter também uma perspectiva de linguagem intermédia como target de compiladores de linguagens como o TypeScript, Python, entre outras.

  • Uma propriedade que armazena uma função é um método
  • Função Construtora --- tem uma propriedade explícita prototype.
  • Objecto ––– constructor –––> função Construtora (código) ––– prototype –––> objecto Protótipo.
  • O protótipo tem a semântica do padrão de desenho Prototype
  • O protótipo serve de “modelo” à criação de novos objectos
  • Exemplos de actualização do prototype e reflexo nos objectos com esse prototype
  • Properties Lookup (o objecto tem precedência sobre o protótipo)
    • Primeiro procura no objecto uma propriedade com o nome igual
    • Caso não encontre, então procura no prototype uma propriedade com esse nome

  • Funções são first-class objects -- as funções têm todas funcionalidades que tem qualquer outro objecto JavaScript:
    • Podem ser atribuídas a variáveis
    • Podem ser passadas por parâmetro
    • Podem ter propriedades definidas pelo programador (campos ou métodos)
  • Funções têm uma capacidade adicional sobre os objectos que é poderem ser invocadas.,

  • Introspecção sobre objectos em Javascript (comparação com Reflexão via .Net ou Java):
    • Enumeração sobre nomes das propriedades de um objecto – for(let key in objRef)
    • Aceder a uma propriedade com nome dado por uma expressão: obj[exp]
    • Chamar um método com nome dado por uma expressão: obj[exp]()

13-10-2020


  • Função Construtora
  • Chamada realizada com o operador prefixo new
  • O construtor retorna implicitamente o novo objecto (this) a não ser que haja retorno explícito
  • Associação de método de instância por via do Prototype
    • e.g. Point.prototype.module = function() {return Math.sqrt(this.x*this.x + this.y*this.y)}

  • Definição equivalente com class em ECMAScript 6
  • Os métodos correspondem a proprieades not enumerable <=>:
Object.defineProperty(Point.prototype, 'module', {
    value: function() {
        return Math.sqrt(this.x*this.x + this.y*this.y)
    }
})

  • Enumerar propriedades visíveis: for(let propName in obj)
  • Enumerar todas as propriedades: for(let propName of Object.getOwnPropertyNames(obj))

  • As funções são declaradas como literais que criam um valor função. 3 formas:
    • função com nome e.g. function foo() {}
    • função sem nome e.g. function () {} (função anónima)
    • arrow function e.g. () => {} (função anónima)

  • Uma função tem uma propriedade name que guarda o nome declarado na função.
  • Funções anónimas têm a propriedade name igual "" string vazia.
  • O nome da variável que refere uma função != da propriedade name dessa função

  • Todas as funções recebem dois parâmetros implícitos: this e arguments
  • arguments é uma colecção com o mesmo comportamento de array mas sem os seus métodos.
  • O número de argumentos, não tem que coincidir com o número de parâmetros
  • 4 formas de chamar uma função:
    • Como uma função (sem target) => this igual a undefined
    • Como um método de instância -- this igual ao target e.g. target.methodName()
    • Como construtor -- this igual ao objecto criado e.g. new funcName()
    • com apply() ou call()

  • Função Construtora
  • Chamada realizada com o operador prefixo new
  • O operador new altera o significado do this que refere o objecto criado;
  • O construtor retorna implicitamente o novo objecto (this) a não ser que haja retorno explícito;

Closure:

  • Por cada chamada a uma função é criado um novo conjunto de variáveis com o contexto dessa função;
  • As funções internas têm acesso às variáveis locais (parâmetros, ou não);
  • NESTE caso, o ciclo de vida das variáveis externas é prolongado (apenas se for usada a função interna).

  • package.json
  • npm init
  • npm install <pkg> --save -- download módulo <pkg> e actualiza package.json
  • repositório local node_modules -- Adicionar ao .gitignore
  • npm install -- download das bibliotecas especificadas em package.json

  • CommonJS -- definição do formato dos módulos.
  • require(‘nome’) -- incorpora um módulo Node na forma de um objecto.
  • module.exports
  • fs = require('fs') -- módulo file system
  • Exemplos de utilização da API síncrona de sync-request:
    • req('GET', 'http://example.com').getBody().toString()

  • Node.js: Google's V8 JavaScript engine + event loop + low-level I/O API;
  • Event Loop para executar operações (na forma de callbacks) quando um evento ocorre.
  • Felix Geisendörfer: “everything runs in parallel except your code.”
  • Vários callbacks podem responder a um mesmo evento, mas só um é executado em cada instante – sequencialmente.
  • Os callbacks NÃO são interrompidos por outros callbacks, nem correm em paralelo com outros callbacks.
  • Do ponto de vista da linguagem JavaScript o Node.js oferece um ambiente single-threaded.
  • Todas as operações de IO do Node.js podem ser executadas emsimultaneo e.g. ler ficheiros; peidos HTTP,….
  • As operações de IO usam técnicas non-blocking.

github.com/maxogden/art-of-node

  • Distinção entre modelo de chamada síncrono versus assíncrono. Exemplos.
  • Exemplificação em Node Js de uma sequência de pedidos Http de forma Síncrona versus Assíncrona através dos módulos sync-request vs request.
  • Idiomatic Node.js callback convention -- (err, data) => void
  • Características do modelo de callback do node.js:
    • (err, data) => void
    • O callback é o último parâmetro passado a um método assíncrono.
    • Idioma: if(err) return cb(err)
    • Em caso de sucesso: cb(null, data)

github.com/maxogden/art-of-node

  • Revisão do modelo Assíncrono baseado em Callback
  • Menção a outras formas de utilização de um modelo de chamada assíncrono (tratado na UC de Programação Concorrente):
    • Promises
    • async/await
  • Características do modelo de callback do node.js:
    • (err, data) => void
    • O callback é o último parâmetro passado a um método assíncrono.
    • Idioma: if(err) return cb(err)
    • Em caso de sucesso: cb(null, data)
  • Implementação de uma API assíncrona baseada em callback
  • Retornar o tamanho do ficheiro e outra função que calcula o somatório dos ficheiros.

  • Martin Fowler “Enterprise applications are about the display, manipulation, and storage of large amounts of often complex data and the support or automation of business processes with that data” [Fowler, 2003].
  • Simplistic view: 📂 --> Data Layer --> Domain --> UI --> 👤
  • 3 Layers or Tiers
  • Exemplo: BD SQL --> JDBC --> Model + Services --> HTML + CSS + Css --> 🌐
  • vinyl -- Desenho de uma aplicação Web para gestão de listas de bandas favoritas por utilizador.
  • vinyl:
Last.fm API     ---> urllib ---> lastfm \
                                         ---> vinyl ---> UI
users.json File ---> fs     ---> users  /
  • lastfm - Análise da fontes de dados Last.fm API
  • users - Desenho do formato de dados para armazenar utilizadores e suas bandas favoritas

  • vinyl -- obter o top das músicas das bandas favoritas de um utilizador.
  • Implementação dos módulos da aplicação vinyl: 1. lastfm, 2. users e 3. vinyl:
    1. lastfm -- getTopTracks(artist, cb)
    2. users -- function getUser(username, cb)
    3. vinyl -- function getTopTracks(username, limit, cb)
  • Documentação da API com JSDoc

  • JavaScript Testing Frameworks: nodeunit, mocha, jest, etc
  • Using jest:
    1. npm install --save-dev jest
    2. npm install --save-dev @types/jest -- To provide full typing and e.g. intellisense in VS Code
    3. jest --init -- Generate a basic configuration file
    4. npm run test calls jest to run tests
    5. jest --coverage to check code coverage
  • Code Coverage
  • Testing Asynchronous Code
  • Mock - simulated objects that mimic the behavior of real objects.
  • Implementing a mock for urllib
    1. jest.mock('urllib')
    2. urllib.request.mockImplementationOnce(function ....)
  • URIs, Resources and Representation
  • Schemes, e.g. scheme http://-- protocolo http
  • App WEB: HTTP Server; Routing; Representation (e.g. HTML, Json, CSV, other; aka Views)
  • Request Methods: GET, POST, PUT, DELETE.
  • Idempotent property defined by RFC 7231.
  • PUT <versus> POST
  • Designing routes for vinyl web application:
GET    /vinyl/users/<username>          => getUser()
GET    /vinyl/users                     => getUsers()
DELETE /vinyl/users/<username>          => removeUser()
PUT    /vinyl/users/<username>          => addUser()   // unique usernames
POST   /vinyl/users/<username>/artists  => addArtist() // allows repetitions

  • const server = http.createServer((req, res) => ...) - instance of HTTP server.
  • server.listen(8000) - run and listen on port.
  • res.writeHead(statusCode[, statusMessage][, headers])
  • res.write(chunk) - sends a chunk of the response body.
  • res.end([data]) - signals that response headers and body have been sent

Clone this wiki locally