>> Así, co que se dixo,
só unha especie de simple introdución aos prototipos
eo modelo de obxecto JavaScript.
Non imos cambiar engrenaxes algo para falar
máis Javascript no servidor ea Biblioteca Bookshelf
ea conexión Knex Library.
Así, pode, en realidade, só -
se buscar por Bookshelf.js debe ser moi fácil
de atopar, debe ser a primeira resultado, e Bookshelf
como David mencionar só dá moita estrutura
en torno a obxectos Javascript e traballar con eles relacionalmente
en bases de datos relacionais.
Así, unha serie de características similares que en realidade está fortemente inspirado
por ORM do Laravel como así como o Backbone.js,
que é un front-end MVC biblioteca que permite que
estruturar o seu código, semellante ao que eu estaba mostrando
cos exemplos da prototipos, onde se pode -
no canto de só arbitrariamente xogando clases
nos seus puntos de vista aquí e alí.
Dálle modelos e coleccións destes modelos
que se quere funcionar como especie de un punto único de verdade
sobre os datos súa aplicación.
E entón se escoita, como os modelos cambios, di, OK,
re-facer este modelo aquí e este aquí
e non só engadir clase aquí, engadir clase alí e tipo de elixir
en selectores e facer a telaraña de código jQuery.
Dá máis dunha base de clase estrutura en anacos individuais,
pero un compoñente importante de biblioteca é que os modelos
que ten unha estrutura semellante para que os modelos de andel facer.
Entón, se está familiarizado co Estante é fermosa tamén
bastante familiarizados co Backbone.js modelos,
e eu recomendado dar un ollo niso.
Así, algunhas das características principais
que lle dá son só o capacidade de establecer os datos nun obxecto
para chamar buscar, que volve un rexistro individual
a partir da base de datos, crear relacións como semellantes
ao que lidou dentro en Laravel
onde pode dicir un paciente establecer un método de rexistro
e dicir que iso gañou rexistro
onde o obxecto de rexistro é rexistros de saúde nome da táboa.
Imos ver.
Ten moitos - que pertence -
só cousas que é moi semellante -
bastante familiarizados co xa, pero en JavaScript.
E baixo o capó, para Bookshelf,
usa un constructor de consulta chamado Knex.js.
Entón, iso é Knex, knexjs.org.
É unha referencia para o xoguete se alguén xa xogou con iso.
Pero el permite que - nun forma semellante, o jQuery,
que acaba de crear un tipo de cadea de métodos diferentes
que está chamando no seu liña de base de datos para que poida -
comezou por dicir Knex eo nome da táboa.
Así, por exemplo, usuarios, Knex seleccionar que columnas quere,
onde, e teñen distintos onde condicionais e pode que
E onde, ou cando, onde entre, onde non,
agora, para abaixo da liña.
Pode especificar diferentes xunta entre as súas táboas de base de datos
Bookshelf que usa internamente a creación dunha especie de maxia
en torno ao hasOne, hasMany, belongsTo, belongsToMany.
E así, a combinación
dos dous permiten que fai moi ben o que sería ser usado
no cadro como Laravel en termos
de funcionalidade traballar con bases de datos.
Entón, imos adiante e tomar un ollo a un exemplo simples
para unha aplicación Express, que fai uso destes modelos
e coleccións de Bookshelf jazz [fonética].
Entón, eu configurar-se só un aplicación sinxela aquí.
Tirei algunhas das cousas que se inicializar expresa
e mover-se de que nunha arranque directorio que eu creei.
Unha das cousas agradables sobre traballar con Express como suposto
para Laravel é que hai realmente moi forzado
en ti convencionalizada.
Así, pode crear directorios -
realmente non lle dar un lote enteiro para traballar fóra.
Ten só unha especie de algúns definicións básicas e despois -
pero non lle importa onde poñelos.
Non ten que ter directorio do controlador.
Non é preciso ter un modelos directorio, un directorio de configuración.
Pode crear unha especie de aqueles que as súas necesidades de proxecto
e establecer as cousas do xeito que máis ten sentido para ti.
Entón, en vez de ter todo este cliché expresa
nos principais app.js eu dixen iguais de aplicacións requiren o init / Express.
E así, o init,
o cartafol arrincar Acaba de ter expresado aquí,
e iso require Express, chamadas a función de configuración, chama o -
establece o mecanismo de exhibición, Parser JSON, todo isto.
Entón, agora, imos continuar a descender.
Entón eu estou esixindo que o reunión instrutor do curso
e os requisitos de modelos.
Entón, estas son nunha carpeta que Eu só decidimos modelos nome.
Non ten que ser forma con todo, ten sentido,
pero os modelos é só fermosa común, entón eu recomendo.
Pero - Entón imos para o curso.
Coido que está a usar - Si, e os exemplos
aquí son todos baseados en torno ao modelo de curso.
Entón imos tomar un ollar para iso.
Entón, agora, só da primeira liña deste modelo,
Eu xa estou requirindo outra cousa.
Entón, se vai notar no nodo ten que estar esixindo
ou vai acabar esixindo un grupo enteiro
de ficheiros diferentes que están situados
en diferentes lugares na súa aplicación.
E os camiños relativos a onde queira que estea
na súa aplicación actual,
a menos que sexa un nivel superior xa definido como en instala-lo
con MPM como Bookshelf ou Knex ou Express ou algo así,
aqueles que non son relativos.
Si? Zoom máis?
Aceptar. Aceptar. Entón, está indo a acaban esixindo un grupo enteiro
de só distintos arquivos no seu código, o que é bo e malo.
Dun xeito bo sabe onde as cousas son e non é sorte
de maxia, como o que se pasando baixo o capó,
o que realmente pode ser confuso
cando ten unha moi Java pesado -
ou cadro moi pesado como Laravel, que tipo de di:
imos coidar deste xeito non ten
esixir todo pero tes
para saber como todo traballa, a fin de usalo.
Cando, como neste caso, é moi sinxelo en canto aos
onde todo é, son só extremos
sendo ata algo máis de dixitación.
Así como no lado Gústame de usar, hai un plugin
se usa un texto cego
onde podes instalar nodo módulos auxiliares e pode comezar
para escribir como Instrutor e crea o camiño relativo
de onde está para que arquivo de código, tipo de útil.
Así, o modelo de curso está esixindo base aquí
e logo, estagiário de base require o init / estante
e, a continuación, o Bookshelf, el require o nivel superior Bookshelf
e logo, arrinque con a instancia Knex inicializar,
que define o nome do cliente
e a conexión opcións para a base de datos.
Entón, eu só estou usando un simple instancia do Sequel Prol que -
mySQL, estou accedendo con Sequel Pro e ten só unha especie
de unha base de datos semellante configuración como tivemos
no primeiro aplicativo de exemplo co catálogo de cursos.
Entón, eu definir a miña conexión opcións aquí,
e estes son todos documentados na páxina do proxecto Knex.js
en canto ao modo de configuración estas conexións.
Entón, agora teño o meu modelo de base.
E como eu mencionen con o cambio de prototipo,
de xeito que realmente pode ser unha especie de moi para -
engade unha chea de cliché ao seu código para convención
que foi adaptado por Backbone.js
e agora é Bookshelf.js engadir a rede de ampliar
como unha propiedade estática en seus obxectos JavaScript,
o que lle confire unha especie de case baseada en clases herdanza natureza
onde se chamar estender pode configurar calquera
dos métodos prototipo que quere aquí
e logo, pode - calquera métodos estáticos extras
que pode querer, que pode simplemente poñer-los a si mesmos
aquí para que eu poida estendelo lo con - por iso, se por exemplo,
modelos necesarios amosar o nome e este obter o nome.
Entón, aquí, eu estou dicindo que o nome de visualización para o modelo
por defecto, é o que quere que o seu nome propiedade é outra forma de retorno
ningún nome.
E agora en cada modelo que é a -
que se estende este modelo base, eu Agora temos un método nome de visualización
no prototipo cadea en algún lugar.
E se eu queira reemprazalo Só podo define-lo - definir o que -
getname estaría aquí.
E permite que imitar herdanza clásica
no Javascript, que pode ser legal específica para que as cousas
que son prestan-se a ser clase base como modelos de obxectos.
Entón, imos saltar de volta a o código da aplicación.
Entón eu teño unha ruta para só slash, só para o meu índice
e logo, cortar cursos.
E ambos están chamando o método renderCourses.
Entón, de novo, as funcións son primeira clase e pode ser transmitido
como argumentos para métodos.
Así, neste app.get, Estou chamando -
Estou pasando renderCourses como argumento.
E renderse - ou funcións se pode configurar como var -
como eu estaba facendo antes var renderCourses igual función
ou poden ser simplemente renderCourses función.
Non fai moito moita diferenza.
Pode realmente ter o que son chamados de función nome
expresións, que son renderCourses var iguais
renderCourses función.
E, a razón para querer ter funcións citar especialmente
no nodo é que dálle un produto de limpeza -
seguimento de pila máis lexible.
Entón se ten un grupo enteiro
de funcións anónimas vai dicir -
cando ten un erro no seu código xa ti -
non vai saber cal a función está chamado vostede tería que mirar
co número de código eo número da liña
e ás veces é máis fácil só para analizar visualmente
cando realmente ten nomes
para as funcións si no lado do servidor.
Polo tanto, este renderCourses, imos chamar aplicacións nó -
entón eu estou escoitando Núcleo 3000 [fonética].
E así, todo isto está a facer para a dereita aquí está só comezando todo o
cursos a partir de base de datos.
Non estou nin limitándose por iso está facendo un número enorme
de liñas está retornando.
E para facelo,
no modelo claro que hai é unha propiedade estática
chamado colección.
E entón eu só chamalo - I dixo crear unha nova colección
a este curso, e despois busca-la,
e, a continuación, regresar os cursos colección aquí na promesa.
Así, internamente, David in - o última metade ensinou algo
sobre promesas e promesas son usado moi fortemente, tanto Knex
e porque Bookshelf presta o -
dálle a capacidade de ter unha chea
de distintas chamadas assíncronas e tipo de xuntar, a continuación, en conxunto
ou buscar algo, e, a continuación,
con esa chamada outro chamada de base de datos asíncrono
e voltar ese valor e logo ir á seguinte entón
e á beira, a continuación, e despois ter unha incorporarse ao final para clasificar
intento de imitar captura asíncrono comportamento con código asíncrono,
porque está a ver agora
pero é aínda máis difícil, xa comeza a tratar con isto.
Código asíncrono é só en todas as partes
do lado do servidor e JavaScript realmente a un grao moito maior
do que está acostumado a se fixeches JavaScript
do lado do cliente.
Entón iso realmente axudou alí fora.
Pero só para amosar-lle a declaración depurador
que eu estaba falando en as ferramentas inspector no,
Eu estou indo a ir adiante e lanzar unha liña depurador aquí
na función renderCourses e ver onde iso me leva
cando - entón nodo inspector se pode instalar
facendo NPM Instalar cunha bandeira G,
o que significa global Inspector Node.
E vai busca-la para o NMP e instala-lo globalmente
para as súas aplicacións así que pode simplemente chamalo
a partir da liña de comandos.
Eu xa instalado , Entón eu vou adiante e -
de feito, pode ter esperar el só vai ter,
tomar dous segundos.
E o inspector nodo novo permite que
facer é ter este sen cabeza versión da consola do depurador
que está afeito cando se traballa do lado do cliente e ser capaz
para deixar, simplemente engadir especificada apunta no seu código.
Pare a execución e dar un ollar para o que está a suceder,
o que realmente vir a cadra se o recurso
como que estaban dispoñibles
Cando se depura o seu Código PHP, estou seguro.
Entón imos tomar un ollar para iso.
Así que só podo chamar Inspector nodo
e el vai dicir visitar esta URL porto 5858 para comezar a depuración,
iso é só o estándar de como é iniciado.
Entón, eu agora teño - non hai nada a suceder aquí
porque eu teño para comezar.
Entón no punto morto [fonética] o sinalizador de depuración e, a continuación, app.js.
Por iso, di depurador escoitando no porto 5858,
Escoita Server Express en 3000.
Por iso, é bo para ir.
Déixeme só actualizar isto.
E agora eu podo ver as app.js código que eu estaba só mirando para
pero aquí na consola.
Entón, agora, se eu tentar executar este, Podes velo, el deixa.
Está só esperando, porque a súa Toda a execución de código é agora
parado nesta depurador liña que eu coloque alí.
E podo agora servidor -
[Inaudível Observación]
Oh, si. Cal é o seu contrasinal acceso directo para aumentar a pantalla?
Oh que existe.
Entendín. Aceptar.
[Pausa]
Oh, non está mirando [Fonética] iso.
Así, os cursos é moi grande
porque eu non estou facendo un cláusula ou nada limitar,
é só ir buscar o base de datos completa de cursos
que son unha morea deles.
E así - o que é obxecto
que realmente pode fallar a instancia inspector nota.
É - Aceptar.
Deixe-me facer un límite e entón podemos dar un ollo
cando non está buscando centos de cursos.
Entón, matar o servidor e inspector
e eu vou facer curso límite consulta de recollida 20.
Así, en Bookshelf, ao contrario Laravel
onde pode só chamar limitar, directa ou chamar a calquera
destes métodos SQL que use
directamente na instancia ORM.
Cada vez que está a usar só Método SQL que se inclúe
en Knex, ten que chamar a consulta para clasificar
explorar a cadea de consulta.
E iso pode ser invocado ou cunha función,
para que poida dicir, a función este límite de 10 ou chamalo
especificando cales método que desexa chamar
na instancia Knex e logo, que valor.
Entón, nós imos facer límite de 20 e, a continuación, definir.
Nós realmente non facer Debe depurador aquí
porque podemos só establecer puntos de interrupción
e que fai que sexa máis fácil.
Todo ben.
Entón, imos definir un punto de interrupción aquí e tentar cargalo.
Liña incorrecta.
Ben aquí.
[Pausa]
Aceptar. El deixou de novo.
Entón, agora, os cursos é un obxecto con lonxitude de 20
e vemos as diferentes modelos que é buscada
da base de datos aquí entón eu teño un obxecto de modelo
que ten, no interior da atributos da propiedade
sobre o obxecto son todas as cousas que se atopa na base de datos.
Calquera eventos que teñen foi rexistrado
para que poida rexistrar distintos eventos,
por exemplo, cando o modelo está a ser eliminado
ou cando está a ser buscado,
Podes establecer diferentes propiedades ou modificar as cousas.
Hai unha morea de diferentes garras e estes son todos documentados
nas Bookshelf.js documentación que permiten que
para facer unha especie de nada que realmente quere facer
cos seus modelos e coleccións.
Pode - eles foron feitos ser moi personalizable
e moi doado para ti adaptalo los
para as necesidades da súa aplicación.
Pero mirando só por aquí,
Podo ver o que o diferente cursos están dispoñibles.
E neste caso, I realmente non buscar
con outros ademais dos datos só os propios cursos.
Pero dun xeito semellante ao o elocuente ORM pode definir
as relacións, de xeito que o curso pertence a moitos instrutor.
Entón, se eu ir adiante e suspender a execución,
ir a este buscar chamada, Pode especificar diferentes opcións
que quere pasar a el.
E un deles é o capacidade de cargar código relacionado
especificando withRelated instrutores entón cursos.
Entón, imos voltar e fresco iso aquí e deixar de novo.
Entón, agora, obxecto dos cursos, mesmo número de modelos,
pero agora cada modelo ten un hash de inicio de relacións
que ten os instrutores que é relacionado.
Así, este curso, por exemplo,
Claro que é 082 ten dous modelos instrutor relacionados.
E xa pode ver como moito máis fácil que é clasificar
de traballar visual que cando está lidando con cousas
que tipo de cambiar o código e, a continuación, tentar de novo en PHP.
O feito de que pode só deter a execución totalmente
e avaliar o que está aquí e a - na consola, o -
diminuír o zoom, cursos é, vostede sabe,
o que que o ámbito local variables están dispoñibles
e este é actualmente o mundial obxecto porque, como viu,
a non ser que chama cun contexto específico, que non vai
ter algo relevante aquí.
E entón, o - déixeme amosar máis algúns exemplos
implementación de promesas.
Entón, en vez de facelo instrutores withRelated aquí eu son
indo a ir adiante e pasar esta para buscar e, a continuación, os cursos,
Vou volver instrutores courses.load.
E entón - entón chámase entón.
[Pausa]
Entón, a continuación, neste punto, o cursos deben ser cargados
cos profesores, que é unha acción asíncrono.
Senón porque estamos devolvendo- desde unha promesa, o seguinte valor
para, a continuación, é todo o que esta chamada retorna assíncronos
que neste caso a carga é un método en Estante
que realmente retorna a colección en si.
Entón ten que cargar o instrutores de alí
e logo, pode especificar - se é só unha propiedade,
pode especificar esta como corda, se non,
podes facer instrutores e requisitos
como un método - desculpe, como unha matriz.
E entón se quere ter moi chique e restrinxir calquera
destes dado procuras, vostede pode especificalo como un hash
con profesores e, a continuación, o que Desexa limitar a consulta on.
Entón, me gustaría levar todo instrutores en cursos onde -
así QB para constructor de consulta onde o estado é activo.
E pode ser moi fantasía con calquera
das consultas relacionadas que quere construír.
Pero só por agora, imos se ater a só instrutores
e nós estamos devolvendo ese valor
por iso, entón a próxima, a continuación, debe ter todos os cursos cargado
correctamente.
E se houbo un erro en calquera paso que a corrente,
sería saltar á captura.
Entón, imos adiante e realizar iso.
Así, cada vez - a diferenza de PHP, unha desvantaxe é o
"Porque nodo" é unha longa carreira proceso, realmente precisa
para deter o proceso no como actualizar o seu código,
porque a versión que se execución no tempo de execución é,
a versión do o código que procede
cando comezou a non o que ten sorte
actualizados do seu código con desde entón.
Aceptar. Imos establecer un punto de interrupción aquí, aquí e actualización.
[Pausa]
Ah, eu realmente non fixen actualiza esta páxina ou
polo que foi sobre o proceso de idade.
Entón actualizar tanto este eo inspector nodo.
Entón, agora, vemos cursos.
Se nós só tomar mostra dun destes modelos,
vemos que as relacións obxecto está baleiro, pero agora -
ea razón que precisa establecer puntos de interrupción é, ben,
Eu mencionar que podes ir para o seguimento de pila
e ver o que vostede sabe, onde vai no app.
Entón agora podo ver o que está a pasando no método de carga,
que define nas coleccións.
É unha especie de "carga Ansioso relacións a un xa ".
E pode percorrer e ver liña por liña
onde este material é vai que é óptimo.
Se tes algo que está roto no seu código,
está xogando un pouco de erro e vostede é como, realmente quero
para ver onde isto vai dar.
Pero así que ten algo asíncrono, o -
que vai á seguinte carrapato do ciclo de eventos
e vai perder a súa - que perde o seu lugar
no Inspector de nodo.
Entón, ten que dicir: "OK, xa que eu perder iso,
el que deixar agora nesta liña de novo. "
Porque se eu continuaba batendo abaixo, abaixo do conxunto,
tería, eventualmente, só ido aínda se eu non definir este
liña 22 liña azul pausa.
Entón, agora, se eu ollar en cursos aquí,
debería respecto instrutores
e, entón, a instrutores anexo-los.
Así, pode ver que eu volvín unha promesa da primeira promesa
E entón pode continuamente facelo para abaixo da liña.
Así, a promesa diferente, prometer bibliotecas,
Eu usei un chamado Bluebird que é realmente útil.
El engade unha chea de bo deste para cambiar asíncrono -
cambiando chamada de volta código de base en material
que funciona ben con promesas.
Pero - desculpe [inaudível] que Eu ía dicir iso aí.
Imos dar un ollo aínda que no -
entón imos dicir que houbo unha problema ao buscar algo.
Entón, eu teño esa outra ruta para atopar chamado ID curso.
Entón imos facer curso de 2.
Podo obter - Curso de JSON.
E iso fai [inaudível].
[Pausa]
Sinto cheiro de algo mal aquí.
Non en 3000, eu estaba en guía inspector Chrome.
Aceptar. Entón imos para claro - JSON curso 1.
E iso retorna só en JSON formato, o curso cargado
con algúns instrutores.
Pero o exemplo que eu quería para dar aquí é que,
Estou facendo curso JSON ID.
E nos parámetros de busca, Estou especificando esixen certas,
que é unha opción que se documentada en Bookshelf
onde está dicindo que: "Si, Intento atopar este curso
e el non está alí, logo lanzar un erro. "
E iso debe ser capturado por captúraa bloquear aquí.
Entón, imos adiante e atrás ao inspector nó e tentar
e romper iso e ver o que temos.
Entón, imos establecer un salto de aquí no curso de JSON.
Todo ben.
Eu vou para o curso e JSON Quere só de poñer en algún -
[Pausa]
Pode ser un pouco complicado ás veces, cando estás
para xestionar cal Actualizouse
e que non ten - imos ver.
Por iso, está chamado de erro resposta baleira.
[Pausa]
Imos xogar un depurador aquí.
Debido á forma en que nodo realmente optimiza
ao tempo de execución JavaScript para ser tan rápida no servidor,
ás veces o depurador nodo ten algúns erros cando se trata de
e establecer puntos de interrupción dinámicamente e realmente precisa
usar un depurador e non a liña a liña.
Entón, imos ver se este queda-nos o que queremos.
Así que definir, app.get id curso JSON,
e eu teño o meu depurador alí
na instrución catch na parte inferior.
Fetch requiren certo, debería - todo ben, alí imos nós, rompe.
Entón, agora podo ver que deixou
neste último bloque catch porque o withRelated -
ou porque a esixir verdade especificado e non existe naturalmente
coa identificación deste gran número mediante unha excepción
que agora é Emessage.
E cada erro JavaScript ten unha propiedade de pila
que ven xunto con el.
Por iso, é moitas veces útil Para por exemplo,
consolar saír e.stack.
E podo realmente ver cando bati un erro.
Entón eu recibín erro baleiro de resposta, que é a mensaxe
que foi enviado a través de Bookshelf.
Pero agora, podo dar un ollo no, a chamada pila para ver
que en Bookshelf dialectos SQL modelo 83,
esta resposta baleira erro foi accionada.
E é aí onde eu mencionado, é punto anónimo
porque é un anónimo función.
Se isto fose unha función de nome que tería mellores ideas
para que funcione realmente mediante sen ter que ir
no código model.js.
Aínda que é destinado a ser moi, moi lexible,
para que eu poida ver que en liña.
O que din me era a liña 83.
Entón, se options.require e non existía a resposta,
el agora lanza un novo erro de resposta baleira.
Así pode ver moi simple como iso funciona.
E internamente en Bookshelf,
non é só un todo banda de uso promesas.
Así, pode especificar Promise.method
coa biblioteca Bluebird que mantén o contexto correcto
deste, cando regresaba unha promesa.
E así eu - eu estou conexión o valor desta semellante
ao que eu tiña mencionado anterior, pero utilizando promesas
e entón eu podo - é novo.
Pode ser asíncrono ou non, se eu queira.
E entón eu facer algunha outras cousas que poden
ou poden non ser asíncrono e a continuación, os tipos de saltos para abaixo iso.
Entón Promise.all é un auxiliar que unha morea de bibliotecas populares teñen
onde pode ter un variedade de potencialmente pode
ou poden non ser promesas.
E xa que as que son rematada, volverá que
e logo, ela salta á seguinte liña
e verás como realmente achata a pirámide
que comeza, o inferno callback como o seu coñecido
se está facendo todo con retorno de chamada liña por liña.
Hai formas de evitar iso, pero as promesas son un
das mellores formas na miña opinión
para realmente manter o seu código limpo e de fácil lectura.
Entón, iso é só unha pequena introdución ao JavaScript
e Bookshelf e Knex en xeral.
E, se hai algunha dúbida, Sei que é unha tonelada de material
a sorte de probar e tapa sobre todo porque as linguas,
ao contrario da maioría de que é familiarizado con, entón eu só quería
para facer que polo menos se está a ter problemas
co seu código, Pode clasificar de saltar -
iso é o que máis me gusta de facer, é tipo de ir para as bibliotecas
que está a usar e mira como as cousas son estruturados.
Hai un que eu tiña mencionado anteriormente chamado Backbone.js
e de feito, é [Inaudível] no lado do cliente
para axudar a dar vista do modelo estrutura controlador
ao seu código.
Pero realmente ten fonte da documentación anotada
que permite clasificar de ver.
É realmente ben documentada, o que está a suceder,
como vai en aumento a función Ajax
ou a función de eventos ou Os modelos e coleccións tipo
de explicar o que é pasando no proceso.
E se entender os conceptos básicos de JavaScript
como a herdanza prototípica e só como funcións son usadas
que ambos os obxectos e valores e clases e todo máis.
Isto fai moito máis doado para entender o que está a suceder
potenciais no bibliotecas que está a usar
e código depurador e poder a non ser bater a cabeza
contra a parede porque non entender como o
diferentes pezas están a traballar, entón.