Как стать автором
Обновить

Комментарии 37

В Wt работа с БД, как по мне, реализована довольно странно
— в Wt для работы с SQL используется их ORM — Wt::Dbo
(Wt::Dbo::collection<Wt::Dbo::ptr >::const_iterator — auto вам поможет)
(Wt::Dbo::collection<Wt::Dbo::ptr >::const_iterator — auto вам поможет)

вместе с range based for
Я в Wt копнул поверхностно, и мне не понравился их подход к вебу как «к виджетам». По большему счету, если у меня есть идея что и как сверстать, то лучше подойдет обычный шаблонизатор (хотя их для C++ не так уж и много).

Прелесть Wt в том, что можно сверстать веб как этот делалось бы для десктопного приложения, но тут опять возникает вопрос целесообразности делать это на сервереном C++, так то Cappuccino погибче и покрасивше будет.
И как оно живет под нагрузкой?
Не хочу вас обидеть, информация действительно очень полезна. Но такие исходники были бы уместны на govnokod.ru, но не на хабре.
Очень сложно не обидеть человека таким высказыванием. Но тем не менее, где вы увидели вырвиглазный код? Если вы придираетесь к форматированию, то кажется, нигде так об этом не холиварят, как в C++.
DataBase=WApplication
Вот так писать, например, ни один плюсовый стайлгайд не разрешает, это не питон.
Кроме того за catch(...) тоже надо бить по рукам.

Код раздутый и плохочитаемый, это правда. Правда и говнокодом я его обзывать не буду, как раз потому что даже первый файл до конца не дочитал.
То что нашел беглым просмотром.

1. Утечки памяти. Огромное количество объектов создается в куче через new и нигде не разрушаются.
2. Нарушение инкапсуляции в class News — переменные в public.
3. Гигантский god-конструктор Page::Page();
4. "container" встречается в коде 12 раз. Для этого есть строковые константы. И таких мест много.
5. transaction1. Это финиш. Вспоминает Delphi и TFrom1.
6. panel->setCentralWidget(new Wt::WText(WString::fromUTF8("<p>Автор:")+Article.get()->author+"</p><p>"+Article.get()->text+"</p>")); Я всегда говорил что на плюсах можно писать точно также плохо как и на PHP — все дело в подходе писателя, а не в языке.
7. contentsStack->setPadding(48,Wt::Top); Magic number 48
Что ж, я не поленился и сходил в документацию к Wt.

1. Утечек памяти нет. При уничтожении корневого элемента, будет уничтожена вся иерархия виджетов.
2. Инкапсуляция ради инкапсуляции? На каждую переменную по get и set? Да, это «как бы правильно», но с практической точки зрения, согласитесь, это раздражает?
3. Вы явно преувеличиваете.
4. Хорошо. Согласен. Однако, все равно, забавно 12 раз написать container вместо «container».
5. Хорошо.
6. Я, конечно, не исключаю возможности более красивой записи данного выражения, но, вероятно, в рамках этого фреймворка это нормальное выражение.
7. Хорошо.
1. Допустим управление виджетами так работает, хотя я сходу не нашел явного на это указания в документации.
Но есть и другие места. Например:
News *a=new News(); //Создаём новость
    a->title=Title->text().toUTF8();
    a->author=Author->text().toUTF8();
    a->text=Text->text().toUTF8();
    Wt::Dbo::ptr<News> Article=DBSession.add(a);
}

2. Возможно здесь и допустимо. Судя по всему к этому склоняет фреймворк.
3. Если код метода не помещается на экран — стоит задуматься. Но не о покупке более крупного монитора.
6. Верстка тегами вместе с вставляемыми данными? А как же тысячи книг и статей про разделение данных и представления? Я уж не говорю что в переменной могут быть угловые скобки или другие тэги. Кроме того там снова утечка: new Wt::WText
1. Деструктор виджета
Деструктор приложения
отсюда я сделал такой вывод.

Про News опять лезем в документацию и видим 2 метода, из чего делаем вывод, что это тоже не утечка.

6. Про разделение данных и представления я безусловно согласен, но быть может, как я уже сказал здесь это нормальное явление? Утечки там снова нет, это добавление виджета в иерархию, которая безопасно удалится. Замещаемый элемент так же удалится.
1. Да, уже нашел, спасибо.
6. Ну как нормальное. Нормально было бы например сделать например метод
getAuthorText(author, text)
Разметку вынести в константу:
<p>Автор: %1</p>
<p>%2</p>

А еще лучше во внешний ресурсник. Иначе как потом переверстать или стили натягивать?
Я с вами согласен.
Там со стилями все не очень просто по другой причине :-)
1. Нет, здесь похоже утечки нет. Фреймворк создаст и вернет умный указатель, который убьет объект при выходе из метода. Неочевидное поведение фреймворка, если честно.
Да, но и ругать человека, не разобравшись, тоже не хорошо.
Да, я был резок. Но мы ж тут не девочки, нечего обижаться, надо делать выводы и самосовершенствоваться.
Других замечаний предостаточно, чтобы подумать о качестве своего кода.
Кстати, из личного управленческого опыта, знаете чем отличаются женщины от мужчин? Когда вы мужчине говорите «твоя работа — говно», он это именно так и понимает. Т.е. сам но остается тем же отличным парнем, просто плохо сделал работу.
Если вы то же самое говорите девушке — она услышит «ты — говно». И с этим ничего нельзя поделать, приходится выдавать замечания очень аккуратно и завуалированно.
Вы это как определили? Откуда вы знаете, что у человека на душе, после такой фразы?

А может быть, все дело в том, что мужчины лучше себя контроллируют и привыкли сдерживать свои эмоции, а девушкам это делать труднее?

Как ни крути, не считаю резкую критику хорошим тоном.
Из опыта определил. А потом получил подтверждение на тренинге по управлению персоналом.

А может быть, все дело в том, что мужчины лучше себя контроллируют и привыкли сдерживать свои эмоции, а девушкам это делать труднее?
Не знаю, это где-то глубоко в психологии.

Как ни крути, не считаю резкую критику хорошим тоном.
Все зависит от критикуемого и цели критики. Но если не знаешь человека — безусловно лучше воздержаться от резкостей, согласен.
Выкладывая код, я знал, что мой «стиль» программирования далёк от идеала. Так что спасибо за полезные комментарии, будем исправлять потихоньку.
Спасибо за инвайт, к сожалению не знаю кто мне его подарил, но надеюсь оправдаю ожидания.
К сожалению существую начальники которые вместо фразы «Твоя работа — говно» говорят «Ты — говно».
Да, бывают конечно. Но гораздо больше существует рядовых сотрудников, говорящих «мой начальник — мудак». Мгновенный переход на личности в отношении начальства почему-то считается нормой.
Спасибо за статью, возможно будет время испробовать.

Boost используется самим Wt? Библиотеки подключаются, но использования не увидел. Ещё интересна конкретно boost_thread — насколько я знаю, C++11 предоставляет большинство возможностей этой библиотеки. Обязательно подключать?
Не смотрели ли Yandex Cocaine? Вроде как можно запускать на одной машине, привязки к C/C++ и к чему только нет.
Насколько я знаю, там boost::signals используются внутри. Может и еще чего.

Вообще Wt — это как Qt для веба и без собственного препроцессора.
Буст используется Wt и идёт в обязательных зависимостях. Вообще использует не C++11, а C++0x, немного «устаревшие» bootstrap,tiny_mce и остальные компоненты, поэтому думаю без него не получится.
Yandex Cocaine обязательно посмотрю. Как писал в начале хочу писать веб зная С++(посредственно судя по всему =), поэтому заинтересовался Wt. Если есть ещё аналоги — обязательно поизучаю.
Мне интересен Wt. Много с ним работаю, для себя со временем выработал определенную схему/структуру исходников, особенно когда работаю с базой данных, так чтобы и компилировалось быстро, и писать удобно было. Также пишу под линуксом в Qt Creator'е, но компилирую и запускаю с терминалки (видимо привычка).
Важный момент. Если структура базы данных сложная, то нужно очень аккуратно понимать, где мы подключаем хидеры, в которых объявлены классы таблиц баз данных и работаем с ними, а где нет. Например, у меня есть проект на 20 класс-таблиц БД, в каждой по 5-10 «колонок», по 2-3 связи, так вот при компиляции файла .cpp, который включает эти хидеры, происходят тысячи инстанциаций шаблонных функций и классов для таблиц БД, так что каждый object-файл *.o весит ~3 Mb. Понятное дело, что время компиляции большое, а при линковании 99% этих данных дропаются (т.к. присутствуют в каждом object-файле).
Если кому интересно — пишите, расскажу о своем опыте.
Интересно. А как с хостингом?
Не знаю. Я всегда запускал на своих серверах для локальных нужд. А как же с хостингом?
Как минимум, что-то вроде VPS/VDS нужно.
Я смотрел Wt и мне он не понравился. Он сложный и стилистически от меня далёк.
По этому всем советую cppcms.com/wikipp/en/page/main CppCMS, после долгих поисков С++ фреймворка я пал именно на него. Даже сделал парочку маленьких приложений и остался доволен.
В CppCMS, если я не ошибаюсь, так же требуются знания html, CSS, js и всего остального. Поэтому мне он не очень подошёл. В Wt от этих знаний зависит лишь возможность сделать что-нибудь «нестандартное».
PS Я не спорю, что если лезть в веб, надо знать как минимум основы(вышеперечисленные «языки»), но в случае Wt их можно доучивать по мере необходимости и писать что-либо вообще без знания таковых.
Это очень плохой подход. Никогда не получится хорошо если вы будете подменять HTML+CSS таким языком как C++. Это будет сложно и медленно.
HTML и CSS выучить куда быстрее. В противном случае я не очень понимаю где можно применить такую вещь.

ЗЫ я так же работал с Pylons, Django, RoR и даже там такого не было. Максимум генераторы форм. Иначе Wt больше на GTK смахивает.
Не очень понял аналогию с GTK. Да и собственно никогда с ним не работал. Пишу на Qt и никогда не думаю о внешнем виде кнопочек, не пишу анимации (где надо они и так есть) и к вебу подходил с точки зрения десктопной разработки именно на нём. У меня не очень сложилось с PHP, после Qt выглядит довольно скромно и большое количество вроде стандартного функционала приходится реализовывать самому. А написание фронтэнда к сайтам в конец застало меня в расплох. Писать логику ещё пол беды(её в любом случае писать и тут она мало чем отличается), хоть и подход немного другой, а внешний вид на html, css, js,ajax это как ещё одно полноценное приложение написать(по времени и трудозатратам).
В общем подход на основе виджетов для меня гораздо ближе чем изучение минимум 3 (ТРЁХ!!!) языков только для того, чтобы поменять внешний вид и прикрутить анимации.
Для GTK есть рендр в HTML. Я к слову сам много на Qt писал и в вебе все иначе… хотя QML вроде как очень похож на HTML+CSS+JS.

А в том что для веба надо знать огромный зоопарк технологий я с вами соглашусь. Самое плохое что эти технолгии очень разные со своей историей и подходами.

PS а я на PHP и не пишу я как правило Python использую (Pylons или Tornado) а для фронтенда виджеты из dojotoolkit.org/.
Я вот подумывал о питоне, пока не до конца решился. А почему не Django?
Bloatware и синдром NIH. Сейчас она более модульная и стала по гибче но года 3-4 назад это был монстр. Главным плюсом джанги была встроенная админка и по сему возможность запускать проект начиная с альфа версии. Но на практике это мало кому нужно, так как админку всегда пишут сами под свои нужны.
Pylons/Pyramid к примеру никогда не изобретали велосипеды, а использовали уже готовые и хорошие библиотеки, сами были на порядок меньше и понятнее. Ну и разница в уровнях ORM — SqlAlchemy просто на голову выше того что в Django или даже в RoR (если можно датамапер сравнивать с активрекордом). Я уже не говорю, о том что смена шаблонизатора, ОРМ и т.д. всегда были для Django либо гемором либо отваливанием фич.
А сейчас к тому же есть куча всяких Flask подобных и ворох асинхронных фреймворков. Если на заре развития веб фреймворков в Python смысл в Django ещё был то сейчас я его не вижу. Вещь в себе со своими личными плюшками и тараканами.

ЗЫ Pylons хорош что из него можно лепит всё, что угодно (в том числе патчить под свою серверную архитектуру). Мы несколько лямов уников (и наверное в 30 раз больше просмотров) держали вот тут: actudlidad.rt.com и 200 тысяч просмотров на слабом железе вот тут: anime-pictures.net. (в день разумеется)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории