Skip to content

Latest commit

 

History

History
227 lines (161 loc) · 4.81 KB

S03E08.md

File metadata and controls

227 lines (161 loc) · 4.81 KB

HelloJS 3.0.0 chapter 8 (big things have small beginnings)

  • respondam a chamada
  • criem o repositório hellojs-s03e08 na conta github de vocês
  • papo bem metafísico hoje

Agenda

  • boas práticas e padrões de projeto em javascript - 25m
  • projeto showcase de trabalho - 65m

Boas práticas

  • papo meio esteticista

Os nomes das variáveis e funções

// OK
const valoratual = x
const novovalor = x * 2
// OK
const valorAtual = x
const novoValor = x * 2
// OK
const valor_atual = x
const novo_valor = x * 2
// DON'T
const valor_atual = x
const novoValor = x * 2
  • mantenha a coesão de estilo
  • decida no começo do projeto
  • e mantenha o que já estiver

Os nomes das classes

  • ClasseNomeieComCamelCase

Os nomes dos arquivos

  • os-arquivos-nomeie-assim.js (GOOD)
  • f0003-listagem-de-pedidos.vue (BETTER)

As pastas

  • agrupe as funcionalidades (features)
  • agrupe os componentes reutilizáveis (components)

Documentação básica

  • README.md com
    • contato do(s) autor(es)
    • requisitos de sistema
    • compatibilidade entre plataformas
    • instruções básicas de execução

Mais de um projeto no sistema

  • coloque-os no mesmo repositório
    • coesão entre as versões
    • vende a ideia correta de conjunto

Os exports são no fim do arquivo!

  • em seus módulos (arquivos), os exports devem ser no fim do arquivo
  • evitar referências cíclicas imediatas
// src/components/module-a.js

const foo = _ => "foo"

const bar = require("./module-b").bar

const vish = _ => bar()

exports.foo = foo
exports.vish = vish

// src/components/module-b.js

const foo = require("./module-a").foo() // VERY BAD

const bar = _ => console.log("bar: %s", foo)

exports.bar = bar

// src/main.js

const m1 = require("./components/module-a")

m1.vish() // erro
  • saída:
[sombriks@ramza s03e08]$ node main.js
/home/sombriks/Documentos/s03e08/components/module-b.js:3
const foo = require("./module-a").foo() // BAD
                                  ^

TypeError: require(...).foo is not a function
    at Object.<anonymous> (/home/sombriks/Documentos/s03e08/components/module-b.js:3:35)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/home/sombriks/Documentos/s03e08/components/module-a.js:3:34)
    at Module._compile (module.js:570:32)
  • não é que foo não seja uma função, mas na hora que o modulo-b faz a busca por foo, ele ainda não foi exportado.
  • para evitar problemas assim:
// src/components/module-b.js

const bar = _ => console.log("bar: %s", require("./module-a").foo()) // WORKS

exports.bar = bar

Abstract DAO (yaaay!!!)

// src/components/base-dao.js

const knex = require("./config").knex

class AbstractDao {

  constructor(table, idcolumn) {
    this.idcolumn = idcolumn
    this.table = table
  }

  list(q, p=1, s=10) {
    return knex(this.table).select().where(q).limit(p).offset((p-1)*s)
  }

  find(id) {
    return knex(this.table).select().where(this.idcolumn,id)
  }

  insert(data) {
    return knex(this.table).insert(data,this.idcolumn)
  }

  update(data) {
    return knex(this.table).update(data).where(this.idcolumn, data[this.idcolumn])
  }

  del(id) {
    return knex(this.table).del().where(this.idcolumn, data[this.idcolumn])
  }

}

exports.AbstractDao = AbstractDao
  • tem quem goste muito
  • fácil de acoplar num express.Router()
  • através da herança é possível definir outras chamadas especiais de busca

Testes

npm install mocha chai --save-dev
mkdir tests
touch tests/f0002-pedidos.js
// tests/f0002-pedidos.js
const chai = require('chai');
const pedidos = require("../src/features/pedidos")

chai.should() // http://chaijs.com/guide/styles/#should

describe("Teste de pedidos", _ => {

  let idpedido

  it("Deveria criar um novo pedido", done => {
    pedidos.insert({
      dscpedido:"10 biscoitos bono"
    }).then(ret => {
      ret.should.have.property("idpedido")
      idpedido = ret[0]
      done()
    }).catch(err => {
      done(err)
    })
  })

  // ... 

})

O Desafio Final

  • monte um projeto para ser o seu showcase de habilidades fullstack com nodejs
  • sabe o projeto documentado no episódio 7? é hora de implementar ele!
  • use sua própria documentação de referência para criar o sistema
  • garanta a rastreabilidade
    • uma feature documentada corresponde a uma feature implementada
    • o código inventado deve fazer a ligação
  • comecem aqui, continuem na vida