Я средний программист perl. У меня нет проблем с самим языком, но с дизайном объекта хороший. Хотя я могу понять (большинство) модулей CPAN, без серьезных проблем, я не могу создать себе даже простую иерархию объектов.
Пример - теперь перед действительно простым приложением (веб-интерфейс и интерфейс командной строки):
- уже прошедший аутентификацию студент загружает zip файл (что содержит задание рендеринга)
- разархивируйте файл и новый каталог и проверьте его содержимое (должно содержать только один файл
commands.txt
) и ноль или более изображений - если содержимое в порядке - переместите каталог на место:
JobRepository
(другой каталог) - если пользователь решил запустить задание рендеринга - отправьте задание из его собственной
JobRepository
в глобальную очередь рендеринга (опять-таки другой каталог) - другой процесс выполняет задания из очереди (fifo - разработан с IPC:: DirQueue) и выполняет процесс рендеринга
- По завершении введите результат в каталог
JobRepository/result
- отправить электронное письмо пользователю
- ученик может загрузить заархивированные результаты
В bash
это выполнимо с несколькими "не сложными" bash script - но я хочу сделать это в Perl (потому что веб-интерфейс) - и вы хотите, чтобы дизайн объекта perlish (Moose)...
И здесь начинаются мои проблемы.
Попробовал "визуальный" подход существительного-анализа и сделал следующее изображение.
Отправлено изображение, потому что оно "короче":
package Iren::JobRepo;
use Moose;
use warnings;
has 'Jobs' => (is => 'rw', isa=>ArrayRef[Iren::Job]);
…
method AddJob {
...
}
и др.
Как вы можете видеть, это действительно просто - но сразу же сталкиваются с некоторыми проблемами решения, например:
- Какой объект должен выполнять методы unzip/zip/checkJob? Он принадлежит: JobRepository от самого "Рабочего места"?
- какой объект должен отправлять электронные письма пользователю?
$user->send_email
- приходит мне глупо, потому что мы отправляем email пользователям, а не пользователю самому себе... - "кто" должен отправить задание от пользователя JobRepo в RenderQueue?
JobRepo->SendJobToRenderQueue
или я должен вызвать некоторый методRenderQueue->addJob
? - какой объект должен использовать ISA
IPC::DirQueue
- (должно быть реализовано RenderQueue) - круговые определения. У пользователя есть JobRepository, в хранилище есть много заданий, но в Job есть? пользователь? (нужно знать, кому принадлежит работа) - и т.д.
Как вы можете видеть, никаких ролей, нет черт здесь - ничего - просто... - но полных вопросов: (
Может кто-нибудь помочь очистить беспорядок? Какая должна быть "хорошая" иерархия пакетов?
Итак, я действительно потерялся, и я начал разочаровываться. Дополнительные вопросы (я знаю, эти мнения основаны) - но я должен их спросить...
- Как узнать хороший дизайн объекта для perl/Moose? (Я, вероятно, никогда не буду использовать другой язык)
- поиск google о дизайне объекта (и Stackoverflow тоже) многократно цитируется в книге "Ганд четырех" (и несколько других). Но обычно для Java. Стоит купить для perl/Moose? Или здесь есть еще несколько хороших книг для perl/Moose?
- - хорошая методика проверки правильного дизайна объекта.
- Генераторы кода из UML, вероятно, не существуют для Moose - или здесь что-то полезное и исправленное?
- просто - как вы овладеваете своей иерархией объектов/Роли/Черты и т.д....? Пока я читаю примеры - я понимаю
$cat->diets
:) - но освоение чего-то нового - плохо для меня...
Извините за стену текста. Я был бы очень счастлив получить любой указатель на хорошую книгу или что-нибудь, что поможет...