Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужно ли маленькие подзадачки оформлять в качестве лямбд? / 22 сообщений из 22, страница 1 из 1
29.06.2018, 11:11
    #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
29.06.2018, 11:24
    #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
29.06.2018, 11:33
    #39667554
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
NekZ,
спасибо, за подсказку!

Но хочется понять: применение лямбда- выражений для маленьких подзадач это новый стиль, и те кто его не используют- (само)отверженные или же на таких товарищей смотрят как на любителей секса, стоя в гамаке на лыжах?
...
Рейтинг: 0 / 0
29.06.2018, 11:58
    #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
29.06.2018, 20:20
    #39667748
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
AlekseySQL,

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

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



Пишет ошибку, а если не оборачивать вызов MyFunc(std::move(Separator)) лямбда- выражением, то ошибки нет.
...
Рейтинг: 0 / 0
02.07.2018, 12:29
    #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
02.07.2018, 12:41
    #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
02.07.2018, 12:50
    #39668271
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
MasterZiv, скажите, пожалуйста, вам какой код приятнее читать? (для меня это в разы важнее, чем замена if на определение булевой переменной).
...
Рейтинг: 0 / 0
02.07.2018, 13:31
    #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
02.07.2018, 14:10
    #39668332
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли маленькие подзадачки оформлять в качестве лямбд?
AlekseySQLMasterZiv, скажите, пожалуйста, вам какой код приятнее читать? (для меня это в разы важнее, чем замена if на определение булевой переменной).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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