powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужно ли маленькие подзадачки оформлять в качестве лямбд?
22 сообщений из 22, страница 1 из 1
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667539
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше так (более современно):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
std::function<bool()> GetLastPiece = [FullPathFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            if(FileInfo.size() == LastByte) return true;
            else return false;
        };
        
        bool LastPiece = GetLastPiece();



или так (код проще):
Код: plaintext
1.
2.
3.
4.
5.
6.
            
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            
            bool LastPiece;
            if(FileInfo.size() == LastByte) LastPiece = true;
            else LastPiece = false;
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667549
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если для инициализации переменной, то проще сразу вызвать лямбду:
[quot AlekseySQL]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        
        bool LastPiece = [FullPathFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            if(FileInfo.size() == LastByte) return true;
            else return false;
        }();



Для маленьких задачек сгодятся лямбды, для больших лучше в отдельные функции выносить, чтобы не было как в JS'е callback hell'а.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667554
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZ,
спасибо, за подсказку!

Но хочется понять: применение лямбда- выражений для маленьких подзадач это новый стиль, и те кто его не используют- (само)отверженные или же на таких товарищей смотрят как на любителей секса, стоя в гамаке на лыжах?
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667567
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ
Код: plaintext
1.
2.
3.
4.
5.
        bool LastPiece = [FullPathFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            return FileInfo.size() == LastByte;
        }();



Скопировал твой код и даже не посмотрел, что его можно сократить.

AlekseySQLНо хочется понять: применение лямбда- выражений для маленьких подзадач это новый стиль, и те кто его не используют- (само)отверженные или же на таких товарищей смотрят как на любителей секса, стоя в гамаке на лыжах?

Лямбды -- не панацея. Просто тебе дали средство избавиться от ненужного бойлерплейта, особенно, при работе с STL. Как его использовать -- решай сам.
У тебя теперь есть выбор. И принимай решения на основе своего опыта, здравого смысла и удобочитаемости/сопровождаемости кода.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667748
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

не путайте "меньше" и "проще", сложность у него та же
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39667927
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ....И принимай решения на основе своего опыта, здравого смысла и удобочитаемости/сопровождаемости кода.тонко
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668227
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как переместить переменную лямбда - функции?

Код: plaintext
1.
2.
3.
4.
    [Separator = std::move(Separator)]
    {
        MyFunc(std::move(Separator));
    }();



Пишет ошибку, а если не оборачивать вызов MyFunc(std::move(Separator)) лямбда- выражением, то ошибки нет.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668253
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, какой код вам кажется приятнее? Такой (лямбда- выражения разбивают функцию на подзадачи):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
void countFile::BasicProcedureOfTask(cstring& MirrorOfData)
{
    //create array for final data
    array<allData> ArrayOfMonth;
    cstring FullPathReadFile = MirrorOfData + Settings.at("SubDirectoryWithInputFiles") + SubPathToFile;

    //fill array
    [&ArrayOfMonth, &FullPathReadFile, this]
    {
        ArrayOfMonth.CreateAllocator(1000 * 1000, strategyAllocationMemory::MaxAllocation);

        GetDataFromTextFile(FullPathReadFile, ArrayOfMonth, FirstByte, LastByte);

        Sort(ArrayOfMonth, allData::SortTickerNumber);
    }();

    //create task separation month by ticker
    auto Separator = [ArrayOfMonth = std::move(ArrayOfMonth), &FullPathReadFile, this](const variativeData& Settings)
    {
        cbool FirstPiece = (FirstByte == 0) ? true : false;
        cbool LastPiece =  [FullPathReadFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathReadFile));
            if(FileInfo.size() == LastByte) return true;
            else return false;
        }();

        cuint32 CurrentMonth = GetMonthFromFolderName(SubPathToFile);
        SeparateArrayByTicker(ArrayOfMonth, CurrentMonth, Settings, FirstPiece, LastPiece);
    };

    //add task
    [Separator = std::move(Separator), &FullPathReadFile, this]
    {
        string InformationForMessage = "Separate file by Client:" + FullPathReadFile;
        InformationForMessage += "   Data: " + std::to_string(FirstByte/1'000'000) + " - " + std::to_string(LastByte/1'000'000) + " MB";

        cuint32 CurrentMonth = GetMonthFromFolderName(SubPathToFile);
        cstring Priority = std::to_string(CurrentMonth) + std::to_string(FirstByte);

        asyncTask* CurrentTask = new asyncTask(Settings, std::move(Separator), InformationForMessage, Priority);
        asyncPool* SeparationByClient = Settings.at<asyncPool*>("SeparationByClient");
        SeparationByClient->AddTask(CurrentTask);
    };

}



Или такой (дополнительного разбиения нет, все идет "сплошником"):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
void countFile::BasicProcedureOfTask(cstring& MirrorOfData)
{
        //create array for final data
        array<allData> ArrayOfMonth;
        cstring FullPathReadFile = MirrorOfData + Settings.at("SubDirectoryWithInputFiles") + SubPathToFile;

        //fill array
        ArrayOfMonth.CreateAllocator(1000 * 1000, strategyAllocationMemory::MaxAllocation);

        GetDataFromTextFile(FullPathReadFile, ArrayOfMonth, FirstByte, LastByte);

        Sort(ArrayOfMonth, allData::SortTickerNumber);

        //create task separation month by ticker
        cbool FirstPiece = (FirstByte == 0) ? true : false;
        cbool LastPiece =  [FullPathReadFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathReadFile));
            if(FileInfo.size() == LastByte) return true;
            else return false;
        }();

        cuint32 CurrentMonth = GetMonthFromFolderName(SubPathToFile);
        SeparateArrayByTicker(ArrayOfMonth, CurrentMonth, Settings, FirstPiece, LastPiece);

        //add task
        string InformationForMessage = "Separate file by Client:" + FullPathReadFile;
        InformationForMessage += "   Data: " + std::to_string(FirstByte/1'000'000) + " - " + std::to_string(LastByte/1'000'000) + " MB";

        cuint32 CurrentMonth = GetMonthFromFolderName(SubPathToFile);
        cstring Priority = std::to_string(CurrentMonth) + std::to_string(FirstByte);

        asyncTask* CurrentTask = new asyncTask(Settings, std::move(Separator), InformationForMessage, Priority);
        asyncPool* SeparationByClient = Settings.at<asyncPool*>("SeparationByClient");
        SeparationByClient->AddTask(CurrentTask);

}
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЛучше так (более современно):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
std::function<bool()> GetLastPiece = [FullPathFile, LastByte = this->LastByte]
        {
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            if(FileInfo.size() == LastByte) return true;
            else return false;
        };
        
        bool LastPiece = GetLastPiece();



или так (код проще):
Код: plaintext
1.
2.
3.
4.
5.
6.
            
            QFileInfo FileInfo(QString::fromStdString(FullPathFile));
            
            bool LastPiece;
            if(FileInfo.size() == LastByte) LastPiece = true;
            else LastPiece = false;




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

Код: plaintext
1.
 bool LastPiece = FileInfo.size() == LastByte;
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668271
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, скажите, пожалуйста, вам какой код приятнее читать? (для меня это в разы важнее, чем замена if на определение булевой переменной).
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668300
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

ты ведь лямбды для лучшей читаемости использовать пытаешься, так ведь?
И тут вдруг такой лютый быдлокод:
Код: plaintext
1.
cbool FirstPiece = (FirstByte == 0) ? true : false;


Код: plaintext
1.
2.
    if(FileInfo.size() == LastByte) return true;
            else return false;


Код: plaintext
1.
2.
3.
bool LastPiece;
            if(FileInfo.size() == LastByte) LastPiece = true;
            else LastPiece = false;
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668332
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZiv, скажите, пожалуйста, вам какой код приятнее читать? (для меня это в разы важнее, чем замена if на определение булевой переменной).

Вот мой кусок кода гораздо легче читать, чем твой.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668356
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Ты лучше расскажи зачем создаёшь лямбду и тут же её вызываешь (там где fill array), при этом ничего не возвращая?
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668387
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZAlekseySQL,

Ты лучше расскажи зачем создаёшь лямбду и тут же её вызываешь (там где fill array), при этом ничего не возвращая?

Вот! Наконец- то кто- то по теме пишет!

Я это делаю для разбиения на подзадачи. Ведь по логике каждая функция должна выполнять только одну смысловую задачу и при отсутствии лямбда- выражений придется создать зоопарк маленьких функций или отступиться от правила единичности смысловой нагрузки.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668389
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivВот мой кусок кода гораздо легче читать, чем твой.

Меня наверно всем форумом решили потроллить этим if-ом.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668393
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLNekZAlekseySQL,

Ты лучше расскажи зачем создаёшь лямбду и тут же её вызываешь (там где fill array), при этом ничего не возвращая?

Вот! Наконец- то кто- то по теме пишет!

Я это делаю для разбиения на подзадачи. Ведь по логике каждая функция должна выполнять только одну смысловую задачу и при отсутствии лямбда- выражений придется создать зоопарк маленьких функций или отступиться от правила единичности смысловой нагрузки.
Ну ты комментарий воткни, вот и "подзадача", и "отдельная смысловая единица":
Код: plaintext
1.
2.
3.
//--------------
..."подзадача"
//--------------
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39668395
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня после последнего лямбда- выражения не хватает круглых скобок :)
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39669167
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLNekZAlekseySQL,

Ты лучше расскажи зачем создаёшь лямбду и тут же её вызываешь (там где fill array), при этом ничего не возвращая?

Вот! Наконец- то кто- то по теме пишет!

Я это делаю для разбиения на подзадачи. Ведь по логике каждая функция должна выполнять только одну смысловую задачу и при отсутствии лямбда- выражений придется создать зоопарк маленьких функций или отступиться от правила единичности смысловой нагрузки.это делается не так.
есть такой метод (фаулер) рефакторинга - выделение метода. берешь какое-то выражение, например то, что стоит в if и выносишь в приватную фукнцию.
такая процедура - кирпичик рефакторинга. потом выделяешь класс и т.д. с лямбдами не получится потом рефакторить. (тут важно то, что сделав это, ты увидишь дальнейшие возможности рефакторинга, сократишь другие функции и т.д. а нагородив лямбд ты увидишь винегет, также лямбды не сможешь использоавть из других функций.)

блоки можно выделить просто фигурными скобками.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39669169
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияНу ты комментарий воткни, вот и "подзадача", и "отдельная смысловая единица":
Код: plaintext
1.
2.
3.
//--------------
..."подзадача"
//--------------

попахивает.. надо это вынести в функцию и назвать ее так, чтобы коментарий был не нужен. когда ты пишешь код, и у тебя возникает желаение написать комантарий, значит код не понятен. нужно изменить названия переменных, вынести какие-то части кода в фукнции и т.д. чтобы код сам себя описал лучше чем человеческий язык. (напимер выражение a+b описывает себя лучше чем к а прибавляем бэ .)
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39669176
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black...надо это вынести в функцию и...
Ну и смысл, если код используется однократно?
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39670148
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасияalexy_black...надо это вынести в функцию и...
Ну и смысл, если код используется однократно?фаулер об этом хорошо пишет.

есть несколько профитов.
1. возможно и не однакратно. то есть ты можешь потом внезапно обнаружить что код дублировался.
2. где-то может быть похожий код. тогда чуть чуть модифицируешь функцию, чтобы она была более общей, и реюзаешь.
3. в будущем может быть зареюзано.
4. выделяется в логический блок, у которого есть навзание. смотря на заголовок класса, ты видишь сколько и какие у него логические блоки.
5. верхнеуровневые функции состоят из логических блоков с интуинтивными названиями. этого не так в случаи лямбд потому что эти блоки определяются прямо в функции. также потому что есть соблазн засунуть все в замыкание.
6. легче сосредоточится на отдельным куске с названием. ты просто видишь что нужно сделать в названии и видишь что это можно достичь более опитмальным способом или видишь что при некоторых условиях не достигается результат.
7. потом рефакторинг продолжается. например ты понимаешь что нужно класс разделить на два. тогда это просто выполняется переносом метода.

этих целей не достичь лямбдами.
...
Рейтинг: 0 / 0
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
    #39670445
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexy_black, спасибо!

Прочитал Роберта Мартина "Чистый код" и пришел к выводу, что лямбды в этом случае- зло. Как я понял из его книги действительно надо разбивать код на мелкие подзадачи, но оформлять их в виде отдельных функций, чтобы упростить чтение кода (не читать "кишки"). А лямбда- выражения как раз эти "кишки" вываливают наружу.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужно ли маленькие подзадачки оформлять в качестве лямбд?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]