LINUX.ORG.RU

вопрос по организации кода

 


0

1

допустим, скрипт должен скачивать файлы по списку.

...
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();

foreach my $url (@urls) {
 my $resp = $ua->get($url);
 ...
}

пока все просто,

но если попутно нужно выполнять другие действия (проверки, логирование, обработка скачанных файлов...), то возникает желание код как-то организовать.

подскажите, как это принято делать?

нормально ли выделить этот кусок в отдельную функцию? ведь тогда вызов LWP::UserAgent->new(); будет происходить каждый раз при обращении к ней.

а если LWP::UserAgent->new(); оставить в основном коде, то нужно будет его результат хранить в глобальной переменной, что как-то тоже не приветствуется.

может есть какаято хорошая статья именно про организацию кода? а то по моим запросам находится только объяснение как использовать конкретные модули на простейших примерах.


Исходите прежде всего из функционала, уточняйте требования к функционалу до мельчайших деталей - и тогда код сам будет подчиняться этим требованиям, поскольку никак иначе его уже не напишешь.

Писать код «красиво» - это, на мой взгляд, глупейшая идея из всех возможных, потому что не за «красоту» платят.

Нужна поддержка разработки большой командой? Это тоже функциональное требование по существу, поскольку в каждый момент времени вы будете иметь не конечный продукт, а некий «текучий» материал, срез которого будет конечным продуктом.

Нужен параллелизм? (Perl5 и параллелизм - так себе совместимы, но это ваш выбор). Опять же - это функциональное требование, которое само по себе заставит Вас организовать код тем или иным образом.

Пишите код, уточняйте функциональные требования к нему - а структура сама будет подстраиваться под эти требования.

Относительно глобальной переменной - опять же, если нужно просто написать скрипт, что-то скачивающий, т.е. в Вашей интерпретации ФТ, нет ничего плохого использовании в глобальной переменной.

Могу только дать подсказку, что «избавляться» от глобальных переменных «помогают» объекты.

DRVTiny ★★★★★
()

Ток не слушай DRVTiny. Он плохого может насоветовать.

А так задача к perl не имеет никакого отношения. В целом такие проблемы есть везде. Прощу всего посмотреть как эти проблемы решали другие (исходники любой серьёзной программы, тем более на perl много маленького чего написано), олсо советую «clean code», она про java, но в целом будет очень полезна.

anonymous
()

ведь тогда вызов LWP::UserAgent->new(); будет происходить каждый раз при обращении к ней.

Инстанс LWP::UserAgent можно сделать свойством класса.

Можно использовать глобальную переменную, если это маленький скрипт.

Можно через замыкания работать.

Я бы считал твой случай предварительной оптимизацией, тк значимый overhead на инстанцирование LWP::UserAgent начнет проявляться только на тысячах запросов.

Запросы формировать через HTTP::Request.

my $ua = LWP::UserAgent->new;

my $req = HTTP::Request->new(GET => 'http://www.example.com/');

my $res = $ua->request($req);

Традиционный совет. DRVTiny не слушай :)

outtaspace ★★★
()

ведь тогда вызов LWP::UserAgent->new(); будет происходить каждый раз при обращении к ней

И что? Проблема то где?

loz ★★★★★
()

Я бы сделал примерно так:

use LWP::UserAgent;

sub fetch_file {
  my ($ua, $url) = @_;
  for (my $try = 0; $try < 3; $try++) {
    my $resp = $ua->get($url);
    if ($resp->is_success) {
      return $resp->decoded_content;
    }
    # обработка ошибок запроса
  }
  return; # попытки закончились
}

my $ua = LWP::UserAgent->new();

foreach my $url (@urls) {
  my $content = fetch_file($ua, $url);
  if ($content) {
    say "success: $url";
    # действия с загруженным
    next;
  }
  # действия при неудаче
}

А на будущее: см секцию «Литература» по ссылке + Физерс, «Эффективная работа с унаследованным кодом».

Ну и самое главное - читать чужой код. Последнее ничто и никогда заменить не может.

P.S. DRVTiny не слушай, он мамкин теоретик.

anonymous
()

всем спасибо.

user7
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.