[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Ainda o EP2



Rodrigo,

>Acho que vc naum olhou atentamente o wordtest. O código é horrível,
ineficiente e os comentários em cweb não são nada geniais.

    Ah, sou obrigado a discordar! Vamos lá...

    Tudo o que vai aqui é minha opinião, ok? Não vou ficar falando "a meu
ver" a toda hora, mas fica subentendido! Além do quê, acho que o fato de o
Yoshi não ter se manifestado não é por acaso, estou interpretando como um
jeito de nos deixar mais à vontade para dar opiniões pessoais.

<Ministério da Saúde Adverte>
    Este e-mail é quilométrico...
</Ministério da Saúde Adverte>

>1) o wordtest utiliza uma mesma variável em contextos diferentes,
exercendo funções diferentes.

    O ponto importante deste CWEB é o lance de fazer o programa pedaço a
pedaço, já entrando no que "interessa" de uma vez. Por exemplo, em vez de
você ver um monte de declarações de variáveis, você vê os códigos. Assim, eu
entendo que a variável deixa de ter importância, simplesmente não é o foco
(isto não é igual a VB, porém, onde não há type checking nenhum)!
Aproveitando este e-mail para fazer uma elegia do C++, isto também foi
introduzido quando se deu liberdade para declarar variáveis em qualquer
lugar. Aliás, o próprio C, em sua última revisão (ISO C99) permite declarar
variáveis em qualquer lugar. Seja como for, CWEB, C++ e C99 tiram aquele
monte de declarações do começo dos blocos. Ô, coisa irritante.

>2) será que o knuth sabe o que é modularização ?

    Ué, mais modularizado que o CWEB é difícil! Só não acho que precise usar
CWEB para ter este efeito (de novo, C++ já embute bem a idéia de
encapsulamento, mas até aí, isto é uma técnica, não um recurso de linguagem,
necessariamente). Por que você achou que não está modularizado? Cada idéia,
praticamente, está abstraída em um trecho independente.

>3) vc reparou como ele faz a visita in-order ??? Dá uma olhada:

    Para ser sincero, não: tive tão pouco tempo para fazer o EP, que
simplesmente pulei a implementação da treap. Mas, pelo que percebi, não
houve "escalagem" de ordem de grandeza de eficiência, houve? Quero dizer,
ele não transformou em NlogN o que era logN, ou em N^2 ou que era NlogN. Mas
vou me abster de comentar este e o seu próximo tópico, por W.O....

>5) O código não é legível. Ele quer ser eficiente, usando de forma bruta
ponteiros e blocos de memória.

    Não concordo de novo: pelo contrário, achei até que ele às vezes
"sacrificou" espaço para deixar legível. Quero dizer, algumas coisas ele
poderia ter agregado, deixando menores, mas senti que ele preferiu deixar
mais claro. Aliás, achei o código muito fluido de ler. Além do quê, ao dizer
"legível" acho que você tem de incluir não apenas o código, mas os nomes dos
blocos, o índice, aquele negócio de "isto é usado em tal lugar", etc. O
programa CWEB, para mim, é o conjunto completo, não só o que está em C, lá
dentro. Agora, ainda é C, afinal, tem ponteiro saindo pelo ladrão...

>6) vc também reparou como os nome das variáveis são intuitivos ? p, q, u,
v, c, f, etc...

    Nomes de variáveis devem representar 50% das brigas entre programadores!
Aí não vale, cada um com o seu jeito. Há quem adore a notação hungárica
(lpszNome: long pointer to a string terminated with zero, que se chama
Nome), porque mostra o tipo. Aí o outro diz que tira o foco do que
interessa: "Nome". Outro quer que especifique o escopo (gNome: variável
global). Só minúsculas (nomedocliente). Misturado (NomeDoCliente). E por aí
vai... Ou seja, acho que este ponto não tem "solução". Mas concordo com
você, eu prefiro nomes maiores, mas mais descritivos.

>7) Em que momento do texto em cweb fala sobre a rotação da árvore. Ou
como os blocos de nós e strings relacionam-se com a árvore.

    De novo, vou pular este ponto.

>8) Nem vou comentar a respeito do goto...

    Ôpa! Este é importante! Não acho goto (ou variáveis globais, outro
dogma) um erro per se. Acho errado você fazer uma coisa porque não conseguiu
fazer outra, aí sim. Se você usa goto porque não conseguiu implementar uma
idéia de modularização, provavelmente o resultado não é bom. Mas sair de um
loop interno que está dentro de outro loop interno que está dentro de um
terceiro, dependendo do caso, fica melhor com goto do que com um break e um
monte de ifs. Agora, acho que goto é o tipo da coisa que merece o velho
conselho: só usar após certa idade, ou coisa que o valha.
    Outra coisa: os goto's gerados após o CTANGLE não contam! O programa não
é em C, é em CWEB, o programa em C gerado tem de ser entendido como uma
etapa a mais de compilação, só isso, como se fosse um arquivo objeto.

>9) Como ele gerou números aleatórios? Dando voltas na capacidade de uma
variável. Isto é, ele provocou overflow ciente disto (compatibilidade
não existe , né!?)

    E número aleatório existe, anyway? Toda forma de gerar tem seus
inconvenientes, se esta serve, por que não? No Sedgewick, num dado
exercício, ele sugere trocar a função rand() pela expressão ((111 % h->n) ==
3). Para aquele exemplo, estava ótimo!

>E isto tudo para o programa ser lento. Experimente implementar com uma
árvore balanceada descente para ver qual fica mais rápido.

    O melhor que consegui foi chegar perto, mas não ultrapassar. Não que
tenha ficado longe, não achei significativo. Mas eu resolvi usar randomized
BST e C++, para ver o que dava, e fiz classes propositalmente carregadas
(vários operators overloaded, etc.), mas deixando o programa "bonitinho".
Vou tentar dar uma enxugada neste aspecto para ver o que acontece...

>E mais uma coisinha, responda sinceramente: vc consegue programar
enquanto explica o funcionamento dos vários segmentos do seu programa.

    Não conheço melhor jeito! A esta altura, você deve estar achando que meu
propósito na vida é contrariar você, mas juro que minhas opiniões são
sinceras. Acho que o melhor momento para documentar é na hora em que se
escreve. Pouco depois, você já não tem paciência. Muito depois, você
simplesmente não lembra. Tive, no ano passado, uma experiência mística: mexi
em um programa que eu mesmo fiz há 6 anos, em C++. E fiz uma baita
modificação em 40 minutos! Finalmente, senti a tal "reusabilidade" do C++, e
nem estava muito documentado, mas tinha o essencial.

>Sobrou algum motivo para elogiar o wordtest ?

    Deixei o melhor por último... ;-]

    Eu fiquei contente em descobrir que o Knuth, além de um grande nome da
Ciência da Computação, gosta de programar. Digo isto porque quando entrei no
BCC, ano passado, descobri, com grande surpresa, que "programar" não é o
mesmo que "ciência da computação". Stupid me, mas desde então, tenho
reparado nesta distinção.

    Vou citar uma coisinha besta, de memória, mas que ilustra o que eu quero
dizer: lá pelas tantas, para mexer no vetor ord[], ele faz isso:

byte c;
for (c=255; c; c--) // código aqui

    OK, eu avisei que era um exemplo simples, mas olha só: em primeiro
lugar, não dava para fazer for (c=1; c<256; c++), porque gera um warning
(comparando tipos diferentes, pois byte vai só até 255, 256 é int). Pior,
nem dava para fazer for (c=1; c<=255; c++), porque dá outro warning: a
condição é sempre verdadeira! Afinal, byte é um "unsigned char". Mas tem
também outro motivo: ord[0] deve ser deixado de lado, neste caso. É mais
visível fazer como ele fez, do que começar a comparar em 1, que sempre gera
um pouco de confusão. Ou seja, a meu ver, ele matou dois (ou três) coelhos
com uma só cajadada, deixando um código simpático, legível, e que teve
motivo de ser como é! E isto é só uma linha do código!

    Não estou dizendo que o cara é perfeito - ontem mesmo mandei um e-mail
questionando o lance de deixar de usar free(), que acho no mínimo uma coisa
não recomendável, ainda que não condenável de todo. Mas no geral, fiquei
muito bem impressionado...

    Desculpem pelo tamanho do e-mail (isto é, se é que alguém chegou até
aqui... :-)

Rubens