crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Упрощение кода, написание того или иного кода более понятно и просто
AD
  опции профиля:
сообщение 5.8.2008, 16:26
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Собственно предлагаю сюда задавать и выкладывать куски кода (с пояснениями, конечно, что этот код делает) для того, чтобы помогли его ну как упростить, сделать более читабельным. Возможно, кому-то это поможет.

Если разрешите, то могу начать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 18:46
Сообщение #2


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


ну вот у меня такая дилема. Нижеприведенный код показывает в дереве (QTreeWidget'e) содержимое определенной папки методом рекурсии, однако состоит это дело из двух функций, и мне почему-то кажется что можно это как-то сделать и через одну функцию:
код
void ProjectView::createItems(const QDir &dir) { //параметром является нужная директория

     QStringList listDirs = dir.entryList(QDir::Dirs);

     foreach(QString dirname, listDirs) {
                               if(dirname == "." || dirname == "..") continue;
                               curItem = new QTreeWidgetItem(rootItem); //curItem и rootItem объявлены в классе ранее
                               curItem->setText(0, dirname);                    //rootItem является главным итемом, к нему
                               curItem->setIcon(0, folderIcon);                 //присоединяются все остальные
                               startDir(QDir(dir.absoluteFilePath(dirname)), curItem); //curItem -  просто единый указатель
     }                                                                                     //использующийся для создания всех итемов


     QStringList listFiles = dir.entryList(QDir::Files);

     foreach(QString file, listFiles) {
                               curItem = new QTreeWidgetItem(rootItem);
                               curItem->setData(0, Qt::UserRole, QVariant(dir.absolutePath() + "/" + file));
                               curItem->setText(0, file);
                               curItem->setText(1, dir.absoluteFilePath(file));
                               curItem->setIcon(0, fileIcon);
                               //curItem->setFlags(...);
     }
}
void ProjectView::startDir(const QDir& dir, QTreeWidgetItem *parent) { //рекурсивная функция
     QStringList listFiles = dir.entryList(QDir::Files);
     foreach(QString filename, listFiles) {
                               curItem = new QTreeWidgetItem(parent);
                               curItem->setData(0, Qt::UserRole, QVariant(dir.absolutePath() + "/" + filename));
                               curItem->setText(0, filename);
                               curItem->setText(1, dir.absoluteFilePath(filename));
                               curItem->setIcon(0, fileIcon);
     }

     QStringList listDirs = dir.entryList(QDir::Dirs);
     foreach(QString subdir, listDirs) {
                               if(subdir == "." || subdir == "..") continue;
                               curItem = new QTreeWidgetItem(parent);
                               curItem->setText(0, subdir);
                               curItem->setIcon(0, folderIcon);
                               startDir(QDir(dir.absoluteFilePath(subdir)), curItem);
     }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.8.2008, 21:59
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну я дуаю ты сам мог бы догадаться, если бы был внимательней.
Не нужно два цикла, вместо entryList используй entryInfoList в и foreach получай QFileInfo с помощью которого ты можешь узнать файл это или директория (isFile или isDir).

Ну а как потянешь за эту ниточку, остальное думаю наложится, если не будет понятно что-то спрашивай.

p.s. как сделаешь код здесь выложи, чтобы покритиковали если будет что. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.8.2008, 22:21
Сообщение #4


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


ViGOur, насчет entryInfoList я знал, просто мне казалось что так нагляднее. А так - пока что повозиться с этим кодом нет времени и свободных рук :) просто для начала сделал попроще и нагляднее, а потом уже можно будет как-нибудь оптимизировать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 6.8.2008, 11:59
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


void ProjectView::AddDirs(const QDir & Dir, QTreeWidget * pParent)
{
    QStringList DirsList = Dir.entryList(QDir::Dirs);
    foreach(QString Dirname, DirsList)
    {
        if(Dirname == "." || Dirname == "..")
            continue;
      
        QTreeWidget * pItem = new QTreeWidgetItem(pParent);              
        pItem->setText(0, dirname);                          
        pItem->setIcon(0, folderIcon);                        
        StartDir(QDir(dir.absoluteFilePath(dirname)), pItem);  
    }                                                                                
}

void ProjectView::AddFiles(const QDir & Dir, QTreeWidgetItem * pParent)
{
    QStringList FilesList = Dir.entryList(QDir::Files);

    foreach(QString File, FilesList)
    {
        QTreeWidget * pItem = new QTreeWidgetItem(pParent);
        pItem->setData(0, Qt::UserRole, QVariant(Dir.absolutePath() + "/" + File));
        pItem->setText(0, File);
        pItem->setText(1, Dir.absoluteFilePath(file));
        pItem->setIcon(0, fileIcon);
    }
}

void ProjectView::CreateItems(const QDir & Dir)
{
    AddDirs(Dir, rootItem);
    AddFiles(Dir, rootItem);
}

void ProjectView::StartDir(const QDir & Dir, QTreeWidgetItem * pParent)
{
    AddFiles(Dir, pParent);
    AddDirs(Dir, pParent);
}


Сообщение отредактировал Red Devil - 6.8.2008, 12:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.8.2008, 12:49
Сообщение #6


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


упростил однако :) из двух функций сделал четыре :)
хотя так оно конечно возможно понятнее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.8.2008, 14:22
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


