Ukio_G
@Ukio_G
Незамысловатый юноша.

Как правильно следует избавляться от вложенных циклов?

Всем доброго времени суток!
В благом стремлении оставить после себя аккуратный код, переписываю фрагмент чтения содержимых файлов в подкаталогах каталога:

>Католог текстур
    |
    |--> Тип текстуры (Diffuse)
    |                    |
    |                    |-->Текстура_0.dds
    |                    |-->Текстура_1.dds
    |                    |-->Текстура_N.dds
    |
    |--> Тип текстуры (Normal)
    |                    |
    |                    |-->Текстура_0.dds
    |                    |-->Текстура_1.dds
    |                    |-->Текстура_N.dds
    |
    |--> Тип текстуры (Typename)
                         |
                         |-->Текстура_0.dds
                         |-->Текстура_1.dds
                         |-->Текстура_N.dds


Написал простой код, который читает это и что-то с этим делает :

ResourcesManager::ResourcesManager(QObject *parent) : QObject(parent)
{
    QDir root(":/graphic/");
    QStringList subdirs = root.entryList(QDir::NoDotAndDotDot|QDir::AllDirs);
    qDebug() << subdirs ;
    parceAllRes(root);
}

void ResourcesManager::parceAllRes(QDir root)
{
    QDir textureSubdir(root.path()+"/textures/");
    QStringList texturesTypes = textureSubdir.entryList(QDir::NoDotAndDotDot|QDir::AllDirs);
    qDebug() << texturesTypes;

    foreach (QString textureType, texturesTypes) {
        QDir textureTypeSubdir(root.path()+"/textures/"+textureType);
        QStringList texturesType = textureTypeSubdir.entryList();
        foreach (QString textureFile, texturesType) {
            qDebug() << "Type - " << textureType << " filename - " << textureFile;
        }
    }
}


И, если честно, я не понимаю, как можно избавиться от этой не очень приятной конструкции:

foreach (QString textureType, texturesTypes) {
        QDir textureTypeSubdir(root.path()+"/textures/"+textureType);
        QStringList texturesType = textureTypeSubdir.entryList();
        foreach (QString textureFile, texturesType) {
            qDebug() << "Type - " << textureType << " filename - " << textureFile;
        }
    }


Подскажите, как распутать подобную лапшу?
По функциям разбивать? Так еще больше можно запутаться.
Может книжку какую почитать, паттерн какой тут использовать?
Сильно извиняюсь, если вопрос слишком банальный для обсуждения, и крайне благодарен всем, кто сможет подсказать вектор для мысли.
  • Вопрос задан
  • 252 просмотра
Пригласить эксперта
Ответы на вопрос 2
villiwalla
@villiwalla
HTML-верстка
Обходы каталогов даже с чтением файлов в этих каталогах лучше делать через рекурсию.
Ответ написан
@ittakir
Не вижу особой проблемы в вашем коде.
Формат путей файлов строго определен, поэтому не нужно никаких рекурсий.
Вся работа разбивается на 2 шага:
1. Определить какие типы текстур доступны.
2. Загрузить все текстуры для каждого из типов.

Я бы разбил эту логику на 2 отдельных функции. Первая возвращает список доступных типов, причем тип задается enum, а функция внутри сопоставляет текстовое название папки с enum.
QList<TextureType> getAvailableTextureTypes();

Вторая функция берет на вход тип текстуры и загружает все доступные файлы этого типа.
QList<Texture> loadTexturesForType(TextureType type);


Ну и основная функция загрузки:
QMap<TextureType, QList<Texture>> loadTextures()
{
  QMap<TextureType, QList<Texture>> result;
  for (auto type : getAvailableTextureTypes()) {
    result.insert(type, loadTexturesForType(type));
  }
  return result;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы