В наши дни, когда вы говорите о настольной разработке, люди смотрят на вас, как на какого-то луддита. Несмотря на ажиотаж вокруг мобильных устройств, честно говоря, самая продуктивная и сложная работа по-прежнему выполняется на компьютере (или через браузеры, работающие на компьютере).
Я люблю Java, Swift и другие, но когда дело доходит до создания настольных приложений, C ++ в тандеме с Qt по-прежнему остается лучшим. Вот несколько причин, по которым я все еще увлекаюсь Qt в 2017 году:
Легкий
Qt с C ++ просто прост в использовании. Единственная сопоставимая среда разработки - XCode. Имея массу отличных примеров при запуске, вам не нужно много времени, чтобы намочить ноги. Я знаю, что привлекательность быть программистом связана с такой сложностью, которую «простые смертные» едва могут осознать, но я также большой поклонник упрощения рудиментарных задач, таких как создание пользовательского интерфейса, чтобы это стало искусством, а не это можно сравнить с решением сложной математической задачи. Исходя из фона Java Swing и PyGTK, Qt был для меня раем.
Быстрый. Очень быстро.
Общеизвестно, что C ++ - очень быстрый язык, и я считаю, что Qt частично воспользовался этой скоростью. Сравнивая разработку и взаимодействие с программным обеспечением, которое я создавал в прошлом, Qt всегда казался немного более проворным (я не проводил никаких тестов, поэтому могу ошибаться). Даже сегодня, когда я провожу большую часть своих дней в XCode, я все еще не могу не восхищаться скоростью и легкостью Qt. Это, конечно, может быть связано с моими внутренними предубеждениями и ограничениями как кодировщика. Ниже приведен фрагмент грубой сортировки слиянием на основе графического интерфейса пользователя, которую я проделал ДОЛГО назад. Работает как шарм и заметно четче, чем Java, при работе с большим набором данных. Можете попробовать сами.
// MergeSort.cpp // Class MergeSort member-function definition. #include <vector> using std::vector; #include “merge_sort_budget.h” // class MergeSoft definition /** The constructor for the MergeSort class. @param btList btList the budget tab list. */ MergeSortBudget::MergeSortBudget(BudgetTabList btList) { size = btList.size(); //validate vectorSize // fill the vector with random BudgetTabItems with different dates for (int i = 0; i < btList.size(); i++) { data.push_back(btList.at(i)); } } // end MergeSort constructor // /** Split vector, sort subvectors and merge subvectors into sorted vector @param btList the budget tab list. @return nothing. */ void MergeSortBudget::sort(BudgetTabList btList) { sortSubVector(0, size — 1, btList); // recursively sort entire vector } // end function sort /** Recursive function to sort subvectors @param low the low tab. @param high the high tab. @param btList the budget tab list. @return nothing. */ void MergeSortBudget::sortSubVector(int low, int high, BudgetTabList btList) { // test base case; size of vector equals 1 if ((high — low) >= 1) // if not base case { int middle1 = (low + high) / 2; // calculate middle of vector int middle2 = middle1 + 1; // calculate next element over // split vector in half; sort each half (recursive calls) sortSubVector(low, middle1, btList); // first half of vector sortSubVector(middle2, high, btList); // second half of vector // merge two sorted vectors after split calls return merge(low, middle1, middle2, high, btList); } // end if } // end function sortSubVector /** Merge two sorted subvectors into one sorted subvector @param left the left. @param middle1 the high tab. @param middle2 the high tab. @param right the high tab. @param btList the budget tab list. @return nothing. */ void MergeSortBudget::merge(int left, int middle1, int middle2, int right, BudgetTabList btList) { int leftIndex = left; // index into left subvector int rightIndex = middle2; // index into right subvector int combinedIndex = left; // index into temporary working vector vector<BudgetTabItem> combined; // working vector for (int i = 0; i < size; i++) combined.push_back(BudgetTabItem(“”, 0, 0, 0)); // merge vectors until reaching end of either while (leftIndex <= middle1 && rightIndex <= right) { // place smaller of current elements into result // and move to next space in vector if ((data[leftIndex].getYear() >= data[rightIndex].getYear() && data[leftIndex].getMonth() > data[rightIndex].getMonth()) || (data[leftIndex].getYear() > data[rightIndex].getYear() && data[leftIndex].getMonth() >= data[rightIndex].getMonth()) || (data[leftIndex].getYear() > data[rightIndex].getYear() && data[leftIndex].getMonth() < data[rightIndex].getMonth())) combined[combinedIndex++] = data[leftIndex++]; else combined[combinedIndex++] = data[rightIndex++]; } // end while if (leftIndex == middle2) // if at end of left vector { while (rightIndex <= right) //copy in rest of right vector combined[combinedIndex++] = data[rightIndex++]; } // end if else // at end of right vector { while (leftIndex <= middle1) // copy in rest of left vector combined[combinedIndex++] = data[leftIndex++]; } // end else // copy values back into original vector for (int i = left; i <= right; i++) { BudgetTabItem item = combined[i]; item.setTabIndex(i); data[i] = item; } } // end function merge /** Display elements in vector @param none. @return nothing. */ void MergeSortBudget::displayElements() const { displaySubVector(0, size — 1); } // end function displatElements /** Display certain values in vector @param none. @return nothing. */ void MergeSortBudget::displaySubVector(int low, int high) const { // output spaces for alignment for (int i = 0; i < low; i++) //cout << “ “; // output elements left in vector for (int i = low; i <= high; i++) { BudgetTabItem item = data[i]; } } // end function displatSubVector /** Gets the sorted index. @param month. the month of the tab. @param year. the year of tab. @return sortedIndex */ int MergeSortBudget::getSortedTabIndex(int month, int year) { int sortedIndex; for (int i = 0; i < size; i++) { if ((data[i].getYear() == year) && (data[i].getMonth() == month)) { sortedIndex = data[i].getTabIndex(); } } return sortedIndex; }
Независимость от платформы
При разработке мобильных приложений уделялось много внимания тому, чтобы не зависеть от платформы, и с учетом этого было создано множество инструментов. Qt сделал это ДЛИННОЕ время назад на рабочем столе, и сделал это с размахом. Перенос ваших приложений на разные платформы не кажется тяжелым трудом. Они работают одинаково на всех ОС / платформах практически без переноса.
Выход из текущего духа времени
Программы. Программы. Программы! Мобильные приложения! «Эй, чувак, ты можешь создать мне приложение, братан?» - сказал старый приятель из колледжа. В последнее время кажется, что повсеместное распространение мобильных устройств успешно ассоциируется с мобильными устройствами. Может это правда. Это также может быть утомительно, как если бы основные СМИ постоянно твердили об ИИ. Может быть, я просто сентиментален, но Qt ощущается как подлинное и реальное программирование - культура программирования, не основанная на шумихе или последних новинках. Он продвинутый, но примитивный. Он исчерпывающий, но не закрытый. Это кажется настоящим. Это кажется правдой. Это не похоже на StackOverflow-y. Недавно я посмотрел крутой документальный фильм WIRED о стартапах в Израиле. Документальный фильм заставил меня почувствовать то же самое, что я чувствовал, когда впервые начал возиться с Qt - как будто я был частью чего-то истинного. Посмотрите это ниже:
Есть целое поколение программистов, которые могут совершить трагическую ошибку, игнорируя рабочий стол и Qt (с C ++). Это повредило бы им не только с точки зрения истории, но и с точки зрения их целостности и масштабности. Существует целый большой мир компьютерных наук: в настоящее время разрекламированные области - это искусственный интеллект и наука о данных. По всей видимости, я буду работать с обоими на постоянной основе в течение следующих шести месяцев. При этом ничто не сравнится с интимностью создания чего-то с нуля с помощью чего-то вроде Qt - это удовольствие, что ни один кодер не должен отказывать себе.
Я Табо Класс и работаю в Spreebie. Ваше здоровье.