OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 13 Декабрь, 2018 09:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Четверг, 14 Апрель, 2016 15:48 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Цитата:
Нет. Ещё раз повторю, конструктор = аллокатор + инициализатор

Конструктор ничего не размещает. Ты заблуждаешься.
Тот пример, что ты привёл -- замечательный, но Окам тебя не одобряет.

Обобщение над аллокатором и конструктором излишне. Почему -- написал выше.

Цитата:
Если ПРИ создании - то инициализатор,

Если ПРИ конструировании -- то инициализатор. .... ?

Хотелось бы услышать мнение старших товарищей, хотя авторитетные люди уже мне дали исчерпывающий ответ (Мадзи, Пётр, Иван). Может быть Ткачёв выскажет своё мнение?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Апрель, 2016 16:03 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 232
prospero78 писал(а):
Конструктор ничего не размещает. Ты заблуждаешься.

Никак нет. Заблуждаешься ты.

prospero78 писал(а):
Тот пример, что ты привёл -- замечательный, но Окам тебя не одобряет.

Во-первых, пиши фамилию Оккама правильно. Во-вторых, не говори за него. В-третьих, как я сразу указал, это не мой пример, это подход, предложенный Мёссенбёком во втором издании Object-Oriented Programming in Oberon-2 (см. раздел 8.1 Initialization of Objects).

prospero78 писал(а):
Обобщение над аллокатором и конструктором излишне. Почему -- написал выше.

Что ещё за "обобщение" и где ты о нём писал выше?

prospero78 писал(а):
Хотелось бы услышать мнение старших товарищей, хотя авторитетные люди уже мне дали исчерпывающий ответ (Мадзи, Пётр, Иван). Может быть Ткачёв выскажет своё мнение?

Тебе мнения одного из отцов-основателей Оберонов уже недостаточно? :shock: Почитай Мёссенбёка, ей богу, прежде чем за Оккама говорить. Пётр Кушнир в самом начале темы пример привёл. Правда, это уже из третьего издания, но там чёрным по белому всё написано.

Цитата:
When creating an object it is desirable to initialize its fields. If you do not want to forget the initialization, it is reasonable to combine creation and initialization into a single action. This is the purpose of the constructor pattern.
Цель паттерна "конструктор" - создание и инициализация объекта. Да просто код посмотри у процедуры NewT, которая суть есть конструктор, в примере: там первым делом как раз выделяется память посредством NEW. Так что конструктор выделяет память под объект, а затем инициализирует его. И это не только в Обероне так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Апрель, 2016 16:34 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Цитата:
Во-первых, пиши фамилию Оккама правильно. Во-вторых, не говори за него.

Хм, т. е. тебе мне указывать можно, а мне за Оккама нельзя? Ну я тебя понял) Демократия на марше)))

Цитата:
Что ещё за "обобщение" и где ты о нём писал выше?

Цитата:
>>Если ПРИ создании - то инициализатор,
Если ПРИ конструировании -- то инициализатор. .... ?


Цитата:
Тебе мнения одного из отцов-основателей Оберонов уже недостаточно?

Я так понимаю, что Путин тоже не ошибается?)))

Цитата:
Правда, это уже из третьего издания, но там чёрным по белому всё написано.

Точно!

Код:
Цель паттерна "конструктор" - создание и инициализация объекта.

Объект класса описывается в программе явно. Конструктор тут ни при чём. Это воля программиста. Конструктор производит первоначальное заполнение структур.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Апрель, 2016 23:20 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7932
Откуда: Троицк, Москва
Спасибо за комплимент. Буганьдан -- не достоин.

Мёссенбёк -- не вполне "отец-основатель",
а Оберон-2 -- не вполне удачная попытка.

Важнее чётко развести понятия, а насчёт словесных ярлычков просто оговариваться, кто в каком смысле их употребляет.

1. Есть шаблон-схема-паттерн.
2. Есть отдельно примитив размещения/аллокации.
3. Есть отдельно примитив инициализации.
4. Есть функции/методы, реализующие шаблон или его части.

Управление памятью -- настолько важная вещь, что требуется возможность разнести 2 и 3, пример приведён, можно привести ещё (реализации какого-нибудь алгоритма Карацубы).

У сочинителей нотаций программирования языки без костей, как мозги без руля и без ветрил.
Но как употребляет слова пресловутый мейнстрим, если там есть какой-то квази-консенсус -- это некая данность, которую полезно иметь в виду для целей коммуникации.

Лично я привык говорить "фабричная функция", "фабричный объект" (которые directory в Блэкбоксе -- тоже какое-то нестандартное и оттого не вполне удобное словцо, разве что для файловой системы естественное).

Что структуры данных должны быть инициализированы перед началом работы с ними -- это некий инвариант сознания ("техническая ценность"), нужды обозначать это ярлычком не чувствую, даже, пожалуй, слово "конструктор" тут может быть не вполне удобным: проще спросить "Где инициализируется этот массив?".

Если приставлять "шаблон" или "функция" к "фабрике" или "конструктору", то путаницы не должно возникать.

Который термин победит в будущих поколениях, лично мне по барабану.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Апрель, 2016 00:59 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Тааак! )))
Кемисто, что у нас там было про отцов-основателей?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 18 Апрель, 2016 00:45 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 232
Короче, поштудировал в эти выходные первоисточники, так сказать. Недопонимание между мной и prospero78 было вызвано тем, что я использовал понятие конструктора, данное Мёссенбёком, а он, видимо, привычное понятие из мейнстримных языков. У Мёссенбёка конструктор выделяет память под объект и инициализирует его, а вот в мейнстриме преимущественно только инициализирует. И ветер конструкторов, которые только инициализируют, похоже, дует с С++.

Симула

ООП гражданин Строструп добавил в С, взяв за основу язык Симула. В Симуле понятия конструктора вообще не было, там экземпляр класс (объект) порождается (is generated) как результат вычисления значения выражения, известного как генератора объекта (object generator) и определённого следующим образом:
Код:
    <object generator> ::=
        new <class identifier><actual parameter part>

Тут, правда, нужно понимать, что в Симуле класс - это всего-навсего разновидность процедуры, правда особая разновидность. Такая, которая определяет блок кода, время жизни экземпляров которого не ограничено вызовом этой процедуры. Поэтому синтаксически определение класса в Симуле выглядит почти так же, как определение процедуры, только начинается с нового зарезервированного слова class, а потом как для процедуры: идентификатор, список формальных параметров, и т.д.
Код:
    <class declaration> ::= <prefix><main  part>
    <main part> ::= class <class identifier>
                    <formal parameter part>;
                    <value part><specification part>
                    <virtual part><class body>

И создание экземпляра класса синтаксически лишь чуточку отличается от создания экземпляра обычной процедуры (путём её вызова): в генераторе объекта присутствует новое зарезервированное слово new. А так, всё как при вызове процедуры: значения фактических параметров используются для инициализации значений формальных параметров.

С++ и (почти) все-все-все

В С++ классы не имеют никакого отношения к процедурам, они родственны структурам в языке С. Но синтаксис создания экземпляра класса таки скалькирован из Симулы: new, а затем... А вот что затем? В Симуле было имя класса, который суть есть процедура, и список фактических параметров. Но ведь в С++ то класс уже не процедура. :) Значит, нужно добавить какую-ту процедуру в класс, которая будет использоваться при создании объекта с той же целью, с которой в Симула использовался сам класс: для инициализации значений членов класса С++, которые играют роль формальных параметров классов Симула. Вот это-ту процедуру Строструп по какой-то непонятной причине назвал конструктором (constructor), хотя куда более подходящий термин инициализатор был бы много прозрачнее. Отмечу мимоходом, что уже упомянутое прямое калькирование идиомы порождения объекта из Симулы и привело к тому небезызвестному факту, что конструктор в С++ имеет тоже самое имя что и класс. :) Но тут есть нюанс: строго говоря, конструктор в С++ - это не процедура, т.к. у него нет возвращаемого значения. Поэтому и вызывать его, как обычную процедуру нельзя*, нужно использовать специальную конструкцию, скалькированную с Симулы,
Код:
Foo* f = new Foo(param);

