shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Shell clean code 2 > uso de padrões


From: Reinaldo de Carvalho
Subject: Shell clean code 2 > uso de padrões
Date: Tue, 24 Jan 2012 11:26:54 -0300

Olá pessoal,

    Estava componentizando classes javas, e precisava identificar as
classes que estavam repetidas dentro dos diversos projetos, e quais
destas possui conteúdo igual e quais possuem conteúdo diferente.
Todavia usar apenas o basename do arquivo não é suficiente, da mesma
forma que, o conteúdo das classes podem ser diferentes, devido
evoluções ocorridas em cada projeto.

    Sem ter que entrar no mérito de analisar o conteúdo do arquivo,
usei a abordagem de que, arquivos semelhantes são aqueles que o
basename mais um determinado número de diretórios superiores são
iguais (reverse depth). Para cada arquivo casado com esse critério,
tem-se duas opções, comparar o tamanho para buscas mais rápidas e um
hash de soma.

    A partir da interação no resultado do find, o script alimenta duas
arrays, armazenando o path e reverse path (base + X diretórios
superiores). A cada interação, caso o reverse path esteja na array, o
path do armazenado é obtido da outra array e comparado (via tamanho do
arquivo ou hash) com o path da interação atual.

    Assim o resultado pode ser exibido com todos os arquivos
duplicados ou somente aqueles que são diferentes.

    Já evoluimos no sentido de analisa padrões, e não apenas a
linguagem do shell, sendo padrões que acho interessante:

  - Como não há estruturas em shell, pode-se usar diversas arrays cujo
o índice igual vincula as informações. Então utilizo duas arrays, uma
que armazena o path completo, outra que armazena o 'reverse path', e
estão vinculados pelo uso do mesmo índice.

  - Como no shell o retorno de funções é equivalente "inteiro", você
na maioria das vezes fica impossibilitado de o conceito de métodos
estáticos (só útil quando pode-se retornar inteiro) que são mais
legíveis, visto que, a característica de "método estático" (ou melhor,
função estática) é processar entradas e gerar saídas, ao invés de
alterar valores de variaveis globais. Então considerando a
impossiblidade de usar funções estáticas, sugiro que o nome do método
informe qual variavel ele irá definir, sempre com o objetivo de
facilitar a leitura do código. Ex:

# ...
setResultIfFilesNotEquals "$COMPAREMODE" "$line" "${fpath[index]}"
if ! isEmpty "$result" ; then
# ...

    Assim a função setResultIfFilesNotEquals deixa claro que ela vai
definir o valor de $result.

   - Usar shelldocs (batizei) são importantes.

   - Fazer menos pipes para comandos externos e armazenar a saida
produzida em arrays:

function setResultIfHashNotEquals() {
    local sum=($(md5sum "$1" "$2"))
    if [ "${sum[0]}" != "${sum[2]}" ] ; then
        result="${sum[0]}:${sum[2]}"
    fi
}

    - Exemplo de processamentos de parâmetros em 'processArgs "$@"'.
Acredito que haja um getopts e que esse método possa ser refatorado.

    - Bash expansions ao invés do cut, ${result%%:*} e ${result##*:}


http://github.com/reinaldoc/reinaldoc.github.com/blob/gh-pages/tools/feeling-equals.sh

Ainda há código a ser refatorado, e sugestões são bem vindas :)


-- 
Reinaldo de Carvalho
http://korreio.sf.net
http://python-cyrus.sf.net

"While not fully understand a software, don't try to adapt this
software to the way you work, but rather yourself to the way the
software works" (myself)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]