RattleInGlasses / ps_oop

0 stars 0 forks source link

Замечания по программе Persons #21

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago
template <typename Organization>
Organization const *StringToOrganizationPtr(string const &str, list<Organization> const &organizations)
{
    for (auto &org : organizations)
    {
        if (str == org.GetName())
        {
            return &org;
        }
    }
    return nullptr;
}

Тут уместнее было бы алгоритм find_if использовать. C boost.range становится вообще просто

find_if(organizations, [&](const Organization& org){
    return org.GetName() == str;
});

https://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning

alexey-malov commented 8 years ago
#include <boost/algorithm/string/join.hpp>
#include <boost/range/algorithm/transform.hpp>
#include <boost/format.hpp>

using boost::accumulate;
using boost::wformat;
using boost::adaptors::transformed;
using boost::algorithm::join;

    vector<wstring> pluginClassNames = {L"someClass1", L"somePackage.SomeClass2", ....};

    auto makeClassNameImported = [](const wstring& className){
        return (wformat(L"import %1%;\n") % className).str();
    };

    auto pluginImports = accumulate(pluginClassNames | transformed(makeClassNameImported), wstring());
    /* pluginImports - строка содержащая текст
        import someClass1;
        import somePackage.SomeClass2;
        ...
    */

    auto pluginClassNameList = join(pluginClassNames, L", ");

    /* pluginClassNameList - строка, содержащая имена классов перечисленные через запятую
    */

    /*
        В дальнейшем может использоваться для генерирования фрагментов кода вроде этого:
        package 
        {
        import someClass1;
        import somePackage.SomeClass2;

        class SomeClass
        {
            public function someMethod()
            {
                const classNames:Array = [someClass1, somePackage.SomeClass2];
            }
        }   
        }
    */
alexey-malov commented 8 years ago
someAlgorithm(
    names | filtered(IsMaleName)
          | transformed(ToUpperCase), 
    someAdditonalParametersOfTheAlgorithm);
alexey-malov commented 8 years ago
    // Диапазон элементов директории, полученный в результате рекурсивного обхода директории m_root
    auto storageContent = make_iterator_range(recursive_directory_iterator(m_root), recursive_directory_iterator());

    // Предикат, сообщающий о том. является ли элемент каталога файлом
    auto IsFile = [](directory_entry const& entry) {
        return is_regular_file(entry.status());
    };
    auto filesOnly = storageContent | filtered(IsFile);

    // Инфу о каждои файле внутри каталога помещаем в map<путь-к-файлу, состояние файла>
    transform(filesOnly, inserter(m_files, m_files.end()),
        [&rootPath](directory_entry const& entry){
        auto filePath = make_relative(rootPath, entry.path()).generic_wstring();
        return make_pair(filePath, CFileInfo());
    });
alexey-malov commented 8 years ago

CCLIMenu, пожалуй, слишком большой и переусложненный. Разбить на несколько подклассов

alexey-malov commented 8 years ago

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

alexey-malov commented 8 years ago

В классе CPerson убрать константность с переменной m_gender, т.к. она усложняет операции над людьми с использованием алгоритмов и контейнеров STL для возврата списка ссылок на результаты поиска лучше использовать transform отфильтрованного диапазона, т.к. на входе и на выходе - разные типы данных.