Здравствуйте, Sinclair, Вы писали:
S>Гм. Ты не мог бы показать, как именно это сделать? Причем желательно, чтобы iterate() не зависел от TreeNode.
кстати, код ниже, ИМХО, лучше чем версия с мульти итератором хотябы тем, что не пораждает столькоже итераторов сколько ветвей у дерева. ну и позволяет частичную итерацию (достаточно бросить исключение в Closure или завести возвращаемое значение + флажок).
public class TestTree {
public static interface Closure<T> {
public void execute(T object);
}
public static interface Predicate<T> {
public boolean evaluate(T object);
}
public static interface Iterator<T> {
public void iterate(Closure<T> closure, Predicate<T> predicate);
}
public static class TreeNode implements Iterator<TreeNode> {
private List<TreeNode> children = new ArrayList<TreeNode>();
public void iterate(Closure<TreeNode> closure, Predicate<TreeNode> predicate) {
if (predicate.evaluate(this)) closure.execute(this);
for (TreeNode child : children) child.iterate(closure, predicate);
}
}
public static <T> void iterateSorted(Iterator<T> iterator, Closure<T> closure, Predicate<T> predicate, Comparator<T> comparator) {
final List<T> temp = new ArrayList<T>();
iterator.iterate(new Closure<T>() { public void execute(T object) { temp.add(object); } }, predicate);
Collections.sort(temp, comparator); for (T node : temp) closure.execute(node);
}
public static void main(String [] args) {
iterateSorted(
new TreeNode(),
new Closure<TreeNode>() {
public void execute(TreeNode object) { System.out.println(object); }
},
new Predicate<TreeNode>() {
public boolean evaluate(TreeNode object) { return object != null; }
},
new Comparator<TreeNode>() {
public int compare(TreeNode x, TreeNode y) { return 0; }
});
}
}
S>Ок. Нельзя ли продемонстрировать применение такого механизма для выдачи, допустим, хотя бы тех же листьев дерева, отобранных по условию?
примерно также как код выше, только предикаты, замыкания и всякие утилиты там уже есть (правда называются немного подругому и чуть более обобщенные). т.е. достаточно пяти строчек кода, определяющий сам TreeNode.
Здравствуйте, Sinclair, Вы писали:
S>Прекрасная идея. В отличие от тупикового пути с замыканиями. S>Есть только одно "но": в отличие от дотнетной, эта реализация не "ленивая". Т.е. первое же обращение к Tree.getRoot().getAllChildren() приведет к почти полному обходу дерева — кроме листьев. Прелесть yield в том, что он исполняется по мере необходимости. К примеру, если я делаю CollectionHelper.Find(Tree.Root.AllChildren, ...), то обход прекратится сразу же, как только я найду нужный элемент.
К сожалению нет возможности узнать как внутренне реализован yeild и что внутри происходит, может просто весь стек рекурсии просто запрятан в недрах дотнета?. Насчет ленивой реализации, т.е. сделать так, чтобы итераторы добавлялись по мере исчерпания предыдущего, надо подумать выход должен быть, не такой простой конечно как в .Net.
Здравствуйте, Azix, Вы писали:
A>Понятия не имею, что там гоаорят, но знаю — ВСЕ ЭТО РАБОТАЕТ, ОСНОВАНО НА Shared Source CLI Release (у MS тоже исходные коды выкладываются, иногда , основано на стандартах и спонсировано Novell. A>Можно даже на сайте посмотреть список крупных корпоративных проектов, написанных на кросс-платформенной версии .Net. A>Не думаю, что Java может предложить что-то похожее.
Здравствуйте, Loafer, Вы писали:
L>Здравствуйте, Azix, Вы писали:
A>>Понятия не имею, что там гоаорят, но знаю — ВСЕ ЭТО РАБОТАЕТ, ОСНОВАНО НА Shared Source CLI Release (у MS тоже исходные коды выкладываются, иногда , основано на стандартах и спонсировано Novell. A>>Можно даже на сайте посмотреть список крупных корпоративных проектов, написанных на кросс-платформенной версии .Net. A>>Не думаю, что Java может предложить что-то похожее.
L>Ebay подойдет?
Здравствуйте, Azix, Вы писали:
A>Здравствуйте, Loafer, Вы писали:
L>>Здравствуйте, Azix, Вы писали:
A>>>Понятия не имею, что там гоаорят, но знаю — ВСЕ ЭТО РАБОТАЕТ, ОСНОВАНО НА Shared Source CLI Release (у MS тоже исходные коды выкладываются, иногда , основано на стандартах и спонсировано Novell. A>>>Можно даже на сайте посмотреть список крупных корпоративных проектов, написанных на кросс-платформенной версии .Net. A>>>Не думаю, что Java может предложить что-то похожее.
L>>Ebay подойдет?
A>Тогда просто миру не был доступен .Net.
Здравствуйте, Cyberax, Вы писали:
C>Azix wrote:
>> Понятия не имею, что там гоаорят, но знаю — ВСЕ ЭТО РАБОТАЕТ, ОСНОВАНО >> НА Shared Source CLI Release
C>Из shared source там нет ни строчки кода — лицензия на shared source не C>позволяет. Mono'деятели все переписали с ноля.
CLI — стандартизирована и открыта, это означает то, что любой может реализовать ее. Microsoft открыла свою реализацию CLI, которая, кстати компилируется и работает не только под Windows, но еще и под FreeBSD.
Здравствуйте, Loafer, Вы писали: L>К сожалению нет возможности узнать как внутренне реализован yeild и что внутри происходит, может просто весь стек рекурсии просто запрятан в недрах дотнета?.
Да, конечно. Почему же нет? Смотришь рефлектором и все видишь. L> Насчет ленивой реализации, т.е. сделать так, чтобы итераторы добавлялись по мере исчерпания предыдущего, надо подумать выход должен быть, не такой простой конечно как в .Net.
Конечно же есть. Я же говорю — вместо каждого метода, возвращающего IEnumerable<T>, придется реализовать два класса. Просто сишарп это делает автоматически.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, n0name2, Вы писали:
N>Здравствуйте, Sinclair, Вы писали:
S>>Гм. Ты не мог бы показать, как именно это сделать? Причем желательно, чтобы iterate() не зависел от TreeNode.
N>кстати, код ниже, ИМХО, лучше чем версия с мульти итератором хотябы тем, что не пораждает столькоже итераторов сколько ветвей у дерева. ну и позволяет частичную итерацию (достаточно бросить исключение в Closure или завести возвращаемое значение + флажок).
Ну да, несколько лучше. Но видишь ли в чем дело, тут у нас начинается фатальная негибкость. В принципе, можно получить похожую функциональность при помощи комбинирования замыканий.
Ты пошел по неверному пути, пытаясь сразу получить все возможные комбинации. К примеру, метод iterateSorted — неудачен, поскольку требует передать сразу все. А если нам не надо сортировку, а только фильтрацию?
S>>Ок. Нельзя ли продемонстрировать применение такого механизма для выдачи, допустим, хотя бы тех же листьев дерева, отобранных по условию?
N>примерно также как код выше, только предикаты, замыкания и всякие утилиты там уже есть (правда называются немного подругому и чуть более обобщенные). т.е. достаточно пяти строчек кода, определяющий сам TreeNode.
Ну вот мне и хотелось бы посмотреть на эти пять строчек. Хочу понять, что я теряю, не используя Java.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Loafer, Вы писали:
L>Здравствуйте, Azix, Вы писали:
A>>Здравствуйте, Loafer, Вы писали:
L>>>Здравствуйте, Azix, Вы писали:
A>>>>Понятия не имею, что там гоаорят, но знаю — ВСЕ ЭТО РАБОТАЕТ, ОСНОВАНО НА Shared Source CLI Release (у MS тоже исходные коды выкладываются, иногда , основано на стандартах и спонсировано Novell. A>>>>Можно даже на сайте посмотреть список крупных корпоративных проектов, написанных на кросс-платформенной версии .Net. A>>>>Не думаю, что Java может предложить что-то похожее.
L>>>Ebay подойдет?
A>>Тогда просто миру не был доступен .Net.
И о чем это говорит? О том, что кто-то выбрал Java? Ну это нормально, а что же теперь? Все должны разом перебегать на .Net?
Ну выбрали они Java — может денег сэкономили, может c Microsof'ом не дружат, может Solaris любят.
2005 год почти кончился, а вот это 2006-ой (будущее)!
бедный админы новела, мне их жаль искренне. серьезная контора никогда не будет вкладывать деньги в разработку софта базовая платформа которого может исчезнуть в любой момент по мановению Билли.
а release notes этого чуда смотрели? почитайте — страшно становится ну и там FAQ
Do you fear that Microsoft will change the spec and render Mono useless?
...
Even if changes happened in the platform which were undocumented, the existing platform would a value on its own.
Azix wrote:
> C>Из shared source там нет ни строчки кода — лицензия на shared source не > C>позволяет. Mono'деятели все переписали с ноля. > CLI — стандартизирована и открыта, это означает то, что любой может > реализовать ее.
Я не спорю, именно это и сделали Mono'иды.
> Microsoft открыла свою реализацию CLI, которая, кстати компилируется и > работает не только под Windows, но еще и под FreeBSD.
А вот тут уже не совсем все так — лицензия на Rotor не позволяет
использовать его в коммерческих целях.
Здравствуйте, Sinclair, Вы писали:
S>Ну да, несколько лучше. Но видишь ли в чем дело, тут у нас начинается фатальная негибкость. В принципе, можно получить похожую функциональность при помощи комбинирования замыканий.
угу, так и делается. еще можно предикаты и компараторы комбинировать.
S>Ты пошел по неверному пути, пытаясь сразу получить все возможные комбинации. К примеру, метод iterateSorted — неудачен, поскольку требует передать сразу все. А если нам не надо сортировку, а только фильтрацию?
если сортировку ненадо, то просто вызываем метод iterate() у TreeNode. короче — все это уже вопрос дизайна API, можно его долго вылизывать чтобы был супер удобным, но yield тебя от этого не избавит.
S>Ну вот мне и хотелось бы посмотреть на эти пять строчек. Хочу понять, что я теряю, не используя Java.
с т.з. итераторов — точно ничего не теряешь, JGA переделывается на C# почти без изменений. например, вот такой код обойдет только уникальные ветви дерева сразу за которыми идут повторяющиеся ветви (т.е. из ветвей 1, 2, 3, 3, 4, 5, 5, 6, 6, 7 будут обходится только 3, 5, 6). closure будет вызвана для поддерева вне зависимости от результата предиката.
import java.util.*;
import net.sf.jga.fn.*;
import static net.sf.jga.util.Iterables.*;
import static net.sf.jga.util.Algorithms.*;
public class Test {
public static <T> Iterable<T> iterable(final Iterator<T> iterator) {
return new Iterable<T>() { public Iterator<T> iterator() { return iterator; } };
}
public static class TreeNode extends BinaryFunctor<UnaryFunctor<TreeNode, Boolean>, UnaryPredicate<TreeNode>, Boolean> {
private Collection<TreeNode> children = new ArrayList<TreeNode>();
public Boolean fn(UnaryFunctor<TreeNode, Boolean> closure, UnaryPredicate<TreeNode> predicate) {
for (TreeNode child : unique(iterable(findAdjacent(children)))) child.fn(closure, predicate);
return predicate.fn(this) && closure.fn(this);
}
}
}
Коллега.
Фанатизм никого не красит.
В Java без делегатов — плохо. Ну плохо. Можно жить, но все равно плохо. И никуда от этого не деться.
И доп. настройки GC в .net ввести все-таки заметно проще, чем делегаты в Java (Хотя лично мне они до одного места). Собственно, история с шаблонами в этом плане очень показательна.
Ну некрасивая это позиция "раз в наш супер-пупер открытый и настраиваемый язык этого не ввели, значит это никому не нужно". Другое это значит.
А по поводу Hibernate — штука знатная. И вообще — многое в Java внушает уважение ("Давно тут сидим" (с)). Но вот Asp.Net в наше время ни Java-е, ни кому-либо еще, противопоставить откровенно нечего. Разные весовые категории просто. А этот рынок сейчас едва ли не самый серьезный.
Вообще — M$ — монстр. Во всех смыслах, и плохих и хороших. Сильную штуку сделали.
Здравствуйте, mrozov, Вы писали:
M>В Java без делегатов — плохо. Ну плохо. Можно жить, но все равно плохо. И никуда от этого не деться.
расскажи чем делегат лучше чем анонимный класс? ну чемже?
new Comparator<A>() {
public int compare(A a, A b) { return 0; }
}
вот и делегат.
M>И доп. настройки GC в .net ввести все-таки заметно проще, чем делегаты в Java (Хотя лично мне они до одного места). Собственно, история с шаблонами в этом плане очень показательна.
а что, собственно, с шаблонами, кстати? настройки ЖЦ зря вам до одного места, оч полезная штука. хотя, конечно если простейшие формы лобать то не нужно это все.
M>Ну некрасивая это позиция "раз в наш супер-пупер открытый и настраиваемый язык этого не ввели, значит это никому не нужно". Другое это значит.
позиция — давайте в язык пришащим все что сможем придумать мне тожне не нравится — получится помойка.
M>А по поводу Hibernate — штука знатная. И вообще — многое в Java внушает уважение ("Давно тут сидим" (с)). Но вот Asp.Net в наше время ни Java-е, ни кому-либо еще, противопоставить откровенно нечего. Разные весовые категории просто. А этот рынок сейчас едва ли не самый серьезный.
кстати, лично я Hibernate совсем не уважаю и вообще большого смысла в ORM не вижу, но не суть. чем ваш хваленый ASP.NET лучше BEA WebLogic + нормальный IDE (хотябы даже бесплатный Eclipse с плагинами)? как раз в области web в Java есть столько всего — огромное кол-во веб серверов на все случаи жизни, огромное кол-во MVC frameworks на любой вкус, редакторы WISIWYG в т.ч. JavaScriptа, хитрые компоненты которые можно вставлять в страницы, поддержка AJAX... ИМХО, как раз ASP.NET ни в какое сравнение не идет с тем что дает Java.
mrozov wrote:
> Но вот Asp.Net в наше время ни Java-е, ни кому-либо еще, > противопоставить откровенно нечего. Разные весовые категории просто. А > этот рынок сейчас едва ли не самый серьезный.
Здравствуйте, mrozov, Вы писали: M>Но вот Asp.Net в наше время ни Java-е, ни кому-либо еще, противопоставить откровенно нечего. Разные весовые категории просто. А этот рынок сейчас едва ли не самый серьезный.
M>Вообще — M$ — монстр. Во всех смыслах, и плохих и хороших. Сильную штуку сделали.
Отсутствие знаний никого не красит. Смотреть Tapestry/JSF/Wicket
N>расскажи чем делегат лучше чем анонимный класс? ну чемже?
1. Компактностью.
2. Логичностью.
N>вот и делегат.
воти оверхед
N>а что, собственно, с шаблонами, кстати? настройки ЖЦ зря вам до одного места, оч полезная штука. хотя, конечно если простейшие формы лобать то не нужно это все.
С шаблонами — введение без изменения виртуальной машины. компромиссное решение. Тяжело уже в Java вводить что-то новое — по понятным причинам.
Да нет, не зря. Ровно по тем же причинам, по которым мне не зря написание своего варианта управления процесссами.
N>позиция — давайте в язык пришащим все что сможем придумать мне тожне не нравится — получится помойка.
Именно. Хороший пример — анонимные классы.
N>кстати, лично я Hibernate совсем не уважаю и вообще большого смысла в ORM не вижу,
о-о-о-о.
>Nно не суть. чем ваш хваленый ASP.NET лучше BEA WebLogic + нормальный IDE (хотябы даже бесплатный Eclipse с плагинами)? как раз в области web в Java есть столько всего — огромное кол-во веб серверов на все случаи жизни, огромное кол-во MVC frameworks на любой вкус, редакторы WISIWYG в т.ч. JavaScriptа, хитрые компоненты которые можно вставлять в страницы, поддержка AJAX... ИМХО, как раз ASP.NET ни в какое сравнение не идет с тем что дает Java.