Ну а дальше это дело разошлось: в любом языке, "срисованном" с С++ (см. Java, C#), процедуру, инициализирующую объект продолжали именовать конструктором.

Но таки не все...

Но есть и контр-примеры из мейнстрима, уже приведённые в обсуждении:
  • Иван Кузьмицкий упоминал Go, в котором нет конструкторов, и приводил ссылку, в которой паттерн конструктор реализован в точности, как у Мёссенбёка: по схеме alloc-init-return. Вот ещё, пожалуйста, обсуждение этого вопроса со Stack Overflow: все тот же шаблон alloc-init-return и никого не смущает, что в С++ и иже с ними конструктор только инициализирует: при его вызове сначала выделяется память, а уже потом происходит инициализация, как описано в конструкторе.
  • Ну и я приводил в пример Objective-C, в котором составные части конструктора названы своими именами (alloc, init).

Суть, в том, что имеется два подхода.
  • Либо в языке должны быть специальные синтаксические конструкции как для определения, так и для вызова конструктора "в стиле С++", так как такой конструктор - это не процедура (он ничего не возвращает), а следовательно и объявлять, и вызывать его нужно как-то по-особому.
  • Либо можно организовать реализацию паттерна конструктор "по-Мёссенбёку" обычной процедурой, которая вернёт ссылку на созданные объект. В нутрях процедуры будет, естественно, alloc-init-return.

Весь вопрос только в том, позволяет ли подход Мёссенбёка делать всё то, что могут конструкторы "в стиле С++"? Сходу сказать не могу, поздно же, котелок не варит. :)

------
*) На самом деле синтаксически то в С++ можно написать выражение, в котором конструктор вызывается как обычная функция (когда создаёте объект "на стеке"),
Код:
Foo f = Foo(param);
но эту дичь можно проигнорировать, ведь это выражение только выглядит как вызов функции, но на самом деле таковым не является.


Последний раз редактировалось kemiisto Понедельник, 18 Апрель, 2016 01:04, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 18 Апрель, 2016 01:01 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 232
Info21 писал(а):
Мёссенбёк -- не вполне "отец-основатель",
а Оберон-2 -- не вполне удачная попытка.
Хммм... Ну если и его не считать, то кто вообще тогда будет в "отцах-основателях" Оберонов, кроме Вирта? И к слову, а какая попытка была удачной? КП?

Info21 писал(а):
Важнее чётко развести понятия, а насчёт словесных ярлычков просто оговариваться, кто в каком смысле их употребляет.

Согласен полностью.

Info21 писал(а):
Управление памятью -- настолько важная вещь, что требуется возможность разнести 2 и 3, пример приведён, можно привести ещё (реализации какого-нибудь алгоритма Карацубы).

Тут вопрос не в том, надо или не надо разносить, а в том, что делает конструктор: только 3, или таки и 2 и 3. Понятно, что как вы яхту назовёте... На то он и терминологический спор. :)

Info21 писал(а):
У сочинителей нотаций программирования языки без костей, как мозги без руля и без ветрил.
Но как употребляет слова пресловутый мейнстрим, если там есть какой-то квази-консенсус -- это некая данность, которую полезно иметь в виду для целей коммуникации.

Да, да, именно об этом и речь. Выше постарался подробно изложить.

Info21 писал(а):
Лично я привык говорить "фабричная функция", "фабричный объект" (которые directory в Блэкбоксе -- тоже какое-то нестандартное и оттого не вполне удобное словцо, разве что для файловой системы естественное).

