|
|
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Помогите написать курсовую на Turbo Pascal ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 13:19 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
полторы Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 16:50 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
А про задание нихто и не спросил. З.Ы. Тыща четырьста пийсят и твоя пояснительная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 17:18 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
StrangerIПомогите написать курсовую на Turbo Pascal Надеюсь, тебя отчислят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 20:47 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Вот объясните мне, убогому, зачем человеков учат турбо паскалю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 22:27 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю? Не согласен. Надо спросить - зачем вообще человеков учат кодить? Предлагаю заставить их изучать бухгалтерский калькулятор "Citizen". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 22:43 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю? Наверное просто показать - что есть программирование (как философии- что есть философия): в диалекты Паскаля проще всего "въезжать" по сравнению с другими языками И Delphi этим хорош - очень быстро и просто создавать приложения простые и средней сложности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2008, 22:52 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Добиваю до 1450 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 09:44 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
AlexandrPlus DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю? Наверное просто показать - что есть программирование (как философии- что есть философия): в диалекты Паскаля проще всего "въезжать" по сравнению с другими языками И Delphi этим хорош - очень быстро и просто создавать приложения простые и средней сложности. Потому что преподы - безумно ленивые люди. И тупые к тому же. Им вбили в 80-х паскаль, вот они теперь и думают, что п - самый лучший яп в мире. Во всем мире латынью читается Си и Ява. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 10:22 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
C++ - имхо лучшее что изобрели на данный момент. бедные студенты, учат их всякой гадости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 10:30 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ЫнтырпрайзВо всем мире латынью читается Си и Ява. Вообще-то в учебниках по дискретной математике алгоритмы принято публиковать в Pascal или Modula. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 10:33 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
mayton ЫнтырпрайзВо всем мире латынью читается Си и Ява. Вообще-то в учебниках по дискретной математике алгоритмы принято публиковать в Pascal или Modula. А учебинки по обработке сигналов все на Си. А весь нормальный мир ООП выучил по Ява. А Кнут вообще на асме писал. И какие учебники? На туалетной бумаге выпущенные такими же ленивыми и тупыми преподами? Кстати любой вменяемый специалист по дискретной любую это книжонку растопчет - почитайте отзывы. Короче кури Кристофидеса для понимания идеологии. И птом ищи библиотеки алгоритмов на .NET, C, C++, Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 13:06 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайз И какие учебники? На туалетной бумаге выпущенные такими же ленивыми и тупыми преподами? Кстати любой вменяемый специалист по дискретной любую это книжонку растопчет - почитайте отзывы. Короче кури Кристофидеса для понимания идеологии. И птом ищи библиотеки алгоритмов на .NET, C, C++, Java. Ты очень забавный! Зарегился-б... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 14:01 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайз А весь нормальный мир ООП выучил по Ява. За весь мир не скажу - не знаю, а за себя, пожалуй, соглашусь. :) Хотя применял ( и применяю ) ООП в Delphi, тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Ну, не знаю, может быть, Шилдт и Ноутон так доходчиво пишут или литературу по ООП в Delphi не ту читал. Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 17:43 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Хм. У меня при изучении Java осталось исключительно изумление по поводу неоправданных ограничений. edges7Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java. Хм. Как же она могла полностью утрястись при отсутствии множественного наследования? Это не концепция, это, извиняюсь, фигня. Кстати, можно пример-другой утрясшихся вопросов, дабы как-то понять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 17:51 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer Хм. Как же она могла полностью утрястись при отсутствии множественного наследования? Это не концепция, это, извиняюсь, фигня. Если я не ошибаюсь, то это достаточно спорная технология? Хотя не отрицаю, что иногда ее применение могло бы быть оправданным. Но в руках масс-как бомба, имхо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:02 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
множественное наследование это зло. если сильно нужно можно делегированием обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:12 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
zloy denЕсли я не ошибаюсь, то это достаточно спорная технология? Спорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:13 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer Хм. У меня при изучении Java осталось исключительно изумление по поводу неоправданных ограничений. Да, соглашусь. Это не С++. softwarerХм. Как же она могла полностью утрястись при отсутствии множественного наследования? На тот момент, можно сказать, у меня была вообще полная каша по поводу ООП. И тогда это было лучшее, на мой взгляд, что я нашел по ООП. Прочитал - все разложил по полочкам. Что касается отсутствия множественного наследования. Но ведь это характерно для Java, а не для всех языков. softwarer Это не концепция, это, извиняюсь, фигня. Вы имеете в виду то, как это реализовано в Java? softwarer Кстати, можно пример-другой утрясшихся вопросов, дабы как-то понять? Возвращаемся к каше в голове. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:16 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarerСпорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило. Обиделся что downcasts не всегда прокатывают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:16 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarerСпорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило. На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой ( по крайней мере в той, в которой я смотрел). Это одна - максимум две главы. В С++, Java это существенная часть. У того же Шилдта это занимает практически четверть книги со всеми выкладками. softwarer А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило. Ну что поделаешь, если я решил изучать Java. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:31 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7 На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой ... Хотя и ООП в Delphi - это одна из сильных его сторон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:35 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7Да, соглашусь. Это не С++ Я не об этом. Вопрос не в мощи, а в том, что авторы языка действовали без головы (или, вернее, с дурной головой). Скажем, в C++ логика конструирования определяется тем, что объекты могут располагаться в стеке (и инициализироваться мусором), есть множественное наследование и необходимо обеспечить правильную работу деструкторов. В яве - множественного наследования нет, объекты всегда в динамической памяти, инициализируются нулями, а ставшие бессмысленными ограничения тем не менее аккуратно копируются из плюсов. edges7На тот момент, можно сказать, у меня была вообще полная каша по поводу ООП. И тогда это было лучшее, на мой взгляд, что я нашел по ООП. Прочитал - все разложил по полочкам. Ну скажем так, судя по этой формулировке, язык собственно не повлиял, вопрос только в удачно попавшейся литературе. edges7Что касается отсутствия множественного наследования. Но ведь это характерно для Java, а не для всех языков. Дык я просто к тому, что "изучив ООП по-явовски" даже в дельфе полноценно работать нельзя. Потому как в дельфе оно шире. И поэтому "концепцию полностью" выглядит.. самонадеянно :) maytonОбиделся что downcasts не всегда прокатывают? Да нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:41 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП. В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке. Смешивание тем из разных доменов - отвратительная привычка, приводящая к каше в голове у обучаемых. Они уже не понимают "откуда растут ноги" у тех или иных тонкостей, они не понимают, что концептуально, что - детали реализации, а что - глупость, которую надо исправлять. Они способны только заучить книгу аки библию и бездумно сыпать цитатами из нее, не умея даже их обосновать - наподобие прозвучавшего здесь "- зло". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 18:49 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП. Да. И замечательно, что такая литература есть. Но на тот момент, к сожалению, про нее просто не знал. softwarer В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке. Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :) В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 19:15 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarerДа нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект. Я надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 20:02 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :) В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход. В C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 20:06 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
maytonВ C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП.Плохо-плохо. ООП вполне самодостаточен и можно реализовать любой алгоритм не выходя за пределы классов-объектов. А когда мы за них выходим (как это слишком часто происходит в C++ и чуть реже, но бывает в Дельфях) начинается каша поддерживать которую врагу не пожелаешь. Получается тот же самый GOTO, вид сбоку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2008, 20:47 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer"Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект. подробнее можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 01:40 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Гыподробнее можно? Примерно следующая ситуация (прошу прощения за возможные синтаксические ошибки, таки не один год как бросил это дело): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Версию явы не помню, не то 1.3, не то 1.4. Работало это чудо так: делается new B(), в нем super(), вызывается doSomething(), создается someList, завершается A(), и непосредственно перед возвратом в B() выполняется someList = null. Орднунг юбер аллес, Гитлер капут, маразм форева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 02:03 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Да, это может сбить с толку. Это нужно знать, что блок инициализации выполняется после конструктора предка. И этому есть обоснование. Если написать так (а это то же самое) было бы понятнее? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И потом зачем инициализировать null'ом поле если оно и так null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 02:27 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ГыИ этому есть обоснование Любопытно было бы услышать. Правда, почти уверен, что оценю иначе. ГыЕсли написать так (а это то же самое) было бы понятнее? Понятно оно и так. Просто это концептуальная глупость. ГыИ потом зачем инициализировать null'ом поле если оно и так null? После этого и отказался от этой привычки. Хотя инициализировать - аккуратнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 02:50 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
White OwlПлохо-плохо. Что русскому хорошо, то немцу плохо K&R C тоже самодостаточен ... и машина Тьюринга Зачем ООП ??? Да и не лазейки это. Просто НЕ ООП. Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 08:22 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ? Я-бы такого никогда не сказал. Просто удивляет повсеместное экстраполирование ООП на С++. Хочется, как в монологе Жванецкого подъехать на танке и сказать - ".. а пачему собсно?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 10:09 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7 Ынтырпрайз А весь нормальный мир ООП выучил по Ява. За весь мир не скажу - не знаю, а за себя, пожалуй, соглашусь. :) Хотя применял ( и применяю ) ООП в Delphi, тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Ну, не знаю, может быть, Шилдт и Ноутон так доходчиво пишут или литературу по ООП в Delphi не ту читал. Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java. Видели бы вы студентов, которые учили ООП по турбопаскалю 5.5 в 2004 году... Ужас... Особенно когда их пересаживали на делфи.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 10:19 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer ГыИ этому есть обоснование Любопытно было бы услышать. Правда, почти уверен, что оценю иначе. Чтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть. Например чтобы проходила такая фишка: [SRC=java] class A { protected List<String> list; public A() { list = new ArrayList<String>(); list.add("one"); } @Override public String toString() { return list.toString(); } publc static void main(String[] argc) { System.out.println(new A() { { list.add("two"); } }); } } [/src] А пример Ваш надуман, потому что человек, использующий в конструкторе публичный метод, который в любой момент может быть перекрыт, а следовательно потенциально передающий часть ответственности за инициализацию экземпляра предка потомкам, подлежит публичной и позорной экзекуции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 11:09 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход. Угу, именно так. Наблюдается подход "каша". Итогом его становится прорва кодеров, кое-как заучивших, но мало что понимающих. Впрочем, объективности ради, по Delphi хороших книг тоже мало, а в большинстве наблюдается ровно такая же каша из языка, IDE и VCL. Вообще, у меня есть впечатление, что немногочисленные хорошие специалисты сейчас получаются не благодаря первым книгам, которые читали, а скорее вопреки им. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 12:25 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
maytonЯ надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию. На какую именно концепцию? На ООП? Мое отношение к ней сформировалось лет за семь до появления Явы. На "ООП в Яве"? Мм... мои взгляды, если коротко, сводятся к точке зрения "авторы этой реализации думали задницей", и этот случай действительно не изменил этих взглядов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 12:31 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть. Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней. ГыНапример чтобы проходила такая фишка: Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 12:39 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть. Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней. Например? softwarer ГыНапример чтобы проходила такая фишка: Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review. Не пройдет. Если блок инициализации запускался бы перед конструктором предка, то list был бы не проинициализирован. А почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 12:51 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Вообще здесь написано следующее: The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors. После этого становится понятно подобное поведение блока инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 13:37 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Joshua Bloch - Effective Java There are a few more restrictions that a class must obey to allow inheritance. Constructors must not invoke overridable methods, directly or indirectly. If this rule is violated, it is likely that program failure will result. The superclass constructor runs before the subclass constructor, so the overriding method in the subclass will get invoked before the subclass constructor has run. If the overriding method depends on any initialization performed by the subclass constructor, then the method will not behave as expected. To make this concrete, here's a tiny class that violates this rule: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. because the method m is invoked by the constructor Super() before the constructor Sub() has a chance to initialize the date field. Note that this program observes a final field in two different states. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 13:52 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ГыНапример? Путь, который я полагаю наиболее правильным, реализован в C++ и в Delphi, это возможность программисту явно управлять порядком инициализации. Путь, наиболее подходящий с точки зрения "минимального изменения языка" - доработать концепцию так, чтобы убрать необходимость в уродливой заплате под названием "блок инициализации", ну а инициализирующие присваивания выполнять прежде конструкторов. Наконец, учитывая интерпретирующий характер языка, в принципе можно инициализировать объекты, обходя дерево зависимостей, и ругаться, если обнаружен цикл. Правда, это имхо извращение, но зато хорошо соответствует идеологии языка. ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов? Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 14:45 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов? Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством. У меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами. Если язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 15:07 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ГыУ меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами. Это спасает код от засорения телом анонимных объектов, представляющего собой гораздо большую угрозу читабельности. Подобные "конструируемые на месте" объекты выглядят более-менее нормально в демонстрационных примерах, но когда в реале нужно инициализировать, например, пять кнопок подряд, навесив на каждую по листенеру с двумя-тремя методами, да и тела методов не из одной строки.... Это кошмар. С практической точки зрения могу назвать эмпирический критерий. Если некоторый программный код выиграет в читабельности от того, что тела подпрограмм будут разбиты пустыми строками - значит, либо этот код плохо написан, либо язык в этом месте имеет неудачный синтаксис. Вообще, как всегда забавно развитие истории по спирали. Когда-то существовало понятие вложенных, или локальных, подпрограмм. И развитие ООП шло в том числе под лозунгом "наконец-то мы можем уйти от этих жутких, нечитаемых вложенных подпрограмм к простым и ясным последовательно записанным методам объектов". После чего прошло еще несколько лет, и концепцию возродили в виде вложенных объектов, или - в C++ - локальных структур. ГыЕсли язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться? Во-первых, язык не представляет возможности писать лаконично и чисто. Ява-программы очень громоздки, и даже если в одном конкретном месте можно сэкономить несколько символов, на общем качестве кода это практически не сказывается. Во-вторых, эта возможность немасштабируема. Ей можно с незначительным выигрышем воспользоваться в маленьком и простом случае, но она приводит к отвратительным последствиям в более сложных. При такой комбинации плюсов и минусов я полагаю правильным не пользоваться ей никогда - целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 15:30 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
То есть именованный объект анонимного класса - нормально, анонимный объект именованного класса тоже, а вот вместе ни-ни? Похоже на религию. Просто у меня подход, что если на текущий момент создаваемый экземпляр не нужен нигде более я не постесняюсь применить и анонимный объект и анонимный класс. Если же я вижу, что получившаяся конструкция нечитаема (а на самом деле человеку, который мало работает с явой она просто непривычна), я ничтоже сумняшеся ее вынесу. Решать я это буду в каждом случае индивидуально. Потом, многие жалуются на засилие кодеманки, а сами же волевым решщением отбирают у человека возможность думать и принимать решение: "целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя"" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 15:49 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Есть еще один аргумент. Создавая объект как поле класса Вы гарантируемо прибиваете его жизненный цикл к жизненному циклу объекта объемлющего класса. То есть он не может быть собран пока существует экземпляр объемлющего класса. В случае анонимного объекта возможны варианты, что добавляет дополнительной гибкости и пространства для маневра сборщику мусора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 15:59 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
ГыТо есть именованный объект анонимного класса - нормально, анонимный объект именованного класса тоже, а вот вместе ни-ни? Похоже на религию. Звучит сродни "то есть пить водку - нормально, пить пиво - нормально, а вот вместе ни-ни? Похоже на религию". ГыПросто у меня подход Я понимаю и не думаю, что стоит пытаться переубедить друг друга. Просто нас это затрагивает вот по какой причине: блоки инициализации - это заплата на комбинацию двух неудачных с моей точки зрения аспектов ява-концепции: "полностью анонимных объектов" и неименованных конструкторов. Соответственно, их потребности с моей точки зрения не являются концептуально важными; напротив, если их потребности приводят к дополнительным проблемам и ограничениям - тем больше причин доработать концепцию и выкинуть эту гадость. ГыЕсли же я вижу, что получившаяся конструкция нечитаема Вопрос "читаемости" является вопросом вкусов. С моей точки зрения, эта конструкция иногда "терпима", иногда "очень плоха", но никогда не "оптимальна". Гы(а на самом деле человеку, который мало работает с явой она просто непривычна), Ой, да бросьте. Ну что здесь "непривычного", если вспомнить про существующие уже полвека лямбда-функции? ГыРешать я это буду в каждом случае индивидуально. Примерно так же Вы можете потребовать права решать в каждом случае индивидуально, использовать ли соглашение об именовании, и какое именно, итп. У всего есть своя ценность и своя цена. В том числе у унификации кода, и особенно - у унификации кода при работе в команде. Я не согласен с теми, кто полагает ценность унификации очень большой, и говорит "пусть плохо, зато по одному образцу". Я точно так же не согласен с предложением считать ее нулевой (всегда и везде решать индивидуально). Я полагаю так: там, где различия не создают значимой ценности, предпочтительна унификация; там, где унифицированный подход в некоторых случаях конкретно плох, следует решать индивидуально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 16:18 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Радикализм это признак ограниченности. В гипертрофированном случае он выливается в нередкие здесь холиворы о синтаксисе (C vs Pascal) и прочее. Есть задача и есть инструмент. Любая проблема имеет решение или workaround. (Те же неименованные конструкторы через статические порождающие методы) Если Вы используете инструмент извольте изучить его и применять правильно. Не нравится - берите другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 17:08 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
И больше всего раздражают люди приходящие со своим уставом в чужой монастырь. То есть зная один язык пытаются писать в том же стиле на другом, не соизволив в должной мере его изучить. А потом приходят в форумы и говорят: "Что-то там у них все через задницу". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2008, 17:14 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 softwarer: softwarer Когда-то существовало понятие вложенных, или локальных, подпрограмм. Локальные процедуры/функции и сейчас есть -- в Delphi. И это удобно. softwarer После чего прошло еще несколько лет, и концепцию возродили в виде вложенных объектов, или - в C++ - локальных структур. В C++ это в ограниченном виде. Методы локальной структуры не могут по-простому использовать локальные переменные охватывающей функции, то есть тяжело дотянуться до контекста. Также, локальная структура не может быть параметром шаблона -- это важно для STL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 00:56 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно. А замыкания есть в Delphi ? Или на любой Чих будет AV ? Удобно ? вряд ли. Не так сложно реализовать вложенные функции в C++ как бороться с последствиями такой реализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 07:41 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer edges7Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход. Угу, именно так. Наблюдается подход "каша". Итогом его становится прорва кодеров, кое-как заучивших, но мало что понимающих. ... Думается, что это несколько спорное утверждение. Многое зависит от способа восприятия информации. Можно читать и слепо верить в прочитанное, а можно читать, размышляя над уже прочитанным. Скажем, если некий товарищ, решая задачу, обратился к источнику, в котором его проблема описана, взял и тупо скопировал оттуда код в свое приложение - то это одно. А если прочитав, подумал, доработал решение ( т.е. ухватил идею и развил ее ), ну или хотя бы задумался над прочитанным - то это уже совсем другое. Вообщем, это я все к тому, что думать еще никто не отменял. softwarer Вообще, у меня есть впечатление, что немногочисленные хорошие специалисты сейчас получаются не благодаря первым книгам, которые читали, а скорее вопреки им. Ну да, по началу трудно соориентироваться в море литературы и на первый взгляд отделить хорошее от плохого, если разве только какой-нибудь гуру не подскажет в каком направлении двигаться. Но со временем это перестает быть проблемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 09:16 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): Gluk (Kazan) Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно. А замыкания есть в Delphi ? Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью). Gluk (Kazan) Или на любой Чих будет AV ? Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени). Если локальная процедура/функция избегает указателей, то я не вижу как можно получить access violation. А если процедура/функция работает с указателями, то тут уж не важно, локальная она или нет, риск access violation присутствует, это неизбежная плата за указатели. То есть в Delphi локальные процедуры/функции не повышают риск access violation. Gluk (Kazan) Удобно ? вряд ли. Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код. Gluk (Kazan) Не так сложно реализовать вложенные функции в C++ как бороться с последствиями такой реализации Из-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию. А там, где появился указатель, действительно и до access violation недалеко (хотя в данном случае маловероятно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 13:32 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр Седов2 Gluk (Kazan): Gluk (Kazan) Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно. А замыкания есть в Delphi ? Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью). О как o O. А Perl давно функциональным стал ??? Пётр Седов Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени). Ну и толку тогда от них ? Синдром шоколадного чайника ??? Пётр Седов Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код. Локальные функторы - это ТОЖЕ удобно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 13:48 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Гы Слушай, вот объясни пожалуйста, что ты хочешь кроме "выплеснуть раздражение". Я сказал: объектная модель Явы максимально обрезанная, а реализация плоха. Это правда. Ты мог бы оспорить, мог бы расписать список фич и начинать ставить галочки - здесь есть, здесь нет - но не стал этого делать. Вместо этого ты зацепился за одно замечание, причем скорее всего с мыслью "а вот сейчас вытащим на конкретику и раскатаем". Оказалось - действительно факт. Далее у тебя пошли такие странные посты... такое впечатление, что в тебе борятся глухое бессмысленное раздражение и желание таки быть объективным. Так или иначе, на всю конкретику я ответил. Когда сказал "можно лучше" - рассказал как. Итп. Напротив, ты, начиная речи, регулярно попадаешь пальцем в небо - сначала про обоснования, потом про "непривычность". Я пользовался этим инструментом, я знаю его достаточно, чтобы не садиться в лужу, и я считаю его плохим. Вот теперь объясни: чего ты от меня хочешь? Чтобы я им не пользовался? Я именно так и делаю: пощупал на одном проекте и не собираюсь возвращаться. Чтобы я славил его замечательность? Извини, врать очень не люблю. Чтобы я молчал в тряпочку? За этим иди на форум явы. Клянусь, я туда не захожу, и похода "приду и расскажу вам всем, как вам плохо" не планирую. А здесь у нас форум "программирование", со всеми вытекающими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 14:48 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): Gluk (Kazan) Пётр Седов Gluk (Kazan) Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно. А замыкания есть в Delphi ? Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью). О как o O. А Perl давно функциональным стал ??? Из моих слов не следует, что Perl -- функциональный язык. Но функциональный стиль ему не чужд. В Wikipedia в статье про Perl написано: Wikipedia Perl ... Overview ... Its major features include support for multiple programming paradigms (procedural, object-oriented, and functional styles), ... В отличие от Delphi, в Perl-е автоматическое управление памятью, поэтому язык может предоставить удобные замыкания. Gluk (Kazan) Пётр Седов Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени). Ну и толку тогда от них ? Синдром шоколадного чайника ??? Толк от локальных процедур/функций такой же, как от раскладывания файлов или писем по папкам -- структуризация. Она важна, когда этих процедур/функций/файлов/писем становится много. И ещё локальные процедуры/функции избавляют от возни с указателями на контекст. Gluk (Kazan) Пётр Седов Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код. Локальные функторы - это ТОЖЕ удобно :) C++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции). К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 14:53 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7Думается, что это несколько спорное утверждение. Многое зависит от способа восприятия информации. Само собой. Я здесь говорю в "статистическом" смысле. Понятно, что действительно талантливый человек достигнет многого при самом дерьмовом обучении. Вопрос в том, что получится из "толпы прочитавших". Я придерживаюсь той точки зрения, что "урок математики", "урок русского языка" и "урок физкультуры" дадут среднему ученику больше, нежели "три урока каши из первого, второго и третьего". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 15:05 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр СедовНет, ведь Delphi -- язык не функциональный (а императивный) ... Из моих слов не следует, что Perl -- функциональный язык. Странно :) Ну не следует так не следует :) Пётр Седов Но функциональный стиль ему не чужд. С++ тоже ... не чужд (в отличии от Delphi) Пётр Седов К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону). А в Delphi можно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 15:55 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
softwarer Гы Слушай, вот объясни пожалуйста, что ты хочешь кроме "выплеснуть раздражение". Я сказал: объектная модель Явы максимально обрезанная, а реализация плоха. Это правда. Ты мог бы оспорить, мог бы расписать список фич и начинать ставить галочки - здесь есть, здесь нет - но не стал этого делать. Вместо этого ты зацепился за одно замечание, причем скорее всего с мыслью "а вот сейчас вытащим на конкретику и раскатаем". Оказалось - действительно факт. Далее у тебя пошли такие странные посты... такое впечатление, что в тебе борятся глухое бессмысленное раздражение и желание таки быть объективным. Так или иначе, на всю конкретику я ответил. Когда сказал "можно лучше" - рассказал как. Итп. Напротив, ты, начиная речи, регулярно попадаешь пальцем в небо - сначала про обоснования, потом про "непривычность". Я пользовался этим инструментом, я знаю его достаточно, чтобы не садиться в лужу, и я считаю его плохим. Вот теперь объясни: чего ты от меня хочешь? Чтобы я им не пользовался? Я именно так и делаю: пощупал на одном проекте и не собираюсь возвращаться. Чтобы я славил его замечательность? Извини, врать очень не люблю. Чтобы я молчал в тряпочку? За этим иди на форум явы. Клянусь, я туда не захожу, и похода "приду и расскажу вам всем, как вам плохо" не планирую. А здесь у нас форум "программирование", со всеми вытекающими. Мое раздражение ни в коей мере не относилось к тебе. Это к тем личностям, которые подобным образом поступают. Если отнес на свой счет, зря. Ты как раз последователен и аргументацией не брезгуешь. А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс? Кстати про блок инициализации, я приводил цитату, что он всего лишь тупо вкопируется в начало каждого конструктора. Осознание этого простого факта ставит все на свои места. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 16:39 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): Gluk (Kazan) Пётр СедовНет, ведь Delphi -- язык не функциональный (а императивный) ... Из моих слов не следует, что Perl -- функциональный язык. Странно :) Ну не следует так не следует :) А что странного? Я утверждаю: Delphi -- не функциональный язык. Delphi -- императивный язык. Разве из этих утверждений следует, что Perl -- функциональный язык? Создатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью. Gluk (Kazan) Пётр Седов Но функциональный стиль ему не чужд. С++ тоже ... не чужд (в отличии от Delphi) На C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа. В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать. Gluk (Kazan) Пётр Седов К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону). А в Delphi можно ? Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 16:40 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Гы А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс? softwarer Мне кажется, что этот спор будет бесполезным, так как есть подозрения, что каждый из вас при любом его исходе все равно останется при своем мнении. P.S. "Программируйте с использованием языка, а не на языке" (с) Стив Макконнелл. Совершенный код. Глава 34.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 17:14 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
edges7 Гы А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс? softwarer Мне кажется, что этот спор будет бесполезным, так как есть подозрения, что каждый из вас при любом его исходе все равно останется при своем мнении. P.S. "Программируйте с использованием языка, а не на языке" (с) Стив Макконнелл. Совершенный код. Глава 34.4 Возможно. Но в споре рождается истина. Главное оперировать фактами и не скатываться на личности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 17:20 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр СедовСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью. Давайте заканчивать этот цырк замыкания имеют весьма опосредованное отношение к "функциональному" стилю К управлению памятью разумеется имеют самое прямое Пётр Седов Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он человек не должен критиковать другого человека на той почве, на которой он сам не стоит перпендикулярно В Delphi и таких то нет :) в каой STL ты будешь передавать свои локальные функции ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 17:23 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр СедовНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа. да вы шо ? o O Пётр Седов В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать. Правда ? А вот в D собираются (хотя там аналогичная проблема) дело очевидно не в "ручном" управлении памятью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2008, 17:27 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): Gluk (Kazan) Пётр СедовСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью. Давайте заканчивать этот цырк Я и не начинал никакого цирка. Вы спросили: Gluk (Kazan) А замыкания есть в Delphi ? Я ответил, что нет, и попытался обосновать, почему нет. Gluk (Kazan) замыкания имеют весьма опосредованное отношение к "функциональному" стилю Замыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля. Gluk (Kazan) Пётр Седов Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он человек не должен критиковать другого человека на той почве, на которой он сам не стоит перпендикулярно Если я считаю, что C++-ные локальные функторы -- неудобные и ограниченные, то, думаю, я имею право это высказать. И Delphi здесь совершенно ни при чём. Gluk (Kazan) В Delphi и таких то нет :) Действительно, в Delphi нет локальных функторов, аналогичных C++-ным. Никто и не утверждал, что есть. Gluk (Kazan) в каой STL ты будешь передавать свои локальные функции ? Delphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова. Gluk (Kazan) Пётр СедовНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа. да вы шо ? o O Там есть замыкания или лямбда-функции? По-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит. Gluk (Kazan) Пётр Седов В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать. Правда ? Я слышал про планы добавить в C++0x (будущий стандарт C++) необязательную сборку мусора. Тогда удобные замыкания можно будет сделать, но это очень туманная перспектива. Gluk (Kazan) А вот в D собираются (хотя там аналогичная проблема) В D нет аналогичной проблемы -- там автоматическое управление памятью (точнее, смешанное), в отличие от C++. Gluk (Kazan) дело очевидно не в "ручном" управлении памятью Нет, чтобы реализовать удобные замыкания, требуется именно автоматическое управление памятью. Вы же сами написали: Gluk (Kazan) замыкания имеют весьма опосредованное отношение к "функциональному" стилю К управлению памятью разумеется имеют самое прямое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2008, 10:30 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Пётр Седов Вы знаете, я бы в общем то не возражал, НО из Вас как из Рога Изобилия по любому поводу просто сыпятся мыстли, с которыми я мягко говоря не согласен (это была преамбула) 1. Вы похвалились наличием в Delphi "удобных" локальных функций (которых нет в C++) 2. Поскольку (с моей точки зрения) пользы от локальных функций не реализующих замыкания немного, я переспросил (разумеется зная ответ) как там у вас с замыканиями 3. На что было отвечено, что замыканий нет, поскольку Delphi не ФЯ (термин "ручное" управление несколько коробит (автоматических сторожей в C++ никто не отменял), но бох с ним 4. Я несколько по другому понимаю слово "неотъемлемая". Для меня оно означает не то что фича появилась в каком то месте, а скорее то, что место это без фичи просто не может существовать. Посему был приведен в пример Perl, ни разу не функциональный (об этом ниже), но реализующий вполне себе полноценные замыкания. Не удержусь от цитирования ображчика ущербной логики: авторЗамыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля. 5. К слову сказать, даже в SICP макимальное внимание к замыканиям уделяется в разделах, посвещенных императивному программированию 6. Далее Вами было заявлено, что и Perl имеет отношение к ФП :) Конечно имеет, но C++ в таком случае, к ФП имеет еще большее отношение, поскольку из трех категорий языков а) Языки поощеряющие ФП, но пригодные для ИП (Lisp) б) Языки императивные на которых можно использовать ФП (Perl) в) Языки на которых кроме как ФП больше никак писать нельзя (шаблоны C++, XSLT) к ФЯ я все-таки отнесу последние 7. Вами было заявлено, что ФП на C++ неудобно, громоздко и без boost-а чуть ли не невозможно (во всяком случае так я Вас понял), на что Вам было предоставлено аргументированное ни разу не бустовое, не тривиальное и вполне быстро компилирующееся применение метапрограммирования на C++, совершенно однозначно имеющее отношение к ФП (в отличии от замыканий являющихся хоть и удобным но всего-лишь бантиком). Сложное ? на мой взгляд нет. Просто несколько непривычное и требующее определенных навыков. Громоздкое ? сравним: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. очевидно, что нет :) 8. Мной были упомянуты функторы как альтернатива локальным функциям и замыканиям (захват всего необходимого можно выполнять ручками в конструкторе). Разумеется, локальные функторы нельзя передавать в шаблоны :) но вложенные еще как можно ;) А если считать функтор аналогом функции, то аналогом локальной функции можно считать функтор вложенный в другой функтор чем это неудобнее вплане структурирования кода я не постигаю ибо сам для этого постоянно ими пользуюсь. Разьве что тем, что функторы предоставляют куда большую функциональность (особенно если делать их шаблонами) ? Кстати, возможно я не до конца оценил глубину Вашей мысли: авторИз-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию. образчик кода на Delphi Вас не затруднит? В общем, пока что Вы не убедили меня что: авторC++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции). на мой взгляд, они куда более удобны и функциональны 9. Вот это мне нравится: авторСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. С точки зрения логики, все вроде впорядке :) Зато можно подумать, что замыкания неотъемлимая часть ФП И что не может быть ФП без замыканий (напоминает анекдот про бегимота, прилипшего к хвостику белочки) авторНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа. IMHO надо добавлять. Ваше незнание или неумение не повод рожать (или поддерживать) нездоровые сенсации. В том коде что я привел есть boost ? 10-этажные шаблоны ??? Или он компилировался у Вас 2 часа ? Либо у Вас очччченннь медддленная машинка, либо Вы клеветник, батенька авторЭто не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он. Примеры ограниченности, пожалуйста (желательно с C++ кодом) Только не локальных а вложенных авторDelphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова. А функторы можно И кто из них после этого ограниченный ??? авторТам есть замыкания или лямбда-функции? Вам нужны лямбды ? Их есть у нас: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. авторПо-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит. Неудобно, но единственно возможно. Кстати, Вы действительно думаете, что я написал все это без отладки ? Вы мне определенно льстите :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2008, 12:31 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): Gluk (Kazan) 1. Вы похвалились наличием в Delphi "удобных" локальных функций (которых нет в C++) Я не похвалился, а заметил, что это удобно. Gluk (Kazan) 2. Поскольку (с моей точки зрения) пользы от локальных функций не реализующих замыкания немного, Польза от Delphi-йских локальных процедур/функций -- лёгкий доступ к контексту и лучшая структуризация кода. Если бы локальные функции были в C++, то пришлось бы меньше перекомпилировать: изменение внутренностей функции, написанной в .cpp-файле, не затрагивает заголовочный файл. Gluk (Kazan) я переспросил (разумеется зная ответ) как там у вас с замыканиями Обычно, когда твёрдо знают ответ, вопрос не задают (Вы не преподаватель на экзамене и не часовой, спрашивающий пароль). К тому же, вопросов было два: Gluk (Kazan) А замыкания есть в Delphi ? Или на любой Чих будет AV ? Второй вопрос заставляет усомниться, что Вы твёрдо знали ответ на первый. Кстати, «у вас» -- это у кого? Gluk (Kazan) термин "ручное" управление несколько коробит (автоматических сторожей в C++ никто не отменял), По моим понятиям, в C++ ручное управление памятью. Хотя его можно «полуавтоматизировать» с помощью разных ухищрений (например, умные указатели). Gluk (Kazan) 4. Я несколько по другому понимаю слово "неотъемлемая". Я в этом обсуждении не использовал слово «неотъемлемый» или его формы. Gluk (Kazan) Для меня оно означает не то что фича появилась в каком то месте, а скорее то, что место это без фичи просто не может существовать. Посему был приведен в пример Perl, ни разу не функциональный (об этом ниже), но реализующий вполне себе полноценные замыкания. Не удержусь от цитирования ображчика ущербной логики: авторЗамыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля. 5. К слову сказать, даже в SICP макимальное внимание к замыканиям уделяется в разделах, посвещенных императивному программированию Что является функциональным языком/программированием/стилем, а что не является -- это вопрос глубоко философский, мне его не интересно обсуждать. Мне интересно обсуждать, что на грешной земле делается -- C++-ные локальные функторы и Delphi-йские локальные процедуры/функции. Gluk (Kazan) 6. Далее Вами было заявлено, что и Perl имеет отношение к ФП :) Конечно имеет, но C++ в таком случае, к ФП имеет еще большее отношение, поскольку из трех категорий языков а) Языки поощеряющие ФП, но пригодные для ИП (Lisp) б) Языки императивные на которых можно использовать ФП (Perl) в) Языки на которых кроме как ФП больше никак писать нельзя (шаблоны C++, XSLT) к ФЯ я все-таки отнесу последние C++-шаблоны можно использовать как функциональный язык для мета-программирования, но у этого около-языка куча минусов: * Большинство C++-программистов им не владеет. * Невозможно пройтись по коду в отладчике. * Не поддерживаются floating point числа. * Очень неудобно указывать строковые литералы (и вообще работать со строками). Gluk (Kazan) 7. Вами было заявлено, что ФП на C++ неудобно, громоздко и без boost-а чуть ли не невозможно (во всяком случае так я Вас понял), Да, Вы правильно меня поняли. Для написания мета-программы в функциональном стиле, выполняющейся в compile-time, Boost не обязателен, C++-шаблонов достаточно. Boost нужен ради Boost.Lambda для написания программы в функциональном стиле, выполняющейся в run-time. Gluk (Kazan) на что Вам было предоставлено аргументированное ни разу не бустовое, не тривиальное и вполне быстро компилирующееся применение метапрограммирования на C++, совершенно однозначно имеющее отношение к ФП (в отличии от замыканий являющихся хоть и удобным но всего-лишь бантиком). Сложное ? на мой взгляд нет. Да, сложное. В том смысле, что для большинства C++-программистов это тайнопись. Но главное: я имел в виду функциональный стиль в программах, выполняющихся в run-time, а не в compile-time. Gluk (Kazan) Просто несколько непривычное и требующее определенных навыков. Громоздкое ? сравним: код на C++-шаблонах код на Lisp-е очевидно, что нет :) Напишите на C++ в функциональном стиле преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в run-time. Вот тут и проявится различие между C++ и функциональными языками. В отличие от мета-кода на C++-шаблонах, код на Lisp-е можно выполнить в run-time. Gluk (Kazan) 8. Мной были упомянуты функторы как альтернатива локальным функциям и замыканиям (захват всего необходимого можно выполнять ручками в конструкторе). Вот именно это и неудобно. С Delphi-йскими локальными процедурами/функциями не надо ничего захватывать вручную, всё просто и удобно. Gluk (Kazan) Разумеется, локальные функторы нельзя передавать в шаблоны :) Именно о локальных функторах и идёт речь. И ещё о Delphi-йских локальных процедурах/функциях. То есть речь идёт о том, что определено локально (в рамках функции). Gluk (Kazan) но вложенные еще как можно ;) О них речь не идёт. Gluk (Kazan) А если считать функтор аналогом функции, то аналогом локальной функции можно считать функтор вложенный в другой функтор чем это неудобнее вплане структурирования кода я не постигаю ибо сам для этого постоянно ими пользуюсь. Теряется локальность, нелокальный функтор надо писать вне функции. Скорее всего, нелокальный функтор надо упомянуть в заголовочном файле, это может привести к избыточной перекомпиляции в случае изменений. И ещё та же проблема, что и с локальными функторами: тяжело дотянуться до контекста. Gluk (Kazan) Кстати, возможно я не до конца оценил глубину Вашей мысли: авторИз-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию. образчик кода на Delphi Вас не затруднит? Код на C++ и Delphi -- см. ниже. Gluk (Kazan) В общем, пока что Вы не убедили меня что: авторC++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции). на мой взгляд, они куда более удобны и функциональны В C++-ном локальном функторе тяжело дотянуться до контекста, это неудобно. В Delphi-йской локальной процедуре/функции легко дотянуться до контекста, это удобно. Gluk (Kazan) 9. Вот это мне нравится: авторСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. С точки зрения логики, все вроде впорядке :) Зато можно подумать, что замыкания неотъемлимая часть ФП И что не может быть ФП без замыканий (напоминает анекдот про бегимота, прилипшего к хвостику белочки) Опять же, меня не интересует, в чём заключается глубинная истинная сущность функционального языка/программирования/стиля. Gluk (Kazan) авторНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа. IMHO надо добавлять. Как ни странно, то, что я пишу, -- это моё личное мнение ( m y o pinion), за исключением цитат, выделенных особо. Gluk (Kazan) Ваше незнание или неумение не повод рожать (или поддерживать) нездоровые сенсации. Нет никакой сенсации в том, что C++ плохо подходит для написания программ в функциональном стиле, выполняющихся в compile-time или run-time. Для этого другие языки есть. Gluk (Kazan) В том коде что я привел есть boost ? В Вашем коде (преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в compile-time) не используется Boost. Gluk (Kazan) 10-этажные шаблоны ??? Нагромождение шаблонов есть. Gluk (Kazan) Или он компилировался у Вас 2 часа ? Я не компилировал Ваш код. Игрушечные примеры мета-программирования на C++-шаблонах (например, вычисление факториала) компилируются быстро. Но если делать что-то серьёзное, то компилируется долго. Попробуйте сделать parser C++ с помощью Boost.Spirit. Уверен, компилироваться будет долго. Слышал, что люди отказываются от Boost.Python именно из-за времени компиляции. Gluk (Kazan) авторЭто не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он. Примеры ограниченности, пожалуйста (желательно с C++ кодом) 1. Локальный функтор не может по-простому использовать контекст, например, локальную переменную охватывающей функции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 2. Тип локального функтора не может быть параметром шаблона (по крайней мере, в нынешнем C++), поэтому локальный функтор нельзя использовать, например, в качестве предиката для STL-алгоритма: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Gluk (Kazan) Только не локальных а вложенных Не подменяйте тему, речь идёт именно о локальных функторах (то есть определённых в рамках функции): Gluk (Kazan) Пётр Седов Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код. Локальные функторы - это ТОЖЕ удобно :) Хочется именно локальности, чтобы писать код «не отходя от кассы». И чтобы при изменениях перекомпилировать поменьше. Gluk (Kazan) авторDelphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова. А функторы можно Локальные функторы не передать в STL-алгоритм. Нелокальные -- можно, но речь не о них. Gluk (Kazan) И кто из них после этого ограниченный ??? C++-ные локальные функторы ограничены -- тяжело дотянуться до контекста (надо через указатели) и в STL-алгоритм не передать, это сильно портит жизнь. Delphi-йские локальные процедуры/функции ограничены -- нельзя взять их адрес и передать куда-нибудь, но это мало портит жизнь. Gluk (Kazan) авторТам есть замыкания или лямбда-функции? Вам нужны лямбды ? Их есть у нас: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Это нагромождение шаблонов, а лямбда-функция -- это анонимная локальная функция, обычно короткая (часто умещается в одной строке). Кстати, имена из одной буквы не добавляют понятности этому коду. Gluk (Kazan) автор По-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит. Неудобно, но единственно возможно. C++-шаблоны -- не единственный способ мета-программирования, есть способ лучше: генерация кода (мета-программа пишет программу). Этот способ доступен для всех языков, в том числе для Delphi. Один из плюсов: мета-программу можно отладить. Gluk (Kazan) Кстати, Вы действительно думаете, что я написал все это без отладки ? Каким образом отлаживать мета-программу на C++-шаблонах? По мета-коду на C++-шаблонах не пройтись в отладчике. Если внести неверное изменение, то сообщение компилятора об ошибке будет невнятным. Gluk (Kazan) Вы мне определенно льстите :) Я не столько льщу Вам, сколько указываю на неудобство и непрактичность мета-программирования на C++-шаблонах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2008, 12:39 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Пётр Седов Польза от Delphi-йских локальных процедур/функций -- лёгкий доступ к контексту и лучшая структуризация кода. Относительно этого чуть ниже. Кроме того, "лучшая структуризация" кода понятие сильно субъективное. Пётр Седов Если бы локальные функции были в C++, то пришлось бы меньше перекомпилировать: изменение внутренностей функции, написанной в .cpp-файле, не затрагивает заголовочный файл. Имеете в виду, что если я объявляю вложенный класс, мне придется писать его реализацию в h-файле ??? Ничуть небывало :) Кто мешает мне вынести его реализацию в cpp ? Кстати, для разрыва зависимостей есть куда более мощное оружие - интерфейсы Пётр Седов Обычно, когда твёрдо знают ответ, вопрос не задают ... Второй вопрос заставляет усомниться, что Вы твёрдо знали ответ на первый Ой, таки я Вас умоляю То была мааааленькая провокация :) Не судите о людях по вопросам, можете сильно ошибиться. Кстати, хоть к делу это и не относится, я зарабатывал на жизнь знанием Delphi с 1-ой по 7-ю версию. Один из образчиков моего творчества можете посмотреть в kuliba1000, искать NtxRO (фамилию правда как обычно переврали, ну да бог с ней) Пётр Седов Я в этом обсуждении не использовал слово «неотъемлемый» или его формы Действительно не использовал, прошу прощения. Значимость отдельных фич, появившихся в ФП часто возводят в ранг неотемлимых частей, вот и почудилось Пётр Седов Что является функциональным языком/программированием/стилем, а что не является -- это вопрос глубоко философский, мне его не интересно обсуждать Тем не менее, Вам очевидно интересно делать громкие заявления о том, что Perl имеет большее отношение к ФП чем C++ ? Уверяю Вас, для Perl ФП ничуть не более естественно чем для последнего Пётр Седов C++-ные локальные функторы и Delphi-йские локальные процедуры/функции ... Не подменяйте тему Локальные классы в C++ имеют действительно весьма сильные ограничения, но как я Вам уже говорил, для меня более адекватной аналогией локальной функции является функтор внутри функтора (то есть вложенный класс). Так что я ни в коем случае не меняю тему, а лишь расширяю ее :) Пётр Седов C++-шаблоны можно использовать как функциональный язык для мета-программирования, но у этого около-языка куча минусов: Для меня акценты стоят несколько по другому :) ФП - это единственный способ заниматься метапрограммированием с использованием C++ шаблонов Пётр Седов * Большинство C++-программистов им не владеет. Большинство программистов владеют Lisp-ом ? Или Haskell-ем ??? Давайте не будем говорить за народ, аппелировать к большинству и т.п. Будем говорить за себя ? Пётр Седов * Невозможно пройтись по коду в отладчике. Об этом ниже. Отладка не обязана быть интерактивной Пётр Седов * Не поддерживаются floating point числа. * Очень неудобно указывать строковые литералы (и вообще работать со строками). Несомненно досадные ограничения :( Но кто без греха ??? Пётр Седов Да, Вы правильно меня поняли. Для написания мета-программы в функциональном стиле, выполняющейся в compile-time, Boost не обязателен, C++-шаблонов достаточно. Boost нужен ради Boost.Lambda для написания программы в функциональном стиле, выполняющейся в run-time. не согласен . Все врямя слышу, boost, boost ... Он Ваш дедушка - Boost ??? Пётр Седов Да, сложное. В том смысле, что для большинства C++-программистов это тайнопись. Но главное: я имел в виду функциональный стиль в программах, выполняющихся в run-time, а не в compile-time. Напишите на C++ в функциональном стиле преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в run-time. Вот тут и проявится различие между C++ и функциональными языками. В отличие от мета-кода на C++-шаблонах, код на Lisp-е можно выполнить в run-time. Про большинство я уже говорил. А про RunTime - Задача преобразования НКА в ДКА совершенно элементарно решается на C++ императивно (в RunTime). Зачем усложнять решение, если плюсы от этого сомнительны, а минусы очевидны ??? С другой стороны, если нам нужно решить эту задачу в CompileTime, то ничего кроме ФП на помощь не придет. Если Вас волнует практическая польза - это вполне может быть какой-нибудь CompileTime лексер. Пётр Седов Нет никакой сенсации в том, что C++ плохо подходит для написания программ в функциональном стиле, выполняющихся в compile-time или run-time. Для этого другие языки есть. Нет никакой сенсации в том, что любые языки программирования неудобны для написания программ. Совершенство вообще стоит искать не в этом мире :( Что касается CompileTime, говорил и повторю еще - ФП единственный способ писать для него программы Пётр Седов Нагромождение шаблонов есть. Покажите хоть один лишний ;) Пётр Седов Игрушечные примеры мета-программирования на C++-шаблонах (например, вычисление факториала) компилируются быстро. Но если делать что-то серьёзное, то компилируется долго. NFA -> DFA для Вас недостаточно серьезно ? o O Скомпилируйте да убидитесь - компилируется не долго В противном случае, Ваша позиция сильно напоминает "Пастернака не читал, но осуждаю ..." Пётр Седов Попробуйте сделать parser C++ с помощью Boost.Spirit. Уверен, компилироваться будет долго. Слышал, что люди отказываются от Boost.Python именно из-за времени компиляции. Простите, ЗАЧЕМ мне это делать, если я прекрасно обхожусь БЕЗ Boost-а ??? Пётр Седов 1. Локальный функтор не может по-простому использовать контекст, например, локальную переменную охватывающей функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Никак не пойму. Чем это хуже локальной функции ??? Пётр Седов Выход -- сделать функторы нелокальными: Но теряется локальность, и функторы надо упомянуть в заголовочном файле. Если захочется перейти от std::sort к собственному алгоритму сортировки (это разумно, если ключ -- целое число из небольшого диапазона), то придётся изменить содержимое заголовочного файла. Это вызовет избыточную перекомпиляцию. Oh! Really ??? o O Т.е. по Вашему раз я в предыдущем примере объявил A в cpp, а не в h-файле, он так таки сразу и стал локальным? И его нельзя будет передать в этот шаблон: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Мессир, я в УЖАСЕ !!! (с) Относительно мифических "перекомпиляций", я уже говорил - откройте для себя интерфейсы Пётр Седов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Кстати, имена из одной буквы не добавляют понятности этому коду. А по мне так это аналог следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. А также иллюстрация того, что шаблоны C++ можно рассматривать как ФВП :) Вот уж поистине: "Один видит в луже только лужу, а другой, глядя в лужу, видит звезды" (с) Для меня lambda не более чем способ вернуть из функции функцию. В разных языках, она может выглядеть ОЧЕНЬ по разному. Кстати отсутствие лаконичности в Lisp не идет на пользу "понятности" Ведь можно было написать просто: \m.mxy Пётр СедовC++-шаблоны -- не единственный способ мета-программирования, есть способ лучше: генерация кода (мета-программа пишет программу). Этот способ доступен для всех языков, в том числе для Delphi. Один из плюсов: мета-программу можно отладить. Потусторонними препроцессорами ? Несомненно ОЧЕНЬ удобно :) И отлаживать тоже Пётр СедовКаким образом отлаживать мета-программу на C++-шаблонах? По мета-коду на C++-шаблонах не пройтись в отладчике. Если внести неверное изменение, то сообщение компилятора об ошибке будет невнятным. ФП поощеряет использовать небольшие функции с обозримой логикой. Отсутствие изменения состояний и побочных эффектов облегчает unit-тестирование. Большая программа складывается из мелких кирпичиков. Сначала проверяем корректность самых мелких, потом переходим на более высокие уровни. Или для Вас отладка ассоциируется только с тупым жамканьем кнопочки 'Step' в какой нибудь красявой IDE ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2008, 09:03 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Весь топик не читал, но встряну, ибо обед обязывает. Ынтырпрайз Им вбили в 80-х паскаль, вот они теперь и думают, что п - самый лучший яп в мире. Во всем мире латынью читается Си и Ява. В MIT'е раньше преподавали scheme'у. Счас заменили на питон ТЫНЦ ( см также ). Интересно у нас такое когда нить будт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2008, 10:28 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
На питоне в самый раз обучать, на нём писать код легко и удобно, заодно сработает как прививка против ненависти к значимым отступам, и помешает лепить код как попало. А про полчища шаблонов скажу, что я бы убивал за такой невнятный код. Я изучал шаблоны, делал упражнения, в общих чертах понимаю, но не вижу смысла лепить их такими кучами, что в каждой строчке комментарий нужен... Может это прочтение Александреску приводит к такому ужасу? Я его ещё не читал, пока другого чтива хватает. Помню когда на ассемблере писал, то комментариев много ставил, т.к. уже через месяц в своём коде сложно разобраться, не дело это, ещё и в языках высокого уровня всё усложнять настолько, что становится похоже на тайнопись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2008, 08:15 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
XDiaBLoА про полчища шаблонов скажу, что я бы убивал за такой невнятный код. внятность вещь сильно субъективная (мне например значимые отступы кажутся невнятными (не сработала прививка) особенно когда какой нибудь [censored] переводит статью вместе с примерами, ага дооооолго потом имеешь в виду что имел автор, после того как переводчег все значимые отступы таво ...) и потом убивал бы где ? в продакте ? дык ты не поверишь, я бы тоже убивал сто раз уж говорил, что я это воспринимаю исключительно как зарядку для ума ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2008, 13:42 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) XDiaBLoА про полчища шаблонов скажу, что я бы убивал за такой невнятный код. внятность вещь сильно субъективная (мне например значимые отступы кажутся невнятными (не сработала прививка) особенно когда какой нибудь [censored] переводит статью вместе с примерами, ага дооооолго потом имеешь в виду что имел автор, после того как переводчег все значимые отступы таво ...) Видал я книгу где весь код к левому краю прилип (причём в первой половине книги всё нормально было размечено), приходилось просто в папке с примерами копаться, благо исходники прилагались в электронном виде. Не помню что за книга, вроде Брюс Эккель "Философия C++". Gluk (Kazan) и потом убивал бы где ? в продакте ? дык ты не поверишь, я бы тоже убивал сто раз уж говорил, что я это воспринимаю исключительно как зарядку для ума А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2008, 14:24 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
XDiaBLoВидал я книгу где весь код к левому краю прилип (причём в первой половине книги всё нормально было размечено), приходилось просто в папке с примерами копаться, благо исходники прилагались в электронном виде. Не помню что за книга, вроде Брюс Эккель "Философия C++". Видал я перевод одной статьи по Хаскелю с отбивкой :) Мало того, что подстрочник, дык ишо и по исходникам прошлись (хорошо хоть не стилусом) заботливо выровняв их в одну строку :) Многа думал шо тупой (пока оригинал не нашел) XDiaBLo А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе Ну такие вещи нигде не одобряются. Головоломные места в продакт коде встречаются, но до MP в полный рост пока не доходило. И не головоломные реализации этих мест гарантированно были-бы еще сложнее для понимания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2008, 16:51 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Видал я перевод одной статьи по Хаскелю с отбивкой :) Мало того, что подстрочник, дык ишо и по исходникам прошлись (хорошо хоть не стилусом) заботливо выровняв их в одну строку :) Многа думал шо тупой (пока оригинал не нашел) Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :) Gluk (Kazan) XDiaBLo А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе Ну такие вещи нигде не одобряются. Головоломные места в продакт коде встречаются, но до MP в полный рост пока не доходило. И не головоломные реализации этих мест гарантированно были-бы еще сложнее для понимания. Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2008, 07:27 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
XDiaBLo Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :) Я такой же нуб как и ты :) факториал пишу по старинке, а не через Y-комбинатор :) Ну максимум - хвостовую рекурсию задействую IMHO совершенно не взаимосвязанный материал, посему нет разницы в каком порядке читать можно параллельно. Перед "Искусством Программирования" имеет смысл "Конкретную математику" почитать, там дается матаппарат (но если не хочешь углубляться в математику, то и не надо). В самом трехтомнике, мне лично, больше всего понравился 2 том. Заказывал тот перевод, что выпустили по 4 тому, да так и не дождался А что за книжка по Хаскелю ? XDiaBLo Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка. нуу комплексы это конечно хорошо (они облагораживают в конечном итоге) но практика показывает, что эволюция всегда лучше чем "до основанья а затем ..." сам сейчас в похожей ситуации, новый человек пришел, а в коде говнищаааааа будем мээээдленннно и не спеша пырыписывть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2008, 08:08 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) XDiaBLo Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :) Я такой же нуб как и ты :) факториал пишу по старинке, а не через Y-комбинатор :) Ну максимум - хвостовую рекурсию задействую IMHO совершенно не взаимосвязанный материал, посему нет разницы в каком порядке читать можно параллельно. Перед "Искусством Программирования" имеет смысл "Конкретную математику" почитать, там дается матаппарат (но если не хочешь углубляться в математику, то и не надо). В самом трехтомнике, мне лично, больше всего понравился 2 том. Заказывал тот перевод, что выпустили по 4 тому, да так и не дождался А что за книжка по Хаскелю ? По-моему вот эта Функциональное программирование на языке Haskell Gluk (Kazan) XDiaBLo Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка. нуу комплексы это конечно хорошо (они облагораживают в конечном итоге) но практика показывает, что эволюция всегда лучше чем "до основанья а затем ..." сам сейчас в похожей ситуации, новый человек пришел, а в коде говнищаааааа будем мээээдленннно и не спеша пырыписывть[src][/src]Лучше до основанья, в билдере всё равно оставлять не вариант, заодно получу ещё немного опыта работы на Java %) Поймать бы ещё момент, когда будет несколько дней подряд нечем заняться, так и переписал бы хоть одну программу на пробу. Программы то небольшие, по паре тысяч строк. Всего наверное тыщ десять строк в сумме будет, думаю быстро перепишу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2008, 08:25 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
XDiaBLo Gluk (Kazan)А что за книжка по Хаскелю ? По-моему вот эта Функциональное программирование на языке Haskell ее на rsdn-е поругивали вроде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2008, 10:08 |
|
||
|
Программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) XDiaBLo Gluk (Kazan)А что за книжка по Хаскелю ? По-моему вот эта Функциональное программирование на языке Haskell ее на rsdn-е поругивали вроде Навскидку только один нелестный отзыв нашёл. Да и какая разница? Мне бы только вкратце ознакомиться с основами. Для ознакомления с принципами функционального программирования. Там уж можно будет и мануалы посмотреть, если понадобится углубиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2008, 10:40 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1345183]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
244ms |
get tp. blocked users: |
1ms |
| others: | 271ms |
| total: | 726ms |

| 0 / 0 |
