Старый 31.08.2013, 08:01   #1   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Результат поиска файлов

Вообщем есть класс (программа на Java) который рекурсивно ищет файлы на диске. Внутри класса есть переменная типа Список, в которую, внутри функции поиска заноситься результат.
Теперь вопрос:
это нормальная практика, или лучше сделать что-бы функция возвращала например список, который добавлялся к списку на более высоком уровне. В результате мы получили бы список который является объединением результатов поиска на всех уровнях.
  Ответить с цитированием
Старый 31.08.2013, 11:03   #2   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
если у тебя поиск осуществляет конструктор, то хранить результаты в экземпляре класса (объекте) - логично и допустимо.
если какая то функция ("простой" метод), то уже крайне криво. поскольку придумать примеров когда последовательные вызовы испортят результаты предыдущей работы функции можно вагон и маленькую тележку.
  Ответить с цитированием
Старый 31.08.2013, 11:16   #3   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Spectator, т.е. поиск должен происходить следующим образом.
1. Создаю класс. Хотя можно метод Search сделать статическим.
2. Вызываю метод Search, который в начале работы очищает список с результатами.
3. Внутри метода, есть функция поиска файлов FindFiles.
4. По мере нахождения, файлов FindFiles потихоньку пишет, данные в мой список.
5. На выходе, Search возрвращает список.
Верный ход мыслей?
  Ответить с цитированием
Старый 31.08.2013, 12:04   #4   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Hopkroft, не совсем.
создаешь класс, в нем делаешь единственный конструктор, который принимает параметр - путь.
создаешь метод, делаешь его приватным и вызываешь только из этого конструктора, Search ИЛИ FindFiles, который делает всю работу - и очищает и заполняет список.

таким образом после создания (конструирования) объекта у тебя уже будет готовый список файлов, НЕИЗМЕННЫЙ, до тех пор пока ты ЯВНО его не уничтожишь и не создашь заново, что будет достаточно заметным кодом чтобы его не заметить при отладке.

нечто вроде того что ты и написал но вместо пары методов Search / FindFiles - конструктор / метод FindFiles
  Ответить с цитированием
Старый 31.08.2013, 12:35   #5   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Spectator, т.е. получается что-бы найти файл, мне придётся каждый раз создавать объект для поиска?
Я думал, мне будет достаточно создать объект в начале, а потом уже использовать его метод для поиска файлов. Ну или сделать метод статичным, что-бы мог пользоваться им без создания объекта.
  Ответить с цитированием
Старый 31.08.2013, 13:30   #6   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Мысль не доведена до логического завершения: список нужно передавать в функцию поиска. Примерно вот так:

Код:
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   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
Spectator, т.е. получается что-бы найти файл, мне придётся каждый раз создавать объект для поиска?
да.
Если тебя такой вариант не устраивает - воспользуйся тем что предлагает silly
Но так как ты предлагаешь - не делай. Это криво и раньше или позже выйдет боком. _И_ хранить результат поиска в классе _И_ хранить результат поиска в какой то глобальной переменной - плохо.
  Ответить с цитированием
Старый 01.09.2013, 00:11   #8   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Spectator, Hopkroft, ООПите ради ООПности, господа
  Ответить с цитированием
Старый 01.09.2013, 02:11   #9   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
manifest, есть вариант лучше? Или на Яве без ООП можно написать?
  Ответить с цитированием
Старый 01.09.2013, 20:07   #10   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
manifest, есть вариант лучше? Или на Яве без ООП можно написать?
Мой посыл был в том, что зачем городить класс, когда функции более чем достаточно. Другими словами, silly, привел самое лаконичное решение имхо. Я бы еще вместо двух ф-ций, перегрузил одну, пускай будет публичной, пользователь сам решит какой вариант ему использовать в каждом конкретном случае, будет еще гибче. Под ООПностью понимал создание класса, так как далек от мира Java, не знаю является ли функция в этом языке объектом или нет.
  Ответить с цитированием
Старый 01.09.2013, 20:23   #11   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Мой посыл был в том, что зачем городить класс
тема не об этом совершенно, это флуд, это раз.
класс городить потому что это Java, в ней нет понятия "просто функция" или "глобальная функция". точка входа в программу находится в методе класса унаследованного от системного, весь остальной код - тоже внутри классов.

на что тебе Hopkroft и намекал:

Или на Яве без ООП можно написать?

чтобы ты не умничал, если не разбираешься в принципе в языке, о котором идет речь.
  Ответить с цитированием
Старый 02.09.2013, 00:06   #12   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
тема не об этом совершенно, это флуд, это раз.
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
это нормальная практика, или лучше сделать что-бы функция возвращала например список, который добавлялся к списку на более высоком уровне. В результате мы получили бы список который является объединением результатов поиска на всех уровнях.
тема как раз об этом, судя по вопросу

