Сложно ли разрабатывать под "Аврору"? Беседа с разработчиком мессенджера Телеграфъ: примеры кода
Roem: можешь привести примеры кода, с пояснением его специфики?
Михаил: Qt вообще - причудливое и поначалу шокирующее сочетание JavaScript с C++.
if(options.count < 2 || options.count > 10) {
errors.push(qsTr("A poll requires 2-10 answers."));
} else {
for(var i = 0; i < options.count; i += 1) {
var len = options.get(i).text.length
if(len < 1 || len > 100) {
errors.push(qsTr("All answers have to contain 1-100 characters."));
break;
}
}
}
Тут, например, без всякого С++ валидируется опрос вводимый пользователем в чате. Чистый JavaScript.
А вот ещё довольно понятная бизнес-логика в QML (JavaScript):
property bool userIsMember: ((isPrivateChat || isSecretChat ) && chatInformation["@type"]) || // should be optimized
(isBasicGroup || isSuperGroup) && (
(groupInformation.status["@type"] === "chatMemberStatusMember")
|| (groupInformation.status["@type"] === "chatMemberStatusAdministrator")
|| (groupInformation.status["@type"] === "chatMemberStatusRestricted" && groupInformation.status.is_member)
|| (groupInformation.status["@type"] === "chatMemberStatusCreator" && groupInformation.status.is_member)
)
С другой стороны, вся работа с получаемыми и отправляемыми в Telegram данными делается в С++, но возиться с памятью по сути не приходится - это всё делает фрейморк Qt
Вот пример С++ кода, выполняющего поиск эмодзи в БД:
void EmojiSearchWorker::performSearch()
{
LOG("Performing emoji search" << this->queryString);
QVariantList resultList;
if (database.open()) {
QSqlQuery query(database);
query.prepare("select * from emojis where description match (:queryString) limit 25");
query.bindValue(":queryString", queryString + "*");
query.exec();
while (query.next()) {
if (isInterruptionRequested()) {
break;
}
QVariantMap foundEmoji;
foundEmoji.insert("file_name", query.value(0).toString());
foundEmoji.insert("emoji", query.value(1).toString());
foundEmoji.insert("emoji_version", query.value(2).toString());
foundEmoji.insert("description", query.value(3).toString());
resultList.append(foundEmoji);
}
database.close();
} else {
LOG("Unable to perform a query on database" << database.lastError().databaseText());
}
emit searchCompleted(queryString, resultList);
}
С++ тут выглядит более похожим на Java. Хотя доступны все возможности С++, кажется, версии 17 года
Roem: А с QT сейчас нет проблем в работе у россиян, или они за контуром того что разработчик делает?
Михаил: Они совершенно за контуром. Qt 5.6 - последняя, кажется, GPL версия фреймворка - это неотъемлемая часть ОС и средств разработки.
Никакого онлайн-взаимодействия с чем-либо не происходит.
Roem: а дальше как?
Михаил: Спроси чего полегче.
Варианта два:
1) Отход от Qt (или переход на новый фреймворк без потери совместимости)
2) Самостоятельная доработка Qt
Сейчас ещё набирает SDK на Flutter, но я в него глубоко не вникал.
Qt - не какая-то магия. Обычный фреймворк. Дорабатывать его не сложнее, наверное, чем внедрить новый.
Roem: Спасибо большое за рассказ, удачи!