| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Как бы вы задизайнили API |
| Автор: Danissimo 13.12.2006, 17:50 |
| Я попытался сделать сам. Мало чего хорошего получилось. Мой вопрос к гуру следующий: как бы вы решили следующую задачу. Вы достаете строчки из БД. Для БД значение null -- нормальная ситуация. Значение null в перле представлены значением undef. Хочется вести лог. Причем, если написать print "Result: $result\n"; то рикуем получить ошибку, типа значение $result не определено. Чтобы не получать этого сообщения и в то же самое время видеть в логе, что значение не определено, можно объявить подпрограмму definize, и вызывать вот таким образом: print 'Result: ' . definize $result . "\n"; Также видится, что можно определить базовый класс для операций с БД. Он будет хранить как минимум connection с БД. В то же время для удобства, наверное, в нем можно определить операции для логирования. Скажем debug(), info(), error() и т. д. Как бы вы задизайнили и запрограммировали бы подобную задачу. Я вот пытаюсь натянуть имеющийся у меня богатый опыт из других языков. Может я зря пытаюсь это сделать. Поэтому я и обращаюсь к вам, гуру, за советом. У вас ведь больше опыта, вы знаете, как лучше? |
| Автор: nitr 13.12.2006, 19:23 | ||||||
| что-то ты неверно делаешь, даже если нул, оно пустое будет... к примеру объявить явно
либо это я так делаю ;) что не бывает ошибки... Добавлено @ 19:28 даже как тест
|
| Автор: Danissimo 13.12.2006, 20:19 |
| Во-во, я вот как раз об это и говорю. Чтобы не писать таких вот строк: defined $result ? print "Result: $result\n" : print "Result: null\n"; предлагается использовать вспомогательную подпрограмму, которую можно использовать вот так: print "Selected: <$id" . definize $when . ', ' . definize $ref . ', ' . definize $terminated . ">\n"; Каждая из переменных, передаваемых в definize, может быть null. При таком раскладе использовать конструкцию defined ???... можно. Но не нужно. Добавлено @ 20:22 Или даже еще проще: print 'Selected: <' . join(', ', definize($when, $ref, $terminated)) . ">\n"; |
| Автор: Danissimo 14.12.2006, 15:56 | ||
| Короб, ты гений. Действительно, можно ведь просто, передать весь прочитанный массив в подпрограмму, которая умеет обрабатывать массивы. Это хороший шаг вперед. Однако остался открытым вопрос. Преамбула:
Собственно, вопрос -- как вызывать definize с как можно меньшим кол-вом писанины. |
| Автор: Nab 14.12.2006, 20:29 |
| Ну уже ж написали, что эту функцию нужно експортировать... Не хочешь юзать Exporter, експортируй сам, но имхо это лишнее... |
| Автор: Danissimo 15.12.2006, 09:34 | ||||||||||||
Э-эхх, не хватает мне опыта. Смотрю на конструкции, как баран на новые ворота. В конце концов с вашей помощью сделал маленький примерчик. Вроде, заработало. Практической пользы -- никакой. Зато вот такое наблюдение: ClassA.pm
ClassB.pm
testAB.pl
Запускаем, все отлично:
Теперь делаем простейший трюк: заменяем все ClassA на просто A, ClassB -- на B. Вот результат:
У меня объяснений нету. Одни буквы |
| Автор: korob2001 17.12.2006, 15:36 | ||
Вот этой части не понял, поясни подробнее. Что значит заменяем ClassA на просто А? |
| Автор: Zuzu 18.12.2006, 16:27 | ||
Другой вариант. Просто проигноритуй первый переданный аргумент (просто напиши shift). Только лично мне нравится вызов "без $self-> ". Всегда пишу $self-> ... перед методом. Чтобы проблемы в дальнейшем не отгребать. Хочешь еще уменьшить код - помести print внутрь процедуры. =) |
| Автор: Danissimo 18.12.2006, 17:51 | ||||
Я имел в виду переименовать файл ClassA.pm в A.pm, а также все упоминания класса ClassA в коде заменить на A. |