void createItems(const QDir &dir, QTreeWidgetItem *parent = 0)
{

    QFileInfoList fiList = dir.entryInfoList();

    foreach(QFileInfo fi, fiList)
    {
        QTreeWidgetItem *curItem = 0;
        if( fi.isDir())
        {
            QString szDirName = fi.fileName();
            if( szDirName=="." || szDirName=="..")
                continue;

            curItem = new QTreeWidgetItem(parent);
            curItem->setText(0, szDirName);
            curItem->setIcon(0, folderIcon);
            
            createItems( fi.absoluteFilePath(), curItem);
        }
        else if( fi.isFile())
        {
            QString szFileName = fi.fileName();
            curItem = new QTreeWidgetItem(parent);
            curItem->setData(0, Qt::UserRole, QVariant(dir.absolutePath() + "/" + szFileName));
            curItem->setText(0, szFileName);
            curItem->setText(1, dir.absoluteFilePath(szFileName));
            curItem->setIcon(0, fileIcon);
        }
    }
}


Вызывается так:
createItems( QDir( "c:\\temp\\"), rootItem);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.8.2008, 17:26
Сообщение #8


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


ViGOur, спасибо! примерно такое у меня и вертелось в голове, только никак не мог выразить это в коде :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 7.8.2008, 8:09
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


2 ViGOur
Я бы всё таки выделил из этого кода функции создания итема для файла и для директории. Тогда код получается максимально наглядный и все занимаются своим делом:
QTreeWidgetItem* createDirItem(QTreeWidgetItem& parent, const QFileInfo& fi);
QTreeWidgetItem* createFileItem(QTreeWidgetItem& parent, const QFileInfo& fi);
void createItems(const QDir &dir, QTreeWidgetItem *parent = 0) {

    QFileInfoList fiList = dir.entryInfoList();

    foreach(QFileInfo fi, fiList)
    {
        QTreeWidgetItem *curItem = 0;
        if( fi.isDir())
        {
            QString szDirName = fi.fileName();
            if( szDirName=="." || szDirName=="..")
                continue;

            createItems(fi.absoluteFilePath(), createDirItem(*parent, fi));
        }
        else if( fi.isFile())
        {
            createFileItem(*parent, fi);
        }
    }
}


Сообщение отредактировал Tonal - 7.8.2008, 8:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 7.8.2008, 8:27
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Tonal @ 7.8.2008, 9:09) *
Я бы всё таки выделил из этого кода функции создания итема для файла и для директории
Согласен, так как могут понадобится дополнительные манипуляции с папками и файлами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 21:34