jueves, 4 de septiembre de 2014

usando demasiado una función/llamadas

Este artículo puede ser también pensado como un "buenas prácticas" o "pensar antes de usar un medio potencialmente lento".

Me he topado con un código que básicamente es:

sub get_info{
  # ldap requests
  return %user_info if ($valid_user)  ;
  if($error){
    return 1 if($network_error);
    return 0 if($user_error);
  }
}

Básicamente no es tan simple, pero da una idea de los códigos de retorno y de que datos se utiliza en caso de que esté todo bien.

El código donde se usa es:

sub makeSQL{
if(get_info() == 0){
  # something
}elsif(get_info() == 1){
  # something else
}else{
  %user = get_info();
  # balblabla
}

El problema es bastante simple, se llama a la función repetidas veces. Y lo peor de todo, es el orden. Usualmente, por lo que pude ver, el peor de los casos es RC==1 (no suele fallar tanto la red). Luego, la que es más usual que tenga datos (que sea un hash) es la última.

El código, para realmente simplificarlo, debería ser algo como:

#!env perl

sub get_info($){
  my %ans = ("arbol"    => "22",
              "kamisama" => "dios",
              "gohan"    => "arroz");

  return \%ans unless(($_[0] == 1) || ($_[0] == 0));
  return \$_[0];
}

my @params = (0,1,3);
my $result = {};
foreach my $para (@params){
  $result =  get_info($para);
  if($result=~/HASH/){
    use Data::Dumper;
    print "result: " . Dumper($result) . "\n";
  }else{
    print "## result: " . ($$result) . "\n";
  }
}

De esta forma se reduce significativamente las llamadas a get_info, usando una variable únicamente las variables y no volviendo a llamar getinfo.

Es obvio que elllamar a get_info es mucho más simple y cómodo, pero a la hora de realmente programar, no se debería tomar tan a la ligera las llamadas a las funciones, sobre todo, funciones que tienen IO o usan redes.

No hay comentarios.:

Publicar un comentario