Не так давно Samsung анонсировал собственную платформу для разработки приложений для мобильных устройств – Bada. Основным языком разработки для нее является C++. Но какой C++? C++ без исключений, без умных указателей, без использования RAII, без STL. И это в XXI-ом веке! Маразм крепчал, однако.
С подачи одного из разработчиков Poco я пролистал презентацию по платформе Bada. Желание смотреть на Bada пропадает после двух первых примеров: использования двухфазной инициализации объектов и кодов возврата+макросов вместо исключений.
Объекты в Bada нужно инициализировать посредством явного вызова метода Construct:
class TwoPhaseClass { public: TwoPhaseClass(void) : p1(null), p2(null) { } ~TwoPhaseClass(void) { delete p1; delete p2; } result Construct(void) { SimpleClass* p1 = new SimpleClass(); SimpleClass* p2 = new SimpleClass(); // Out-of-memory error. } private: SimpleClass* p1; SimpleClass* p2; }; void MyClass::SomeFunction() { // Calls the constructor which does not throw an exception. TwoPhaseClass a; // Calls the Construct() method which allocates two SimpleClass objects. // Destructor is called because ‘a’ itself is fully constructed. result r = a.Construct(); ... } |
Какая религия им запретила использовать для p1 и p2 класс std::auto_ptr – не понятно.
А вот работа без исключений еще прикольнее:
result r = E_SUCCESS; ... // Case 1: The method returns a result. r = list.Construct(...); if (r != E_SUCCESS) // identical to 'if (IsFailed(r))' { // Process the error condition. } // Case 2: The method sets the result in the method body or returns null. pObj= list.GetAt(...); if (GetLastResult() != E_SUCCESS) // or 'if (pObj== null)' { // Process the error condition. } // Case 3 r = pObj2->Construct(..); TryCatch(r == E_SUCCESS, , "[%s] Service could not be initialized.", GetErrorMessage(r)); ... CATCH: delete pObj1; delete pObj2; return; |
Здесь следует обратить внимание на TryCatch и CATCH – это как раз то, что предлагается вместо нормальных C++ исключений. А следующий пример демонстрирует всю мощь и силу корейской программистской науки:
result r = E_SUCCESS; ... // Case 1: Use a `goto CATCH'. r = pList->Construct(...); TryCatch(r == E_SUCCESS, delete pList, "[%s] Propagated.", GetErrorMessage(r)); ... CATCH: SetLastResult(r); return null; // Case 2: Return a result. r = list.Construct(...); TryReturn(r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r); // Case 3: Return null. r = list.Construct(...); TryReturn(r == E_SUCCESS, null, "[%s] Propagated.", GetErrorMessage(r); // Case 4: Convert an error condition into another error condition. r = list.indexOf(...); TryReturn(r == E_SUCCESS, E_INVALID_ARG, "[E_INVALID_ARG] converted from '%s'.", GetErrorMessage(r)); |
Ну что тут скажешь… Опыт разработчиков первых версий Symbian им явно не указ. Наличие большого количества C++ных библиотек и приложений, написанных на “нормальном” C++ с исключениями, STL и даже с Boost-ом – тем более.
Особо умиляет мотивация отказа от исключений – мол очень высокий run-time overhead. Трындец, просто. Во времена, когда у смартфонов устанавливаются гигагерцные процессоры и гигабайты памяти, накладные расходы на обработку C++ исключений кто-то рассматривает всерьез? Афигеть. Мы, в свое время, на 386-х и 486-х как-то умудрялись и C++ исключения использовать, и умные указатели, и даже STL. И все это на 40MHz процессорах с 4Mb памяти на борту. В общем, чего-то я не понимаю :-/
Желающие могут пролистать презентацию до конца. Там еще много забавного. Например, собственные контейнеры. Но по мне вывод однозначен – в топку такую платформу.
PS. А ведь, по слухам, Samsung собирается провести конкурс среди разработчиков с призовым фондом в несколько миллионов долларов ($2.7M призовой фонд и $300K главный приз). Редиски, блин. Их бы энергию, да в мирных целях.