Библиотека программиста

   Летом 1998 года в нашем городе начали свою работу первые трудовые отряды старшеклассников, которые тогда носили название «Губернаторский стройотряд». Я без колебаний решил принять участие в этом мероприятии, тем более что за работу обещали денежное вознаграждение.

   В 1999 году, после завершения очередных работ и получения зарплаты, я отправился в единственный книжный магазин нашего города. Там, в разделе с книгами по IT, решил потратить все свои деньги на книгу по «Turbo Pascal». Это был мой первый шаг на пути к нынешней профессии.

   Интерес к программированию возник у меня ещё в школьные годы, под влиянием некоторых фильмов, в которых хакеры олицетворялись почти божествами, влияющими на реальный мир, танцуя с бубном перед монитором компьютера. Мне хотелось стать таким же профессионалом, как они, и, возможно, именно фильмы сыграли свою роль в формировании моего будущего.

   Судьба сложила мой ветвистый путь к IT, таким образом, что только в 2018 году я устроился full stack-разработчиком, кем работаю по сей день. Однако у меня всегда было желание постичь что-то более сложное, писать интересные и непростые программы на языке C/C++. Без практики, теория закрепляется с трудом, и без теории не получится взяться за серьёзные проекты. Поэтому на начальном этапе, для того чтобы сформировать резюме, приходится выдумывать проекты самостоятельно (по фану). Чем они сложнее, тем больше вероятности, попасть к хорошему работодателю, на высокую ставку, или создать свой проект, который может принести не меньше прибыли.

   На данный момент у меня скопилось достаточно проектов, для того чтобы заметить, что некоторые блоки кода повторяются из проекта в проект. Это натолкнуло меня на мысль о создании отдельной статической библиотеки, которая могла ускорить процесс разработки.

   Я полагаю, что у каждого программиста есть свой тайный сборник библиотек, который он бережно хранит вдали от посторонних глаз. Ведь использование кода без его копирования — это хороший тон. Такой подход позволяет создать свою собственную “книгу магии”, которую можно применять повсеместно, а все изменения вносить в сборник библиотек.

   Я предпочитаю разделять логику, которая может пригодиться в других проектах, на отдельные функции и создавать библиотеку — архив объектных файлов.

   Например: если у нас есть необходимость проверить, есть ли в строке буквы верхнего регистра, то это можно сделать так:


logic.hpp ->

bool has_upper = false; 
for (auto const &var : str) 
    if (std::isupper(var)) 
        has_upper = true; 
if(has_upper) 
    // ToDo логика если есть верхний регистр
else
    // ToDo верхнего регистра нет

   Определение состояния переменной «has_upper», происходит всего лишь в четырёх строках. Но, на мой взгляд, гораздо компактней и более понятней, будет вынести четыре строки в нашу библиотеку.


functions.hpp ->

bool hasUpperRegister(string str){
    bool has_upper = false;
    for (auto const &var : str)
        if (std::isupper(var)) 
            has_upper = true;
}

   Теперь в файле logic.hpp можно написать короткую запись:


logic.hpp ->

if(hasUpperRegister(str)){
    // ToDo логика если есть верхний регистр
}else{
    // ToDo верхнего регистра нет
}

   В php есть удобная, на мой взгляд, функция, которой периодически приходится пользоваться. Её я решил перенести в C++. Эта функция разбивает строку разделителем, возвращая массив. Называется она explode. Эта функция выглядит следующем образом:


std::vector<std::string> exploed( const std::string &line, const std::string &delimiter ){ 
    std::vector<std::string> ret_value;
    size_t pos = 0;
    std::string token;
    std::string line_copy = line;
    while ((pos = line_copy.find(delimiter)) != std::string::npos){
        token = line_copy.substr(0, pos);
        line_copy.erase(0, pos + delimiter.length());
        ret_value.push_back(token);
    }
    ret_value.push_back(line_copy);
    return ret_value;
}

   В этом случае экономится больше строк, чем в предыдущем примере, а смысл всей логики укладывается в одну понятную строку..

   Более объёмную логику, которая связана между собой, лучше выносить в отдельные объекты. Например: работу с файлом (открытие закрытие, чтение, запись и другую необходимую логику), более рационально выносить не в набор отдельных функций, а в объект.

   Помимо прочего, создание статической библиотеки, помогает экономить не только строки в коде, но и время компиляции программы.

   Удачи в ваших начинаниях.