powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование
25 сообщений из 84, страница 2 из 4
Программирование
    #35378286
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Об авторе уже забыли

--

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Программирование
    #35378291
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Да, соглашусь. Это не С++
Я не об этом. Вопрос не в мощи, а в том, что авторы языка действовали без головы (или, вернее, с дурной головой). Скажем, в C++ логика конструирования определяется тем, что объекты могут располагаться в стеке (и инициализироваться мусором), есть множественное наследование и необходимо обеспечить правильную работу деструкторов. В яве - множественного наследования нет, объекты всегда в динамической памяти, инициализируются нулями, а ставшие бессмысленными ограничения тем не менее аккуратно копируются из плюсов.

edges7На тот момент, можно сказать, у меня была вообще полная каша по поводу ООП. И тогда это было лучшее, на мой взгляд, что я нашел по ООП. Прочитал - все разложил по полочкам.
Ну скажем так, судя по этой формулировке, язык собственно не повлиял, вопрос только в удачно попавшейся литературе.

edges7Что касается отсутствия множественного наследования. Но ведь это характерно для Java, а не для всех языков.
Дык я просто к тому, что "изучив ООП по-явовски" даже в дельфе полноценно работать нельзя. Потому как в дельфе оно шире. И поэтому "концепцию полностью" выглядит.. самонадеянно :)

maytonОбиделся что downcasts не всегда прокатывают?
Да нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.
...
Рейтинг: 0 / 0
Программирование
    #35378312
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой
На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП. В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке. Смешивание тем из разных доменов - отвратительная привычка, приводящая к каше в голове у обучаемых. Они уже не понимают "откуда растут ноги" у тех или иных тонкостей, они не понимают, что концептуально, что - детали реализации, а что - глупость, которую надо исправлять. Они способны только заучить книгу аки библию и бездумно сыпать цитатами из нее, не умея даже их обосновать - наподобие прозвучавшего здесь "- зло".
...
Рейтинг: 0 / 0
Программирование
    #35378350
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП.

Да. И замечательно, что такая литература есть. Но на тот момент, к сожалению, про нее просто не знал.

softwarer В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке.

Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :)
В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.
...
Рейтинг: 0 / 0
Программирование
    #35378416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerДа нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.
Я надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию.
...
Рейтинг: 0 / 0
Программирование
    #35378421
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :)
В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.

В C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП.
...
Рейтинг: 0 / 0
Программирование
    #35378472
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП.Плохо-плохо. ООП вполне самодостаточен и можно реализовать любой алгоритм не выходя за пределы классов-объектов. А когда мы за них выходим (как это слишком часто происходит в C++ и чуть реже, но бывает в Дельфях) начинается каша поддерживать которую врагу не пожелаешь. Получается тот же самый GOTO, вид сбоку.
...
Рейтинг: 0 / 0
Программирование
    #35378716
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer"Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.

подробнее можно?
...
Рейтинг: 0 / 0
Программирование
    #35378721
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гыподробнее можно?
Примерно следующая ситуация (прошу прощения за возможные синтаксические ошибки, таки не один год как бросил это дело):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  A {
   public  A() { ... doSomething(); ... }
   public   void  doSomething() { ... }
}

 class  B  extends  A {
  
   public  B() {  super (); ... }

   private  Vector someList =  null ;

   private   void  registerSomething(Object something) {
     if  (someList ==  null ) someList =  new  Vector();
    someList.add(something);
  }

   public   void  doSomething() {
    ...
    registerSomething(...);
    ...
  }
}

Версию явы не помню, не то 1.3, не то 1.4. Работало это чудо так: делается new B(), в нем super(), вызывается doSomething(), создается someList, завершается A(), и непосредственно перед возвратом в B() выполняется someList = null. Орднунг юбер аллес, Гитлер капут, маразм форева.
...
Рейтинг: 0 / 0
Программирование
    #35378735
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это может сбить с толку. Это нужно знать, что блок инициализации выполняется после конструктора предка. И этому есть обоснование.

Если написать так (а это то же самое) было бы понятнее?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class B extends A {
  
  public B() { super(); ... }

  private Vector someList;

  {
    someList = null;
  }

  private void registerSomething(Object something) {
    if (someList == null) someList = new Vector();
    someList.add(something);
  }

  public void doSomething() {
    ...
    registerSomething(...);
    ...
  }
}

И потом зачем инициализировать null'ом поле если оно и так null?
...
Рейтинг: 0 / 0
Программирование
    #35378740
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыИ этому есть обоснование
Любопытно было бы услышать. Правда, почти уверен, что оценю иначе.

ГыЕсли написать так (а это то же самое) было бы понятнее?
Понятно оно и так. Просто это концептуальная глупость.

ГыИ потом зачем инициализировать null'ом поле если оно и так null?
После этого и отказался от этой привычки. Хотя инициализировать - аккуратнее.
...
Рейтинг: 0 / 0
Программирование
    #35378837
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПлохо-плохо.

Что русскому хорошо, то немцу плохо
K&R C тоже самодостаточен ... и машина Тьюринга

Зачем ООП ???

Да и не лазейки это. Просто НЕ ООП. Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ?
...
Рейтинг: 0 / 0
Программирование
    #35379021
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ?
Я-бы такого никогда не сказал. Просто удивляет повсеместное экстраполирование ООП на С++. Хочется, как в монологе Жванецкого подъехать на танке и сказать - ".. а пачему собсно?"
...
Рейтинг: 0 / 0
Программирование
    #35379053
Ынтырпрайз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7 Ынтырпрайз А весь нормальный мир ООП выучил по Ява.

За весь мир не скажу - не знаю, а за себя, пожалуй, соглашусь. :)
Хотя применял ( и применяю ) ООП в Delphi, тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Ну, не знаю, может быть, Шилдт и Ноутон так доходчиво пишут или литературу по ООП в Delphi не ту читал. Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java.

Видели бы вы студентов, которые учили ООП по турбопаскалю 5.5 в 2004 году... Ужас...
Особенно когда их пересаживали на делфи....
...
Рейтинг: 0 / 0
Программирование
    #35379242
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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]
А пример Ваш надуман, потому что человек, использующий в конструкторе публичный метод, который в любой момент может быть перекрыт, а следовательно потенциально передающий часть ответственности за инициализацию экземпляра предка потомкам, подлежит публичной и позорной экзекуции.
...
Рейтинг: 0 / 0
Программирование
    #35379674
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.
Угу, именно так. Наблюдается подход "каша". Итогом его становится прорва кодеров, кое-как заучивших, но мало что понимающих. Впрочем, объективности ради, по Delphi хороших книг тоже мало, а в большинстве наблюдается ровно такая же каша из языка, IDE и VCL. Вообще, у меня есть впечатление, что немногочисленные хорошие специалисты сейчас получаются не благодаря первым книгам, которые читали, а скорее вопреки им.
...
Рейтинг: 0 / 0
Программирование
    #35379715
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию.
На какую именно концепцию? На ООП? Мое отношение к ней сформировалось лет за семь до появления Явы. На "ООП в Яве"? Мм... мои взгляды, если коротко, сводятся к точке зрения "авторы этой реализации думали задницей", и этот случай действительно не изменил этих взглядов.
...
Рейтинг: 0 / 0
Программирование
    #35379771
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть.
Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней.

ГыНапример чтобы проходила такая фишка:
Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review.
...
Рейтинг: 0 / 0
Программирование
    #35379841
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть.
Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней.

Например?

softwarer
ГыНапример чтобы проходила такая фишка:
Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review.

Не пройдет. Если блок инициализации запускался бы перед конструктором предка, то list был бы не проинициализирован.
А почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
...
Рейтинг: 0 / 0
Программирование
    #35380032
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще здесь написано следующее:

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

После этого становится понятно подобное поведение блока инициализации.
...
Рейтинг: 0 / 0
Программирование
    #35380097
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class Super {
// Broken - constructor invokes overridable method
public Super() {
m();
}
public void m() {
}
}
Here's a subclass that overrides m, which is erroneously invoked by Super's sole constructor:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
final class Sub extends Super {
private final Date date; // Blank final, set by constructor
Sub() {
date = new Date();
}
// Overrides Super.m, invoked by the constructor Super()
public void m() {
System.out.println(date);
}
public static void main(String[] args) {
Sub s = new Sub();
s.m();
}
}
You might expect this program to print out the date twice, but it prints out null the first time
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.
...
Рейтинг: 0 / 0
Программирование
    #35380277
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыНапример?
Путь, который я полагаю наиболее правильным, реализован в C++ и в Delphi, это возможность программисту явно управлять порядком инициализации.

Путь, наиболее подходящий с точки зрения "минимального изменения языка" - доработать концепцию так, чтобы убрать необходимость в уродливой заплате под названием "блок инициализации", ну а инициализирующие присваивания выполнять прежде конструкторов.

Наконец, учитывая интерпретирующий характер языка, в принципе можно инициализировать объекты, обходя дерево зависимостей, и ругаться, если обнаружен цикл. Правда, это имхо извращение, но зато хорошо соответствует идеологии языка.

ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

   class  LsnrOK  extends  ActionListener {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener ( new  LsnrOK()); ... }
}

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

  ActionListener lsnrOK =  new  ActionListener() {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener (lsnrOK); ... }
}

Код: plaintext
1.
2.
3.
 class  A {

  { ... btnOK.addActionListener ( new  ActionListener() {  public   void  actionPerformed .... }); ... }
}

второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством.
...
Рейтинг: 0 / 0
Программирование
    #35380374
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

   class  LsnrOK  extends  ActionListener {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener ( new  LsnrOK()); ... }
}

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

  ActionListener lsnrOK =  new  ActionListener() {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener (lsnrOK); ... }
}

Код: plaintext
1.
2.
3.
 class  A {

  { ... btnOK.addActionListener ( new  ActionListener() {  public   void  actionPerformed .... }); ... }
}

второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством.

У меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами. Если язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться?
...
Рейтинг: 0 / 0
Программирование
    #35380484
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыУ меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами.
Это спасает код от засорения телом анонимных объектов, представляющего собой гораздо большую угрозу читабельности. Подобные "конструируемые на месте" объекты выглядят более-менее нормально в демонстрационных примерах, но когда в реале нужно инициализировать, например, пять кнопок подряд, навесив на каждую по листенеру с двумя-тремя методами, да и тела методов не из одной строки.... Это кошмар.

С практической точки зрения могу назвать эмпирический критерий. Если некоторый программный код выиграет в читабельности от того, что тела подпрограмм будут разбиты пустыми строками - значит, либо этот код плохо написан, либо язык в этом месте имеет неудачный синтаксис.

Вообще, как всегда забавно развитие истории по спирали. Когда-то существовало понятие вложенных, или локальных, подпрограмм. И развитие ООП шло в том числе под лозунгом "наконец-то мы можем уйти от этих жутких, нечитаемых вложенных подпрограмм к простым и ясным последовательно записанным методам объектов". После чего прошло еще несколько лет, и концепцию возродили в виде вложенных объектов, или - в C++ - локальных структур.

ГыЕсли язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться?
Во-первых, язык не представляет возможности писать лаконично и чисто. Ява-программы очень громоздки, и даже если в одном конкретном месте можно сэкономить несколько символов, на общем качестве кода это практически не сказывается.

Во-вторых, эта возможность немасштабируема. Ей можно с незначительным выигрышем воспользоваться в маленьком и простом случае, но она приводит к отвратительным последствиям в более сложных. При такой комбинации плюсов и минусов я полагаю правильным не пользоваться ей никогда - целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя".
...
Рейтинг: 0 / 0
Программирование
    #35380572
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть именованный объект анонимного класса - нормально, анонимный объект именованного класса тоже, а вот вместе ни-ни? Похоже на религию.
Просто у меня подход, что если на текущий момент создаваемый экземпляр не нужен нигде более я не постесняюсь применить и анонимный объект и анонимный класс. Если же я вижу, что получившаяся конструкция нечитаема (а на самом деле человеку, который мало работает с явой она просто непривычна), я ничтоже сумняшеся ее вынесу. Решать я это буду в каждом случае индивидуально.
Потом, многие жалуются на засилие кодеманки, а сами же волевым решщением отбирают у человека возможность думать и принимать решение: "целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя""
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 2 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]