Выноска с привязкой к блоку

Автор Тема: Выноска с привязкой к блоку  (Прочитано 14701 раз)

0 Пользователей и 6 Гостей просматривают эту тему.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #15 : 25-11-2014, 23:26:25 »
Вместо BlockReference br лучше\надёжней\безопасней передавать его ObjectId.
 - Transaction tr лишний, его можно получить из db.
Это спорные утверждения...
з.ы. по второму уже без меня разобрались
А по первому, я в прошлом не раз сталкивался с тем, что в переменную передавалась ссылка на объект, который к тому времени уже прекращал своё существование в виду того, что точка выполнения кода уже покинула блок using транзакции, в рамках которой этот объект был создан. Как следствие возникали всякие Fatal Error и прочие прелести.

Отсюда вывод: зачастую надёжней\безопасней оперировать ObjectId и получать его объект по необходимости.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выноска с привязкой к блоку
« Ответ #16 : 25-11-2014, 23:27:49 »
Отсюда вывод: зачастую надёжней\безопасней оперировать ObjectId и получать его объект по необходимости.
+100. Для .NET это достаточно актуально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #17 : 25-11-2014, 23:28:02 »
А Database.TransactionManager.TopTransaction тебя не устроит для этой цели?
Не всегда. Порой нужно откатывать лишь некоторые изменения, в то же время сохраняя другие.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #18 : 25-11-2014, 23:39:18 »
Если в коде метода Editor нужен лишь для того, чтобы отправлять сообщения в консоль, то я предпочитаю в качестве параметра передавать указатель на метод, имеющий тип

Код - C# [Выбрать]
  1. delegate void WriteMessage(String format, params String[] values);

Это позволяет использовать мой код без изменений даже в автономных exe приложениях. Например, в консольных приложениях, я параметром передаю указатель на Console.Write. А в плагинах различных CAD систем - указатель на ed.WriteMessage.

Чем выше уровень абстракции и чем меньше зависимостей в коде - тем лучше.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Выноска с привязкой к блоку
« Ответ #19 : 25-11-2014, 23:48:43 »
А Database.TransactionManager.TopTransaction тебя не устроит для этой цели?
Если одновременно с двумя документами - то не всегда (иногда проще передать транзакцию чем ее DB).

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Выноска с привязкой к блоку
« Ответ #20 : 25-11-2014, 23:51:33 »
Чем выше уровень абстракции и чем меньше зависимостей в коде - тем лучше.
Андрей - тебе пора переходить на функциональные языки - там с абстракциями все в порядке.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #21 : 25-11-2014, 23:53:00 »
Андрей - тебе пора переходить на функциональные языки - там с абстракциями все в порядке.
Почитываю\пробую Haskell.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Выноска с привязкой к блоку
« Ответ #22 : 26-11-2014, 00:01:35 »
Одобряю - хороший выбор.   ;)

ИХМО чтобы более широко вникнуть в "тему" - лучше всего Scheme (он-же Racket)
для .Net - F# - это такой обыдленный упрощенный до платформы Haskell (или адаптированный под .Net OCaml).
Но Хаскель тоже весьма хорош.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выноска с привязкой к блоку
« Ответ #23 : 26-11-2014, 00:21:06 »
Если одновременно с двумя документами - то не всегда (иногда проще передать транзакцию чем ее DB).
Не понял о чем это ты, если у каждого документа свой TransactionManager и соответственно своя TopTransaction.

Не всегда. Порой нужно откатывать лишь некоторые изменения, в то же время сохраняя другие.
Не смеши меня. Сколько раз во всех своих программах ты используешь откат транзакции? И помнишь ли ты, что откат транзакции значительно длительнее чем её Commit.

Андрей Бушман, Дима_, ну вы и наоффтопили...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Выноска с привязкой к блоку
« Ответ #24 : 26-11-2014, 00:28:09 »
вот такие они - холодные зимние питерские вечера...

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Выноска с привязкой к блоку
« Ответ #25 : 26-11-2014, 00:42:57 »
А по первому, я в прошлом не раз сталкивался с тем, что в переменную передавалась ссылка на объект, который к тому времени уже прекращал своё существование в виду того, что точка выполнения кода уже покинула блок using транзакции
Согласен, я уж подзабыл - просто в F# надо специально сильно постараться чтоб так получилось - т.к. там переменных по умолчанию нет - и посему проблемы такой тоже (надо либо создавать переменную, либо вручную dispos'ировать транзакцию).

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #26 : 26-11-2014, 10:21:13 »
Сколько раз во всех своих программах ты используешь откат транзакции?
Честно говоря, так сходу и не вспомню где и когда. Соответственно, если и использовал, то очень редко. :)

И помнишь ли ты, что откат транзакции значительно длительнее чем её Commit.
Конечно помню. Потому и дёргаю Commit даже когда выполнял только лишь чтение.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Выноска с привязкой к блоку
« Ответ #27 : 26-11-2014, 10:24:25 »
А Database.TransactionManager.TopTransaction тебя не устроит для этой цели?
Мне почему-то хочется иметь ссылку именно на ту транзакцию, в которой получен передаваемый объект. Она же тоже может быть вложенной. Она также может быть OpenCloseTransaction, выдаст ли Database.TransactionManager.TopTransaction ссылку на нее? Я не знаю, надо экспериментировать...

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Выноска с привязкой к блоку
« Ответ #28 : 26-11-2014, 10:58:11 »
Мне почему-то хочется иметь ссылку именно на ту транзакцию, в которой получен передаваемый объект. Она же тоже может быть вложенной.
Используя TopTransaction можно спокойно обойтись без вложенных транзакций. Но здесь есть подводный камень: а что, если TopTransaction не существует? Мало ли из какого кода вызван твой метод. Не исключено, что программист, вызывает твой метод не из контекста транзакции. В этом случае нужно либо документировать это требование, либо выполнять проверку существования транзакции. Т.е. может возникнуть потребность в том, чтобы проверять TopTransaction на null и если получаем "бинго!!!", то формировать соответствующий блоко using. На мой взгляд, в подобных случаях использование TopTransaction создаёт дополнительную нежелательную(???) зависимость (зависимость от контекста). В то же время, если твой метод внутренний и ты сам полностью контролируешь где и как он вызывается, то использовать TopTransaction, на мой взгляд, приемлемо.

Однако, если взять за правило работать с объектами исключительно либо через транзакцию, либо через её эмуляцию (что я считаю абсолютно надёжным и верным решением), то вероятность того, что TopTransaction будет null - крайне мала. Более того, если эта ошибка не будет обработана и выскочит, то это будет сигналом программеру, что в его коде ошибка (т.е. лишнее напоминание о том, чтобы он работал через транзакцию или эмуляцию).
Она также может быть OpenCloseTransaction, выдаст ли Database.TransactionManager.TopTransaction ссылку на нее? Я не знаю, надо экспериментировать...
OpenCloseTransaction наследуется от Transaction. Поскольку путём введения в API класса OpenCloseTransaction Autodesk тем самым постарался сделать единообразной работу как в транзакции, так и в её эмуляции, то вполне логично ожидать, что в обозначенной тобой ситуации будет возвращена ссылка на экземпляр OpenCloseTransaction.

UPD Если в своём коде ты не создавал транзакцию, то результат, полученный из TopTransaction можно проверять на null, как обозначено выше, либо не проверять, заставляя тем самым программера работать в контексте транзакции или эмуляции (этакий рычаг воздействия).