08.07.2008, 12:22 | #1 |
Участник
|
new() и init()
Добрый день
Стало любопытно умеет init() класса того, что не умеет new() |
|
08.07.2008, 12:27 | #2 |
Программатор
|
Краткость конечно сестра таланта, но не на столько же.
|
|
08.07.2008, 12:32 | #3 |
Боец
|
Цитата:
Стало любопытно умеет init() класса того, что не умеет new()
new() - конструктор, присутствует в любом классе. init() - просто метод, присутствует не во всех классах. Технически - это обычные методы и могут содержать любой код. Далее - всё зависит от логики потроения класса. В кернеловских классах (в частности на формах) конструктор лучше не трогать - сразу взлет. |
|
08.07.2008, 12:33 | #4 |
Axapta
|
|
|
08.07.2008, 22:25 | #5 |
Участник
|
init() можно запустить повторно. Предполагается что будет выполнена переинициализация. уже созданных объектов.
new() создает объекты. Как правило, на уже существующем объекте повторно его вызывать нельзя. |
|
09.07.2008, 00:18 | #6 |
Участник
|
Не сочтите за снобизм, но напомнило Joel on Software, Назад, к основам:
Цитата:
Я придерживаюсь мнения, что студенты, начинающие изучать программирование, должны начинать с начала, использовать C и подниматься вверх от процессора. Мне противно, как часто программа обучения строится на посылке, что Java представляет собой хороший язык для того, чтобы начинать программировать, потому что это так "просто" и не нужно отвлекаться на эти скучные детали про строки и выделение памяти, и сразу можно изучить кульные ООП-штучки которые помогут сделать ваши большие программы так восхитительно модульными.
В общем-то, все ключевые слова тут уже упоминали; если вы прежде изучали ООП, то разница между конструктором класса и методом класса должна вам все объяснить. |
|
09.07.2008, 12:14 | #7 |
Участник
|
gl00mie
Как мне кажется, происходит путаница понятий В системе Axapta создание объекта - это команда X++: myVar = new MyObject() Т.е. внутри метода new() экземпляр объекта уже существует. Внутри метода new() объекта вполне допустимо обращение к методам этого объекта через this.MyMethod(). На всякий случай напомню, что речь идет о классах, а не о формах или отчетах. Это означает, что конструирование объекта Axapta происходит ДО вызова метода new() этого же объекта. Просто разработчики Axapta предоставили возможность ПОСЛЕ конструирования объекта добавить некий код. По сути, new() - это событие, т.е. некий программный код, который выполняется автоматически, при подаче команды new на создание объекта. А вот метод init() - это именно метод. Т.е. некий программный код, который надо запускать на выполнение явно. Специальной командой. Автоматического выполнения метода init() никогда не происходит. Только явно по команде. С точки зрения разработчика - нет никакой разницы где именно писать код инициализации параметров объекта. В событии new() объекта или в методе init(). Отличия между ними только и исключительно в способе вызова. Выполнение new() произойдет автоматически, а для выполнения init() надо подать специальную команду. Как следствие, выполнение init() можно отложить, чтобы выполнить, например, ряд проверок. Или же вызвать метод init() повтороно, для переинициализации всех свойств объекта. А выполнение new() отложить невозможно. Следовательно, логично в событии new() объекта делать безусловную инициализацию свойств объекта (значения по умолчанию для переменных). А в методе init() выполнять "условную" инициализацию свойств с последующим анализом значения, возвращаемого этим методом для принятия решения о дальнейшей работе с этим объектом. PS: А насчет того, что переменная myVar не существует пока не будет завершена команда new MyObject(), так к обсуждаемой проблеме это не имеет никакого отношения. То же самое будет и с любой переменной, значение которой вычисляется в каком-либо методе любого класса. Пока вычисления не завершены, естесственно, значение не известно. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
09.07.2008, 15:02 | #8 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Как мне кажется, происходит путаница понятий. В системе Axapta создание объекта - это команда
X++: myVar = new MyObject() Цитата:
К слову, в зависимости от реализации класса обращения к тем или иным методам внутри конструктора могут привести к некорректным результатам, если методы предполагают, что конструктор уже отработал, и какие-то внутренние структуры или объекты уже инициализированы - это опять же к вопросу о том, когда кусок выделенной памяти становится объектом. Цитата:
Если посмотреть, что происходит непосредственно в ядре, то увидим следующее:
Цитата:
По поводу контрактной модели см., например, Объектно-ориентированный анализ и проектирование Гради Буча. Последний раз редактировалось gl00mie; 09.07.2008 в 15:12. Причина: typo |
|
|
За это сообщение автора поблагодарили: mazzy (2), konopello (2), Evgeniy2020 (2). |
09.07.2008, 15:13 | #9 |
Участник
|
Цитата:
Инвариант: Конструирование объекта полностью завершено после завершения конструктора new(). Или, другими словами, объект становится валидным (целостным) после завершения конструктора new(). Другие утверждения не всегда истинны. Если я правильно понимаю gl00mie, то он хочет сказать именно это. |
|
09.07.2008, 16:04 | #10 |
Боец
|
И хватает же у вас времени, господа, так активно дискутировать по такой незначительной теме... По-моему всем все давно понятно (ещё до этого поста). Играть словами можно до бесконечности и врядли это к чему-то полезному приведет. Может автор поста вообще закатил этот шар по-приколу...
|
|
09.07.2008, 16:13 | #11 |
Участник
|
На самом деле - очень интересно, потому что видно, что даже самые "старые" участники форума не имеют четкого представления о том, как на самом деле что работает / должно работать.
И, возможно, полезно было бы прочитать последний ответ, в котором они бы сошлись во мнении конкретном, которое новички могли бы почитать и понять, что самое главное. |
|
09.07.2008, 21:04 | #12 |
Участник
|
gl00mie
К сожалению, я изучал ООП не по учебникам, а на практике, методом "научного тыка". Поэтому, для меня имеет реальное значение не то, как оно "должно быть" с точки зрения теории, а то, как оно есть на практике. Могут ли те или иные мои действия привести к проблемам или нет? Собственно, насколько я понимаю, смысл Вашего сообщения сводится к тому, что в процессе выполнения конструктора new() данного объекта сам объект еще не завершен и, как следствие, некие действия с этим объектом могут закончится неудачей. Именно по той причине, что произойдет обращение к "не законченным частям" объекта. На практике же я вижу, что таких конфликтов не происходит. Возможно, конечно, мне просто в голову не приходят такие действия, которые могут привести к конфликтам в данном случае. А это значит, что вопрос именно философский. Не из цикла "что можно?", а из цикла "что дОлжно?". Поскольку, с точки зрения формального написания кода, какая-либо инициализация в конструкторе new() будет происходить точно так же, как и в любом другом методе объекта. |
|
09.07.2008, 22:28 | #13 |
Участник
|
LedgerJournalEngine, LedgerVoucher, SalesType, SalesFormLetter, класс работы с принтером, классы работы с Vatiant'ами, FormBuild*, QueryBuild* и т.п... Даже простые формы... Тут конечно надо разобраться, но с огромной вероятностью, конфликт вы там получите.
|
|
10.07.2008, 15:32 | #14 |
Участник
|
Хм... Это предложение переписать стандартный функционал или подтверждение моих выводов?
|
|