OberonCore https://forum.oberoncore.ru/ |
|
Терминологический спор. Что такое конструктор? https://forum.oberoncore.ru/viewtopic.php?f=23&t=4326 |
Страница 2 из 2 |
Автор: | prospero78 [ Четверг, 14 Апрель, 2016 15:48 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Цитата: Нет. Ещё раз повторю, конструктор = аллокатор + инициализатор Конструктор ничего не размещает. Ты заблуждаешься. Тот пример, что ты привёл -- замечательный, но Окам тебя не одобряет. Обобщение над аллокатором и конструктором излишне. Почему -- написал выше. Цитата: Если ПРИ создании - то инициализатор, Если ПРИ конструировании -- то инициализатор. .... ? Хотелось бы услышать мнение старших товарищей, хотя авторитетные люди уже мне дали исчерпывающий ответ (Мадзи, Пётр, Иван). Может быть Ткачёв выскажет своё мнение? |
Автор: | kemiisto [ Четверг, 14 Апрель, 2016 16:03 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
prospero78 писал(а): Конструктор ничего не размещает. Ты заблуждаешься. Никак нет. Заблуждаешься ты. prospero78 писал(а): Тот пример, что ты привёл -- замечательный, но Окам тебя не одобряет. Во-первых, пиши фамилию Оккама правильно. Во-вторых, не говори за него. В-третьих, как я сразу указал, это не мой пример, это подход, предложенный Мёссенбёком во втором издании Object-Oriented Programming in Oberon-2 (см. раздел 8.1 Initialization of Objects). prospero78 писал(а): Обобщение над аллокатором и конструктором излишне. Почему -- написал выше. Что ещё за "обобщение" и где ты о нём писал выше? prospero78 писал(а): Хотелось бы услышать мнение старших товарищей, хотя авторитетные люди уже мне дали исчерпывающий ответ (Мадзи, Пётр, Иван). Может быть Ткачёв выскажет своё мнение? Тебе мнения одного из отцов-основателей Оберонов уже недостаточно? Почитай Мёссенбёка, ей богу, прежде чем за Оккама говорить. Пётр Кушнир в самом начале темы пример привёл. Правда, это уже из третьего издания, но там чёрным по белому всё написано. Цитата: 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. Так что конструктор выделяет память под объект, а затем инициализирует его. И это не только в Обероне так.
|
Автор: | prospero78 [ Четверг, 14 Апрель, 2016 16:34 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Цитата: Во-первых, пиши фамилию Оккама правильно. Во-вторых, не говори за него. Хм, т. е. тебе мне указывать можно, а мне за Оккама нельзя? Ну я тебя понял) Демократия на марше))) Цитата: Что ещё за "обобщение" и где ты о нём писал выше? Цитата: >>Если ПРИ создании - то инициализатор, Если ПРИ конструировании -- то инициализатор. .... ? Цитата: Тебе мнения одного из отцов-основателей Оберонов уже недостаточно? Я так понимаю, что Путин тоже не ошибается?))) Цитата: Правда, это уже из третьего издания, но там чёрным по белому всё написано. Точно! Код: Цель паттерна "конструктор" - создание и инициализация объекта. Объект класса описывается в программе явно. Конструктор тут ни при чём. Это воля программиста. Конструктор производит первоначальное заполнение структур. |
Автор: | Info21 [ Четверг, 14 Апрель, 2016 23:20 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Спасибо за комплимент. Буганьдан -- не достоин. Мёссенбёк -- не вполне "отец-основатель", а Оберон-2 -- не вполне удачная попытка. Важнее чётко развести понятия, а насчёт словесных ярлычков просто оговариваться, кто в каком смысле их употребляет. 1. Есть шаблон-схема-паттерн. 2. Есть отдельно примитив размещения/аллокации. 3. Есть отдельно примитив инициализации. 4. Есть функции/методы, реализующие шаблон или его части. Управление памятью -- настолько важная вещь, что требуется возможность разнести 2 и 3, пример приведён, можно привести ещё (реализации какого-нибудь алгоритма Карацубы). У сочинителей нотаций программирования языки без костей, как мозги без руля и без ветрил. Но как употребляет слова пресловутый мейнстрим, если там есть какой-то квази-консенсус -- это некая данность, которую полезно иметь в виду для целей коммуникации. Лично я привык говорить "фабричная функция", "фабричный объект" (которые directory в Блэкбоксе -- тоже какое-то нестандартное и оттого не вполне удобное словцо, разве что для файловой системы естественное). Что структуры данных должны быть инициализированы перед началом работы с ними -- это некий инвариант сознания ("техническая ценность"), нужды обозначать это ярлычком не чувствую, даже, пожалуй, слово "конструктор" тут может быть не вполне удобным: проще спросить "Где инициализируется этот массив?". Если приставлять "шаблон" или "функция" к "фабрике" или "конструктору", то путаницы не должно возникать. Который термин победит в будущих поколениях, лично мне по барабану. |
Автор: | prospero78 [ Пятница, 15 Апрель, 2016 00:59 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Тааак! ))) Кемисто, что у нас там было про отцов-основателей? |
Автор: | kemiisto [ Понедельник, 18 Апрель, 2016 00:45 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Короче, поштудировал в эти выходные первоисточники, так сказать. Недопонимание между мной и 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#), процедуру, инициализирующую объект продолжали именовать конструктором. Но таки не все... Но есть и контр-примеры из мейнстрима, уже приведённые в обсуждении:
Суть, в том, что имеется два подхода.
Весь вопрос только в том, позволяет ли подход Мёссенбёка делать всё то, что могут конструкторы "в стиле С++"? Сходу сказать не могу, поздно же, котелок не варит. ------ *) На самом деле синтаксически то в С++ можно написать выражение, в котором конструктор вызывается как обычная функция (когда создаёте объект "на стеке"), Код: Foo f = Foo(param); но эту дичь можно проигнорировать, ведь это выражение только выглядит как вызов функции, но на самом деле таковым не является.
|
Автор: | kemiisto [ Понедельник, 18 Апрель, 2016 01:01 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Info21 писал(а): Мёссенбёк -- не вполне "отец-основатель", Хммм... Ну если и его не считать, то кто вообще тогда будет в "отцах-основателях" Оберонов, кроме Вирта? И к слову, а какая попытка была удачной? КП?а Оберон-2 -- не вполне удачная попытка. Info21 писал(а): Важнее чётко развести понятия, а насчёт словесных ярлычков просто оговариваться, кто в каком смысле их употребляет. Согласен полностью. Info21 писал(а): Управление памятью -- настолько важная вещь, что требуется возможность разнести 2 и 3, пример приведён, можно привести ещё (реализации какого-нибудь алгоритма Карацубы). Тут вопрос не в том, надо или не надо разносить, а в том, что делает конструктор: только 3, или таки и 2 и 3. Понятно, что как вы яхту назовёте... На то он и терминологический спор. Info21 писал(а): У сочинителей нотаций программирования языки без костей, как мозги без руля и без ветрил. Но как употребляет слова пресловутый мейнстрим, если там есть какой-то квази-консенсус -- это некая данность, которую полезно иметь в виду для целей коммуникации. Да, да, именно об этом и речь. Выше постарался подробно изложить. Info21 писал(а): Лично я привык говорить "фабричная функция", "фабричный объект" (которые directory в Блэкбоксе -- тоже какое-то нестандартное и оттого не вполне удобное словцо, разве что для файловой системы естественное). Иван Кузьмицкий упоминал ранее, что фабрика и конструктор - разные паттерны: фабрика создаёт объект, динамический тип которого заранее неизвестен, а конструктор - объект, динамический тип которого известен (совпадает со статическим). Иногда нужно так, а в других случаях - эдак. |
Автор: | prospero78 [ Понедельник, 18 Апрель, 2016 09:04 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Ну так вот получается, что с одной стороны одинокая Симула, а с другой -- С++ и все-все-все. Вот и пусть будет "конструктор" как у "все-все-все". |
Автор: | kemiisto [ Понедельник, 18 Апрель, 2016 12:26 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
prospero78 писал(а): Вот и пусть будет "конструктор" как у "все-все-все". Не аргумент. Знать, как у всех - это одно, а вот делать точно также - совсем не обязательно. Да и вообще, как там было у Алана "нашего" Кея?Цитата: Я придумал термин «объектно-ориентированный», и вот что я вам скажу, я не имел ввиду С++. Да, кстати, понятия конструктор не было и в Smalltalk, а экземпляры класса порождались примерно так же, как уже было показано на примере его идейного наследника Objective-C: классу посылались два сообщения - одно для выделения памяти (по договорённости, правда, в Smalltalk оно обычно имеет имя new, а не alloc как в Objective-C) и затем уже инициализатор. Опять же почему нет конструкторов "в стиле С++"? Потому что унифицированный синтаксис: есть только посылка сообщения (вызов процедуры), а конструкторы "в стиле С++" требуют специальных языковых конструкций. Так что если хотите, чтобы было "как у всех", то надо язык менять: конструктор то только инициализирует объект, но ничего не возвращает, а вот его вызов - и выделяет память, и инициализирует объект, да ещё и возвращает его. Тут нужны специальные синтаксические конструкции.
|
Автор: | prospero78 [ Понедельник, 18 Апрель, 2016 13:50 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Нет. Менять язык ересь. Просто остановимся на том, что есть аллокатор и конструктор. И довольно. Никаких сущностей больше не надо. alloc мне не нравится. NEW куда понятнее и "высокоуровневей". Можно вместо аллокатор говорить ньюватор, но это опять же излишняя сущность. Пусть так и останется аллокатор (а-локатор, типа как перво-локатор, или альфа-локатор, или а-бомба по аналогии). Цитата: Цитата: Вот и пусть будет "конструктор" как у "все-все-все". Не аргумент. Знать, как у всех - это одно, а вот делать точно также - совсем не обязательно. Да и вообще, как там было у Алана "нашего" Кея? Совесть не мучает, не читал. Делать не обязательно и совсем не призываю. Делать нужно так, чтобы 1)надёжно, 2)рационально. Речь идёт про то, что сверхреволюционность и сверхпростота, и вообще сверх -- плохо. Даже в КП есть нетипизированные ссылки, опасные операции и т. д. Но это не значит, что их следует использовать. Риск оправдан только тогда, когда стандартные средства исчерпали себя. Введение новой сущности -- такой же риск не справиться со сложностью. Как и новые сущности, дублирующие сущности, или искажающие общепринятые смыслы уже существующих сущностей (даже если название сущности не отражает адекватно суть самой сущности) |
Автор: | Info21 [ Среда, 20 Апрель, 2016 20:54 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Мёссенбёк -- всего лишь аспирант, сделавший довольно очевидный, чисто комбинаторный эксперимент, оказавшийся неудачным (что послужило весомой причиной сделать КП). Есть 1 "классические" Обероны от Вирта, 2 недоработанный Оберон-2, 3 Компонентный Паскаль от Оберон майкросистемз. При прочих равных выбор можно обсуждать только между 1 и 3. И КП, на мой взгляд, удобней: в текущем, приличном по сложности проекте есть возможность примерять старый Оберон: да, обойтись можно, но в КП код чище и фенечки с NEW (у методов) и т.п. сберегают силы. |
Автор: | Пётр Кушнир [ Четверг, 21 Апрель, 2016 00:28 ] |
Заголовок сообщения: | Re: Терминологический спор. Что такое конструктор? |
Помню, как я понял, что такое Коньструктор в терминах ББ. Это неизвестное науке слово может быть определено как "...oбёртка над NEW". viewtopic.php?f=2&t=5012&hilit=+NewRec viewtopic.php?f=127&t=4940 |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |