У библиотеки ACE есть несколько фатальных недостатков (помимо того, что ее писали не мы ;) ). Во-первых, это уж очень old-school стиль (местами даже не C++ный, а вообще C-шный). В особенности с кодами ошибок – функции возвращают –1 при ошибке, а сам код ошибки нужно брать из errno. Во-вторых, у ACE ну уж очень куцая документация. И об этом-то пойдет речь.
Информацию об ACE можно брать из трех типов источников:
- Книги (“C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns”, “C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks” (эти две переведены на русский язык), “The ACE Programmer's Guide: Practical Design Patterns for Network and Systems Programming”). Имхо, без них за ACE лучше не браться. По крайней мере я не решался широко использовать ACE пока не прочел первые две.
- Статьи о разных аспектах ACE, опубликованные на домашней страничке библиотеки (разделы “Technical Papers” и “Advanced Tutorials”). Как мне показалось, там собраны довольно старые статьи и презентации, пользы от которых не много.
- Сгенерированная doxygen-ом по исходникам ACE документация (в on-line ее можно просмотреть здесь). Вещь абсолютно необходимая (посмотреть названия классов/методов/полей), но, временами, абсолютно бестолковая.
Очень сильно помогает еще и изучение исходников ACE, но сейчас я все-таки о документации.
Так вот, вместе с дистрибутивами самой ACE можно скачать еще и архив построенной doxygen-ом документации по ACE. А размер этого архива внушает ;) Вот динамика его изменения:
ACE-html-5.2.5.tar.bz2 06-Oct-2006 17:16 38M
ACE-html-5.5.5.tar.bz2 25-Jan-2007 04:51 67M
ACE-html-5.6.1.tar.bz2 19-Sep-2007 05:41 175M
ACE-html-5.6.2.tar.bz2 14-Dec-2007 05:05 306M
ACE-html-5.6.3.tar.bz2 21-Feb-2008 04:53 306M
ACE-html-5.6.5.tar.bz2 19-May-2008 05:15 298M
ACE-html-5.6.6.tar.bz2 15-Sep-2008 09:58 301M
ACE-html-5.6.7.tar.bz2 27-Nov-2008 06:27 301M
ACE-html-5.6.8.tar.bz2 09-Feb-2009 21:47 184M
ACE-html-5.6.9.tar.bz2 14-Apr-2009 12:32 187M
ACE-html-5.7.0.tar.bz2 22-Jun-2009 13:11 188M
ACE-html-5.7.1.tar.bz2 13-Jul-2009 17:36 188M
ACE-html-5.7.2.tar.bz2 23-Jul-2009 03:59 189M
ACE-html-5.7.3.tar.bz2 11-Sep-2009 05:19 197M
ACE-html-5.7.4.tar.bz2 12-Oct-2009 15:41 197M
ACE-html-5.7.5.tar.bz2 30-Nov-2009 02:27 207M
ACE-html-5.7.6.tar.bz2 01-Feb-2010 04:59 315M
ACE-html-5.7.7.tar.bz2 03-Mar-2010 03:25 314M
ACE-html-5.7.8.tar.bz2 02-Apr-2010 08:47 317M
ACE-html-5.7.9.tar.bz2 31-May-2010 04:43 319M
ACE-html-5.8.0.tar.bz2 05-Jul-2010 03:29 331M
До сегодняшнего дня я пользовался документацией еще к версии 5.5.5. Сегодня решил обновить ее до версии 5.7.9. Глянул на размер архива – 319Mb – и слегка офигел. Не верилось мне, что качество doxygen-овской документации настолько улучшилось, что архив вырос в 5 раз. Но раз надо, значит надо, скачал, распаковал.
В распакованном варианте 181Mb занимает все такая же куцая документация по самой библиотеке ACE. Плюс почти гигабайт не менее куцей документации по TAO (реализация CORBA на основе ACE). Абыдно, поскольку документация по TAO мне вообще нафиг не упала.
Такие вот дела. Полный дистрибутив Qt SDK for Windows (с Qt 4.6.3 и Qt Creator 2.0.0) весит 293Mb. Так там и исходники, и примеры, и вспомогательные инструменты, и на порядки более качественная документация по API. И, повторюсь, все это в 293Mb. А у ACE только ущербная документация, 90% которой мне вообще не нужны, но зато 319Mb. Почувствуйте разницу :/
> В особенности с кодами ошибок – функции возвращают –1 при ошибке, а сам код ошибки нужно брать из errno.
ОтветитьУдалитьЭто такие исключения для бедных, учитывая, что плюсовые исключения жутко тормозны.
Почему не выдается код ошибки в виде значения? Несколько сомнительная, но идея:
Допустим, что ACE::f1 вызывает enterprise::g1, которая вызывает enterprise::g2, которая вызывает ACE::f2.
Внутри enterprise свои способы передачи кода ошибки, и в нее достаточно добавить что-то типа одной константы enterprise::ACE_ERROR; в случае прохода исключения "насковозь" от f2 до f1 не надо заботится о двойной переконвертации кода ошибки.
Вот только как эту фигню заставить гладко работать с многонитевостью?
>Внутри enterprise свои способы передачи кода ошибки, и в нее достаточно добавить что-то типа одной константы enterprise::ACE_ERROR; в случае прохода исключения "насковозь" от f2 до f1 не надо заботится о двойной переконвертации кода ошибки.
ОтветитьУдалитьЧесно говоря, не очень понимаю, чем это лучше простого возврата кода ошибки. Функции g1/g2 могут заменять код ошибки из f2 на собственное значение ACE_ERROR. И никаких проблем с многонитевостью.
Писал некоторое время на NT Native API там функция всегда возвращает код ошибки, после возврата на Win32 API стали очень напрягать все эти бессмысленные GetLastError() :)
ОтветитьУдалить2Rustam: работа с errno/GetLastError не только напрягает, она еще и ошибками черевата. Забудешь сохранить текущее значение errno, вызовешь какую-нибудь вспомогательную функцию, а там бац! и errno в 0 выставят.
ОтветитьУдалитьВ ACE это все, если не ошибаюсь, из-за того, что они стандартную C-шную библиотеку чуть ли не полностью эмулируют.