Иван Кузьмицкий упоминал ранее, что фабрика и конструктор - разные паттерны: фабрика создаёт объект, динамический тип которого заранее неизвестен, а конструктор - объект, динамический тип которого известен (совпадает со статическим). Иногда нужно так, а в других случаях - эдак.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 18 Апрель, 2016 09:04 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Ну так вот получается, что с одной стороны одинокая Симула, а с другой -- С++ и все-все-все.
Вот и пусть будет "конструктор" как у "все-все-все".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 18 Апрель, 2016 12:26 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 232
prospero78 писал(а):
Вот и пусть будет "конструктор" как у "все-все-все".
Не аргумент. Знать, как у всех - это одно, а вот делать точно также - совсем не обязательно. Да и вообще, как там было у Алана "нашего" Кея?
Цитата:
Я придумал термин «объектно-ориентированный», и вот что я вам скажу, я не имел ввиду С++.
:lol: Да, кстати, понятия конструктор не было и в Smalltalk, а экземпляры класса порождались примерно так же, как уже было показано на примере его идейного наследника Objective-C: классу посылались два сообщения - одно для выделения памяти (по договорённости, правда, в Smalltalk оно обычно имеет имя new, а не alloc как в Objective-C) и затем уже инициализатор. Опять же почему нет конструкторов "в стиле С++"? Потому что унифицированный синтаксис: есть только посылка сообщения (вызов процедуры), а конструкторы "в стиле С++" требуют специальных языковых конструкций. Так что если хотите, чтобы было "как у всех", то надо язык менять: конструктор то только инициализирует объект, но ничего не возвращает, а вот его вызов - и выделяет память, и инициализирует объект, да ещё и возвращает его. Тут нужны специальные синтаксические конструкции.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 18 Апрель, 2016 13:50 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Нет. Менять язык ересь.
Просто остановимся на том, что есть аллокатор и конструктор. И довольно. Никаких сущностей больше не надо.
alloc мне не нравится. NEW куда понятнее и "высокоуровневей".
Можно вместо аллокатор говорить ньюватор, но это опять же излишняя сущность. Пусть так и останется аллокатор (а-локатор, типа как перво-локатор, или альфа-локатор, или а-бомба по аналогии).
Цитата:
Цитата:
Вот и пусть будет "конструктор" как у "все-все-все".

Не аргумент. Знать, как у всех - это одно, а вот делать точно также - совсем не обязательно. Да и вообще, как там было у Алана "нашего" Кея?

Совесть не мучает, не читал. Делать не обязательно и совсем не призываю. Делать нужно так, чтобы 1)надёжно, 2)рационально.
Речь идёт про то, что сверхреволюционность и сверхпростота, и вообще сверх -- плохо.
Даже в КП есть нетипизированные ссылки, опасные операции и т. д. Но это не значит, что их следует использовать. Риск оправдан только тогда, когда стандартные средства исчерпали себя. Введение новой сущности -- такой же риск не справиться со сложностью.
Как и новые сущности, дублирующие сущности, или искажающие общепринятые смыслы уже существующих сущностей (даже если название сущности не отражает адекватно суть самой сущности)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 20 Апрель, 2016 20:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7932
Откуда: Троицк, Москва
Мёссенбёк -- всего лишь аспирант, сделавший довольно очевидный, чисто комбинаторный эксперимент, оказавшийся неудачным (что послужило весомой причиной сделать КП).

Есть
1 "классические" Обероны от Вирта,
2 недоработанный Оберон-2,
3 Компонентный Паскаль от Оберон майкросистемз.

При прочих равных выбор можно обсуждать только между 1 и 3.

И КП, на мой взгляд, удобней:
в текущем, приличном по сложности проекте есть возможность примерять старый Оберон: да, обойтись можно, но в КП код чище и фенечки с NEW (у методов) и т.п. сберегают силы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 21 Апрель, 2016 00:28 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2538
Откуда: Россия, Ярославль
Помню, как я понял, что такое Коньструктор в терминах ББ. Это неизвестное науке слово может быть определено как "...oбёртка над NEW".
viewtopic.php?f=2&t=5012&hilit=+NewRec
viewtopic.php?f=127&t=4940


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB