EP12: observações

EP12: observações

por José Coelho de Pina -
Número de respostas: 0

Olhando rapidamente os EP12 entregues podemos ver vários problemas. Aqui vai uma lista de desses problemas e perguntas. Muitos deles comentamos durante as aulas desta semana.

hitoshi e coelho

No que está a seguir frequentemente usamos os apelidos

HASHTAG    = "#"
ASPA       = '"'
APOSTROFO  = "'"
DOCSTRING1 = "'''"
DOCSTRING2 = '"""'
NEWLINE    = '\n'

Problema -> solução -> implementação

O processo de solução passa por, mais ou menos:

  • definição do problema
  • projeto de uma solução
  • implementação da solução projetada

No que diz respeito a definição e implementação, notamos que várias implementações não resolvem o problema a que se propunham resolver. Veja um exemplo típico.

Problema: Remover comentários. Em Python:

Comments in Python start with the hash character, HASHTAG , and extend to the end of the physical line. A comment may appear at the start of a line or following whitespace or code, but not within a string literal. A hash character within a string literal is just a hash character. https://docs.python.org/3/tutorial/introduction.html

Vários projetos de soluções e implementações removiam todos os caracteres encontrados a partir de um HASHTAG até o final da linha. Se o programa implementado fosse usado como teste (Hmm. A cobra mordeu o rabo...) vários há erros nessa ideia

   if ch == '#' or ...
      [...]

resultaria em

   if ch == '
      [...]

Sugestão da 2ª oficinas: remover comentários, docstrings e strings:

Estado

a cada momento o programa de vocês está em um, e apenas um, dos seguintes "estados":

  • dentro de um comentário
  • dentro de um docstring
  • dentro de um string
  • fora de um comentário, docstring ou string

Cada um dos estados deve ser considerado pela solução e implementação. Algumas pessoas usam uma variável para indica o estado em que a execução do programa se encontra. Outra pessoas não tem essa variável, mas a execução do programa e conduzida para o trecho de codigo "modo comentário", "modo docstring", ...

Leitura dos arquivos

Um mesmo arquivo tem sido lido várias vezes. Considere a leitora de todos os arquivos de uma só vez, já que

  • isso pode simplificar o código: quando estamos fazendo nossa primeira solução, isso pode ajudar muito;
  • se você não usar with open() as arq, não deixe de escrever arq.close(): hmm, isso é um pouco técnico...
  • a leitura de arquivos é cara em termos de consumo e tempo: hmm, isso é muito técnico...

Comparação desnecessárias

Ao invés de varrer a matriz toda, varrer apenas a matriz triangular. Em vez do trecho de código com cara de MAC0110:

for lin in range(0, n):
    for col range(0, n):
       if lin > col
          [...]

prefira o trecho de código com mais cara de MAC0122:

for lin in range(0, n):
    for col range(lin+1, n):
        [...]

Legibilidade

Escreva bons comentários. Veja as notas do Prof. Paulo sobre documentação de programas Veja as notas do Guido van Rossum sobre comentários em Python Veja o blog Erik Dietrich sobre Code Comments.

Escreva um programa que tenha uma boa estrutura: funções ou métodos devem. idealmente, serem pequenos e de mais compreensão

Criação de matrizes

Vejam a mensagem o tópico Matriz maluca.

Bibliotecas

Se for usar alguma biblioteca, veja se ela é realmente nescessária. Procure focar no problema, procurar a solução e trabalhar na implementação da solução. Frequentemente o uso prematuro de ferramentas sofisticadas (mágicas?) sem necessidade e sem entendermos o que ela faz, traz mais problemas do que ajuda...

Percorrer um string

Para percorrer um string e examinar um caractere ou uma janela de caracteres, considere utilizar algo como

   [...]
   ch     = texto[i]
   janela = texto[i:i+3] # não tem problema de índice inválido

   if ch == NEWLINE:
      [...]
   if janela == DOCSTRING1:
      [...]

Problema de lógica

O trecho de código a seguir está errado

   if janela == DOCSTRING1 or janela == DOCSTRING2:
      # entrei em um docstring
      [...]
      if janela == DOCSTRING1 or janela == DOCSTRING2:
         # sai do docstring
         [...]

Vejam Hipóteses inválidas a seguir.

Hipóteses inválidas

Supõe que:

  • o arquivo com um programa sintaticamente correto: strings e docstrings podem não fechar Vejam a mensagem o tópico eps_testes : erros.
  • não há DOCSTRING1 após HASHTAG
  • não há DOCSTRING2 dentro de um docstring que tem DOCSTRING1 como delimitador
  • não há DOCSTRING1 dentro de um docstring que tem DOCSTRING2 como delimitador
  • não há HASHTAG dentro de um string
  • não há ASPA dentro de um string que tem APOSTROFO como delimitador: print("'%s'"%palavra)
  • não há APOSTROFO dentro de um string que tem ASPA como delimitador