Цитата:
Сообщение от Spectator Посмотреть сообщение
класс городить потому что это Java, в ней нет понятия "просто функция" или "глобальная функция". точка входа в программу находится в методе класса унаследованного от системного, весь остальной код - тоже внутри классов.
Не вижу связи между вопросом топика и точкой входа и тем где находится весь остальной код. Перефразирую свое предыдущее предложение в терминах Java: "Зачем городить класс и создавать в нём еще какое-либо свойство, когда статического метода более чем достаточно? И еще раз другими словами, зачем создавать класс в классе, когда достаточно статического метода в классе?".

Цитата:
Сообщение от Spectator Посмотреть сообщение
чтобы ты не умничал, если не разбираешься в принципе в языке, о котором идет речь.
Так это же интересно, разобраться. В спорах истина рождается.
  Ответить с цитированием
Старый 02.09.2013, 10:46   #13   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
manifest, согласен что статический метод это выход, т.к. например не нужно создавать экземпляр класса. Но засада в том, что к сожалению IMHO из статического, нельзя вызывать нестатический. Поэтому я спросил, про создания экземпляра класса, т.е. объекта.
  Ответить с цитированием
Старый 02.09.2013, 11:44   #14   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
manifest, согласен что статический метод это выход, т.к. например не нужно создавать экземпляр класса. Но засада в том, что к сожалению IMHO из статического, нельзя вызывать нестатический. Поэтому я спросил, про создания экземпляра класса, т.е. объекта.
А для чего может понадобиться вызывать из статического метода не статический?
  Ответить с цитированием
Старый 02.09.2013, 12:02   #15   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Напимер в примере от Silly, findFiles вызывает actuallyFindFiles. Если findFiles сделать статическим он не сможет вызывать actuallyFindFiles. А если сделать не статическим, то уже подавай, экземпляр класса.
Честно сказать, я не думаю что мы ухудшим читаемость если создадим объект и воспользуемся его методом.
  Ответить с цитированием
Старый 02.09.2013, 12:04   #16   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Чтобы было понятнее о чем говорю, переписал пример 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

Hopkroft вне форума Не в сети
manifest, думаю пойдёт как вариант.

У меня тут один вопрос, если папка окажется недоступной, например системной. Пользователя нужно как-то об этом известить exception кинуть, или её просто не выводить в списке найденных.
  Ответить с цитированием
Старый 02.09.2013, 12:30   #18   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
Честно сказать, я не думаю что мы ухудшим читаемость если создадим объект и воспользуемся его методом.
Я конечно понимаю, что Java имеет свою философию, в которой даже элементарные вещи описываются трехэтажным кодом, и безусловно, каждый дро пишет как он хочет. Но иногда бывает полезно задачать вопрос: "А зачем я так делаю? И дает ли мне это решение какие-то плюсы?".
  Ответить с цитированием
Старый 02.09.2013, 12:33   #19   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Но иногда бывает полезно задачать вопрос: "А зачем я так делаю? И дает ли мне это решение какие-то плюсы?".
Ну вот я этим вопросом как раз и задался
  Ответить с цитированием
Старый 02.09.2013, 12:34   #20   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
manifest, думаю пойдёт как вариант.

У меня тут один вопрос, если папка окажется недоступной, например системной. Пользователя нужно как-то об этом известить exception кинуть, или её просто не выводить в списке найденных.
Так, это уже зависит от конкретной задачи. Как еще один возможный вариант, можно сохранять какие-либо флаги вместе с путем к файлу.
  Ответить с цитированием
Старый 02.09.2013, 21:23   #21   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Чтобы было понятнее о чем говорю, переписал пример silly.

Код:
ListUtils.union(acc, findFiles(dp, acc));
Вот здесь должно быть просто findFiles(dp, acc), поскольку findFiles дергается ради ее побочных эффектов (изменения acc), не для возвращаемого результата.

Если хочется более функциональный (в смысле, с функциями, не с процедурами) вариант, делаем вот так:

Код:
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;
}
Да, кстати, насчет файлов, в документации по nio нашелся метод Files.walkTree и даже пример использования есть.
  Ответить с цитированием
Старый 02.09.2013, 22:08   #22   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
silly, я так понял ты примерами из 7 jdk пользуешься (судя по Path)
а почему acc.add вместо addAll не юзаешь?
  Ответить с цитированием
Старый 02.09.2013, 22:58   #23   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
а почему acc.add вместо addAll не юзаешь?
Написал по памяти, исправлял ошибки 4 раза, больше ничего трогать не хочу.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind