шарпоплюсноучебное 31.10.12 18:24 // оригинал
Ознакомился с парой учебников Павловской по С++ и С#, которые оказались практически единственными тематическими книгами, закупленными нашей библиотекой в количествах, доступных для рядовых студентов (по рекомендациям МО РФ). Понятно, что адаптированные программистские курсы нужны исключительно из стремления сэкономить, своего там - ну разве что примеры, изложение самого языка - пересказ того, что понял автор. Все-таки честно попытался преодолеть это предубеждение, раз уж все равно работать с теми, кто будет этим пользоваться.
Книжку по С++ пролистывал быстрее, только в поисках привычных реперных точек. Поэтому есть шанс, что просмотрел - но в упор не увидел описания работы конструкторов/деструкторов с разными типами памяти и с объектами-полями других классов. Исключения, шаблоны - приемлемо, но очень наискосок. Стандартная библиотека расписана прилично, честно перечислены практически все алгоритмы, не говоря уж о контейнерах. Собственно, книжка и не позиционируется как исчерпывающее описание - что тоже вполне честно. Слова про полезность для искушенных программистов - это вряд ли.
Учебник по C# честно просмотрел весь. В паре мест цепанул перевод. Sealed классы упорно называются бесплодными. Чем не угодили запечатанные - непонятно. Отдельный шик - перевод слова virtual. На голубом глазу утверждается, что "virtual в переводе с английского означает фактический", после чего строится логическая цепочка - мол, фактический, поскольку ссылки на метод разрешаются по факту вызова во время исполнения. Конечно, есть и такой вариант перевода, но все-таки воображаемый/возможный/гипотетический в данном контексте звучит гораздо логичнее и не требует притягивания за уши рассуждений о разрешении по факту (хорошая проверка для перевода - pure virtual). Рассказ, что # - на самом деле диез, и говорящие "си шарп" должны и C++ называть "си плас-плас" - ну тогда уж нужно было доводить музыкальный перевод до конца и рассказывать про до-диез.
Из откровенных ляпов наткнулся на рассказ о разнице между делегатами и событиями. Утверждается, что все их отличие - в том, что "при использовани событий не требуется описывать метод, регистрирующий обработчики, поскольку события поддерживают операции += и -=". Причем в примере, демонстрирующем переход от делегатов к событиям, += прекрасно используется именно для делегатов, а сам объект-делегат объявлен как public. Так что мне искренне жаль студентов, пытающихся понять, что же мешает использовать эти += с ним напрямую снаружи, не связываясь с инициализирующей функцией (правильный ответ - а ничего не мешает, но ломает инкапсуляцию, для сохранения которой в сочетании с экономией на коде на самом деле и придуманы события). Замечательный пример перепутывания причины и следствия.
Полное остутствие упоминания указателей на функции при вводе понятия делегата в сочетании с пассажем о том, что только с появлением лямбд C# приблизился к Паскалю, умевшему передавать функции как параметры еще в 92-м году, в целом как бы намекает.
По сумме впечатлений по-прежнему вижу лишь одну целевую аудиторию для адаптированных курсов - желающие сдать и забыть. Для потенциальных профессиональных разработчиков вариант "использовать как трамплин, чтоб потом перейти на правильные книги" выглядит не очень убедительно, лучше уж сразу потратиться на приличные классические учебники, в которых с самого начала можно надеяться на отсутствие авторских фантазий. Понятно, что "только хардкор, только Страуструп" подойдет не всем, но Липпман для С++ и Троелсен для С# - это практически оптимум.