Несколько лет назад я просматривал только что выпущенный Samsung BADA SDK и связанные с ним материалы, и меня поразило количество «учебных пособий» и «руководящих принципов», которые пытались прояснить различные основные аспекты языка и платформы с помощью плохо сконструированных примеров с очевидные ошибки на уровне языка C ++ (см. стр. 8 и 9 по адресу http://mobileawards.ir/LinkClick.aspx?fileticket=zf9YxiDILVg=&табетический = 937 — презентация опубликована Samsung, и примеры кода являются оригинальными, я видел подобное где-то в SDK). Но это было относительно ново, так что я подумал, что они просто уберут это.
Недавно что-то меня об одном из тех вещей, которые нельзя просто отклонить как «опечатка» или «случайный неправильный пример кода»:
виртуальный результат Osp :: Base :: Collection :: IList :: Add ( const Object & OBJ ) [чисто виртуальный] Параметры:
[in] obj Объект для добавления
Примечания:
Этот метод выполняет поверхностное копирование. Это добавляет только указатель; не сам элемент.
…..
…..виртуальный Объект * Osp :: Base :: Collection :: IList :: GetAt (int index) [чисто виртуальный]
Для меня, с точки зрения «классического C ++», это очевидная ошибка. Это так неправильно на многих уровнях:
он принимает общую вещь по ссылке для сохранения в списке. В примечаниях есть примечание, что оно будет храниться не по копии, не по ссылке, а по указателю. Принятие by-ref вместо указателя просто, вероятно, заставит разработчика выполнить некоторые приведения / * /&с, но это относительно незначительная проблема
принятая ссылка Const. Метод доступа к элементам, GetAt (), возвращает фактически неконстантный объект! Таким образом, коллекция de’const’а все автоматически для вас ..
в различных руководствах содержится множество предупреждений, запрещающих добавлять в списки временные объекты, основанные на стеке (). Они явно говорят вам, чтобы добавить () только объекты на основе кучи, выделенные new
..
GetAt на самом деле возвращает неконстантный указатель, не ссылка! Вероятно, чтобы иметь возможность вернуть магическое значение как ошибку (в BADA нет обработки исключений ..). Теперь посмотрите на несколько различных руководств по обработке списков и посмотрите на все эти * и &s разбросаны и размещены в самых удивительных местах, таких как:
MyObj* x = new MyObj();
list.Add(*x); // the '*' is at least mighly misleading..
Что позже приводит к удивительным вопросам, таким как разработка samsung bada без использования указателей который показывает, что бедный человек был действительно смущен .. Но я начинаю отвлекаться ..
Выше приведен фрагмент одного из базовых интерфейсов, который впоследствии будет реализован и использован различными базовыми коллекциями. На самом деле все хеши / списки / и т. Д. Имеют одинаковое соглашение …
Для меня это выглядит так, как если бы он был разработан человеком, который обучался, скажем, на Java или C # и имел очень мало представления о языке C ++. Const постоянно злоупотребляет, как и ссылки. А также я не вижу какой-либо причине за это*)
Я не прав с моим суждением здесь? Знаете ли вы какое-либо разумное объяснение, почему эти интерфейсы разработаны таким образом, именно я ищу объяснение:
(*) хорошо, за исключением городского мифа о том, что «ссылки не могут быть NULL», что может указывать на то, что «Add» не может принять нулевой указатель. Тем не менее, это было бы безумной идеей, поскольку добавление элемента требует от вас разыменования Add(*ptr)
следовательно, довольно легко заметить, что ссылка, безусловно, может быть NULL.
редактирование / обоснование вопроса:
После мгновенного и адресного комментария Майка я попытался убрать как можно больше слова «напыщенная речь», которая попала в текст скорее всего потому, что я иногда сталкиваюсь с «пуристским» настроением. Тем не менее, трудно представить ошибки без жалоб на них. Я не бада разработчик. У меня нет никаких реальных причин разглагольствовать. Мои вопросы не носят риторический характер: мне бы очень хотелось узнать причину такого дизайна. Я не принимаю простое «потому что этот / этот разработчик (и) был / были плохим». Это вероятно, и я думал об этом, но я отвергаю такие рассуждения, потому что я не всезнающий и потому что, ну, это совершенно недоказуемо. Я спрашиваю, потому что это беспокоит меня, и я хотел бы знать причину. Я надеюсь, что какой-нибудь опытный разработчик bada появится и укажет мне статью, в которой я описываю эту статью, которую я не смог найти в Google, или которая потеряет некоторую историческую информацию, которая фактически докажет, что она заимствована из pre-std-C ++ Symbian. Я не рассчитываю на быстрый ответ. Я действительно думаю, что этот вопрос останется без ответа, потому что, вероятно, не так много людей на земле, которые могут предоставить такую информацию. Это, однако, не делает этот вопрос риторическим и, на мой взгляд, не делает его без вопросов. Конечно, каждый может иметь разные взгляды. Если это так, он будет закрыт.
Да.
Для этого просто нет веских технических причин. Стандартизация C ++ была типичным процессом ISO, открытым и хорошо документированным. Доступны тысячи открытых документов, и многие эксперты тесно связаны с сообществом. Этот особый стиль устарел с момента интеграции STL в стандарт C ++ в 1996 году.
Хуже того, эти коллекции Bada не добавляют функциональности стандартному C ++, поэтому они довольно избыточны.
Бизнес-причина, вероятно, заключается в том, что все хорошие инженеры Samsung работают над реальным кодом, а не над Bada. Это, и мне жаль, что я такой резкий, любительский уровень.
Других решений пока нет …