Open laurybueno opened 7 years ago
Minha sugestão para isso: Criar um campo "imagem padrão" no eixo e mandar a URL dessa imagem de todo jeito.
Outra sugestão, que não sei se vale a pena fazer: colocar o campo "imagem padrão" no eixo e colocar toda a lógica no backend de cards para, se não tiver imagens, mandar uma "imagem" que é a imagem padrão do eixo.
@tiagofassoni Se a serialização do eixo em /cards/api/cards
retornar um campo de imagem, acho que ficará bom para mim e para você.
@leopiccionia esse método é ruim, pq retorna um monte de informações repetidas (cada card tem um eixo e cada eixo vai dar sua imagem padrão e isso vai se repetir pra todos os cards na lista). Se for pra fazer assim, melhor deixar o endpoint de cards como está e o front ler o endpoint de eixos, pegar as imagens de lá e ficar responsável por colocar a padrão qdo for o caso.
Mas a gente já bateu o martelo em deixar a complexidade da questão pro backend (mesmo pq o front do timtec vai ser refeito em algum momento). Valeus
Nós já repetimos o ID e o nome do eixo para cada card da lista. Não entendi a diferença.
a diferença é piorar uma coisa ruim
por outro lado, trabalhando em cima da sua fala, @leopiccionia, uma alternativa é inverter de vez essa lógica: a listagem de cards só dar o id de eixo/público dela e caber ao front pegar infos detalhadas do back e mapeá-las para os cards adequados.
Não acho legal justamente por termos que refazer isso qdo mudarmos o front pro último angular, mas é uma opção sólida
Não necessariamente é uma piora: é o clássico trade-off CPU-memória. No nosso caso em específico, ou aumentamos a memória ou aumentamos o tempo de processamento.
Agora pensando, dá para fazer o programa economizar tanto espaço quanto tempo, utilizando programação dinâmica. Vai aumentar a inicialização do programa em alguns nanossegundos (ou seja, desprezível), e é um excelente compromisso.
Não sei se esta discussão está mesmo em cima do trade-off CPU/memória.
No meu entendimento, a questão maior é pensar quem vai gastar CPU e memória: cliente ou servidor.
Na minha proposta inicial, quem gasta mais é servidor. Na minha proposta alternativa, quem gasta é o cliente. Na sua, existe uma divisão dos trabalhos entre os dois, se eu entendi bem.
(explica o que vc pensou com programação dinâmica pra gente)
Estou discutindo apenas em termos do cliente.
(Sejam n o número de cards e E o número de eixos.)
Temos que pensar que a operação de achar a imagem correspondente eixo do card é executada dentro de um loop de tamanho proporcional ao tamanho da lista de cards (portanto, O(n)). Dessa forma, se a busca pela imagem tomar tempo constante, o loop será O(n); se a busca for linear, ele será O(n × E). Eu não tenho conhecimento aprofundado do funcionamento do Angular, mas meu temor é esse loop rodar muitas vezes por segundo.
Buscar por um campo dentro de um objeto leva tempo constante (O(1)), mas o consumo de memória aumenta. Buscar o eixo corresponde numa array de eixos para, daí, buscar o campo dentro do objeto encontrado toma tempo O(E), mas há economia de memória.
A solução por programação dinâmica é construir um índice (pode ser um objeto ou array) em que a chave seja o ID do eixo e o valor seja o objeto que representa o eixo, retornado pela API /cards/api/axis
-- você deve se lembrar de algo parecido das aulas de Desafios de Programação. Esse índice terá tamanho proporcional ao número de eixos (assumidamente menor que o número de cards) -- ou proporcional ao maior ID, no caso da array --, e o acesso a um eixo voltará a tomar O(1), portanto, será eficiente tanto em memória quando em processamento.
Obviamente, não precisamos nos preocupar com nada disso se a API /cards/api/cards
retornar a imagem do card para o front-end.
Essa imagem será subida para a plataforma via Django Admin.
A API deve, no caso de um card não ter imagem alguma, retornar no JSON o endereço da imagem padrão do eixo correspondente.