|
|
|
Программирование
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35380572&tid=1345183]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 286ms |
| total: | 592ms |

| 0 / 0 |
