Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Результат поиска файлов |
Философия, технологии, алгоритмы! |
|
Опции темы |
31.08.2013, 08:01 | #1 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Результат поиска файлов
Вообщем есть класс (программа на Java) который рекурсивно ищет файлы на диске. Внутри класса есть переменная типа Список, в которую, внутри функции поиска заноситься результат.
Теперь вопрос: это нормальная практика, или лучше сделать что-бы функция возвращала например список, который добавлялся к списку на более высоком уровне. В результате мы получили бы список который является объединением результатов поиска на всех уровнях. |
31.08.2013, 11:03 | #2 |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
если у тебя поиск осуществляет конструктор, то хранить результаты в экземпляре класса (объекте) - логично и допустимо.
если какая то функция ("простой" метод), то уже крайне криво. поскольку придумать примеров когда последовательные вызовы испортят результаты предыдущей работы функции можно вагон и маленькую тележку. |
31.08.2013, 11:16 | #3 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Spectator, т.е. поиск должен происходить следующим образом.
1. Создаю класс. Хотя можно метод Search сделать статическим. 2. Вызываю метод Search, который в начале работы очищает список с результатами. 3. Внутри метода, есть функция поиска файлов FindFiles. 4. По мере нахождения, файлов FindFiles потихоньку пишет, данные в мой список. 5. На выходе, Search возрвращает список. Верный ход мыслей? |
31.08.2013, 12:04 | #4 |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Hopkroft, не совсем.
создаешь класс, в нем делаешь единственный конструктор, который принимает параметр - путь. создаешь метод, делаешь его приватным и вызываешь только из этого конструктора, Search ИЛИ FindFiles, который делает всю работу - и очищает и заполняет список. таким образом после создания (конструирования) объекта у тебя уже будет готовый список файлов, НЕИЗМЕННЫЙ, до тех пор пока ты ЯВНО его не уничтожишь и не создашь заново, что будет достаточно заметным кодом чтобы его не заметить при отладке. нечто вроде того что ты и написал но вместо пары методов Search / FindFiles - конструктор / метод FindFiles |
31.08.2013, 12:35 | #5 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Spectator, т.е. получается что-бы найти файл, мне придётся каждый раз создавать объект для поиска?
Я думал, мне будет достаточно создать объект в начале, а потом уже использовать его метод для поиска файлов. Ну или сделать метод статичным, что-бы мог пользоваться им без создания объекта. |
31.08.2013, 13:30 | #6 |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
Мысль не доведена до логического завершения: список нужно передавать в функцию поиска. Примерно вот так:
Код:
private void actuallyFindFiles(Path dir, List<Path> found) { ... for (Path path : myfiles) { found.add(path); } ... for (Path subdir : subdirectories) { actuallyFindFiles(subdir, found); } } public List<Path> findFiles(Path dir) { List<Path> found = new ArrayList<>(); actuallyFindFiles(dir, found); return found; } Последний раз редактировалось silly; 31.08.2013 в 14:50. Причина: лучше бы я псевдокодом писал… |
31.08.2013, 13:48 | #7 | |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
Если тебя такой вариант не устраивает - воспользуйся тем что предлагает silly Но так как ты предлагаешь - не делай. Это криво и раньше или позже выйдет боком. _И_ хранить результат поиска в классе _И_ хранить результат поиска в какой то глобальной переменной - плохо. |
|
01.09.2013, 20:07 | #10 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Мой посыл был в том, что зачем городить класс, когда функции более чем достаточно. Другими словами, silly, привел самое лаконичное решение имхо. Я бы еще вместо двух ф-ций, перегрузил одну, пускай будет публичной, пользователь сам решит какой вариант ему использовать в каждом конкретном случае, будет еще гибче. Под ООПностью понимал создание класса, так как далек от мира Java, не знаю является ли функция в этом языке объектом или нет.
|
01.09.2013, 20:23 | #11 |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
тема не об этом совершенно, это флуд, это раз.
класс городить потому что это Java, в ней нет понятия "просто функция" или "глобальная функция". точка входа в программу находится в методе класса унаследованного от системного, весь остальной код - тоже внутри классов. на что тебе Hopkroft и намекал: Или на Яве без ООП можно написать? чтобы ты не умничал, если не разбираешься в принципе в языке, о котором идет речь. |
02.09.2013, 00:06 | #12 | ||
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Цитата:
Цитата:
Так это же интересно, разобраться. В спорах истина рождается. |
||
02.09.2013, 10:46 | #13 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
manifest, согласен что статический метод это выход, т.к. например не нужно создавать экземпляр класса. Но засада в том, что к сожалению IMHO из статического, нельзя вызывать нестатический. Поэтому я спросил, про создания экземпляра класса, т.е. объекта.
|
02.09.2013, 11:44 | #14 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
А для чего может понадобиться вызывать из статического метода не статический?
|
02.09.2013, 12:02 | #15 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Напимер в примере от Silly, findFiles вызывает actuallyFindFiles. Если findFiles сделать статическим он не сможет вызывать actuallyFindFiles. А если сделать не статическим, то уже подавай, экземпляр класса.
Честно сказать, я не думаю что мы ухудшим читаемость если создадим объект и воспользуемся его методом. |
02.09.2013, 12:04 | #16 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Чтобы было понятнее о чем говорю, переписал пример silly.
Код:
public class Example { public static List<Path> findFiles(Path dir) { return findFiles(dir, new ArrayList<>()); } public static List<Path> findFiles(Path dir, List<Path> acc) { ... for(Path fp : files) acc.add(fp); ... for(Path dp : subdirectories) ListUtils.union(acc, findFiles(dp, acc)); return acc; } } |
02.09.2013, 12:29 | #17 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
manifest, думаю пойдёт как вариант.
У меня тут один вопрос, если папка окажется недоступной, например системной. Пользователя нужно как-то об этом известить exception кинуть, или её просто не выводить в списке найденных. |
02.09.2013, 12:30 | #18 | |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Цитата:
|
|
02.09.2013, 12:34 | #20 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Так, это уже зависит от конкретной задачи. Как еще один возможный вариант, можно сохранять какие-либо флаги вместе с путем к файлу.
|
02.09.2013, 21:23 | #21 | |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
Цитата:
Если хочется более функциональный (в смысле, с функциями, не с процедурами) вариант, делаем вот так: Код:
public static List<Path> findFiles(Path dir) { List<Path> acc = new ArrayList<>(); ... for(Path fp : files) acc.add(fp); ... for(Path dp : subdirectories) acc = ListUtils.union(acc, findFiles(dp)); return acc; } |
|