Программирование в AutoCAD на PowerShell

Автор Тема: Программирование в AutoCAD на PowerShell  (Прочитано 17746 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Программирование в AutoCAD на PowerShell
« Ответ #15 : 05-02-2016, 23:12:51 »
это так называемый конвейр объектов в PS
Ну скажем так, в PS он позаимствован, конвейер и композиция функций - это элементы присутствующий во всех без исключения функциональных языках, для частичного замещения лисповских скобок - именно для "проведения" логики "от описания".
с PS контролами - это они (Microsoft) молодцы...

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #16 : 05-02-2016, 23:17:36 »
Ну скажем так, в PS он позаимствован, конвейер и композиция функций - это элементы присутствующий во всех без исключения функциональных языках, для частичного замещения лисповских скобок - именно для "проведения" логики "от описания"
Заимствовано или нет - это не имеет значения. Важен результат. Заимствовать полезные вещи - это правильно. Кроме того, в отличие от большинства других "*Shell", в PowerShell по конвейру передаются полноценные .net-объекты, а не текстовые данные.

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Программирование в AutoCAD на PowerShell
« Ответ #17 : 05-02-2016, 23:49:40 »
Ни в коем случае не в качестве спора - как не странно но самые "интересные" вещи с конвейером реализуются при передачи по сути текста в котором "квотирован" код - который предварительно модифицируется в зависимости от первичных аргументов общей функции - это по сути и есть "основа" метапрограммирования - в лиспе (не авто) это макросы, в F# - цитированный код - открывающее отдельную и очень нетривиальную ветвь в программировании как таковом. Вполне допускаю, что данный функционал реализован и в PS (по крайней мере в нем это достаточно просто реализовать - т.к. динамическая типизация, в статической это реализация - намного сложнее). В "стандартном" варианте-же (и он в общей массе проще в реализации), через конвейер передаются "объекты" языка (платформы).

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #18 : 06-02-2016, 00:23:30 »
Вполне допускаю, что данный функционал реализован и в PS
Да, в PS это есть. Можно принудительно указать, что передаваться должен текст, а не объекты (я уже видел такие примеры в книжках). Соответственно, при желании по конвейру (либо по конкретной его части) можно передавать в виде текста исходный код, который должен динамически компилироваться  (как это я уже показывал во втором примере скриптов).

Мне использование PS нравится в первую очередь тем, что теперь это стандартный механизм Windows 7 и любой, более новой версии (хотя, возможно, что и в Vista он есть), который можно 100% найти на компьютере. Соответственно нет необходимости заботиться о компиляции, т.к. код функций единожды динамически компилируется (в процессе считывания) и затем используется столько раз, сколько нужно (т.е. нет интерпретации при каждом обращении). Однако когда происходит повторная загрузка скрипта (не путать с повторным исполнением кода скрипта), то динамическая компиляция происходит после каждой попытки его загрузки - это и понятно, т.к. со времени его предыдущей загрузки скрипт мог бы быть изменён.

Знание PS позволяет без проблем увязать работу AutoCAD, например, с SharePoint (одна из моих текущих задач), тем самым предоставляя возможность создать свой аналог Vault в том объёме, в котором это нужно компании (дабы не покупать ещё и Vault).

Совокупные знания SP + .NET позволяют делать в Windows всё что угодно, без каких-либо особых проблем. Так что такая связка - это очень мощный инструмент. Сам движок PS парой строк кода легко добавляется в любой проект, даже в консольный "Hello World".

Я прекрасно отдаю себе отчёт в том, что 99% программистов и админов не станут с этим заморачиваться, т.к. толком не понимают зачем PS вообще нужен - мол и без него всё хорошо. Однако это уже их личное дело (если захотят, то смогут самостоятельно найти соответствующую информацию в Интернете). Я лишь показал возможность, тем самым предоставив некоторую базовую информацию для размышления. Лично я буду внедрять движок PS (причём не только в AutoCAD), когда посчитаю это целесообразным (т.е. почти всегда). Будут ли эту тему осваивать другие - это для меня второстепенно (сами пусть принимают решение). На данный момент мне удалось серьёзно заинтересовать в PS наших админов - это для меня гораздо более важно, чем заинтересовать кого-то на форумах.
« Последнее редактирование: 07-02-2016, 11:38:55 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #19 : 07-02-2016, 20:24:14 »
Дополнительная информация для размышления: хостинг PowerShell в AutoCAD может оказаться полезным в т.ч. и для программистов, пишущих на AutoLISP\Visual LISP, т.к. помимо доступа к различным технологиям и платформам от Майкрософт, дополнительно предосталяет им возможность в Lisp-коде пользоваться .NET-библиотеками, в т.ч. выполнять динамическую компиляцию произвольного .NET-кода с последующим его исполнением.

Оффлайн Alexx

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Re: Программирование в AutoCAD на PowerShell
« Ответ #20 : 02-03-2016, 13:49:18 »
Скрипты на Powershell довольно медленно исполняются (ну по крайней мере так было 4 года назад, когда их писал). В сравнении с тем же VBScript. Лично я предпочел написать плагин пакетной обработки, который выполняет задачи, написанные на C# :-)





"Сам себя не похвалишь - ходишь как оплеваный" :D

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #21 : 02-03-2016, 14:03:34 »
Alexx,

Среди прикладных программистов, пишущих под продукты Autodesk (хотя и не только среди них) очень распространена тенденция не проверять корректность параметров, полученных на входе, а так же результатов, готовых к отправке на выход. Как правило, это мотивируется "заботой о производительности". Однако производительность в ущерб надёжности - это плохо.

Например, в твоём случае db может оказаться null. Вместо какого-то строкового значения одного (или более) из параметров может быть так же передан null.

Цитата: Alexx
Скрипты на Powershell довольно медленно исполняются (ну по крайней мере так было 4 года назад, когда их писал). В сравнении с тем же VBScript.
Я не сравнивал скорость и не использую VBScript.

Цитата: Alexx
Лично я предпочел написать плагин пакетной обработки, который выполняет задачи, написанные на C# :-)
Я никого не заставляю использовать PowerShell - дал лишь информацию к размышлению. Всякий инструмент нужно применять к месту и в меру.

Оффлайн Alexx

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Re: Программирование в AutoCAD на PowerShell
« Ответ #22 : 02-03-2016, 14:08:35 »
Распространена тенденция не проверять корректность параметров, полученных на входе, а так же результатов, готовых к отправке на выход. Однако это плохо.

Например, в твоём случае db может оказаться null. Вместо какого-то строкового значения одного (или более) из параметров может быть передан null.

На счет db - согласен. Но насколько велика такая вероятность? На счет строковых переменных - такая вероятность отсутствует, поскольку перед выполнением функции "движок" проверяет "правильность" параметров. В атрибуте параметра указывается может ли быть пустое значение и соответствует ли введенное значение списку возможных значений. Пока что с этим проблем не было.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #23 : 02-03-2016, 14:15:11 »
Я подредактировал предыдущее сообщение, для большей ясности.

На счет db - согласен. Но насколько велика такая вероятность?
В новых версиях AutoCAD эта ситуация вполне вероятна, о чём предупреждалось в блогах ADN.

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

Я не настаиваю на исправлении указанных мною замечаний - дал лишь информацию к размышлению. Как с ней поступать - решай сам.



Оффлайн Alexx

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Re: Программирование в AutoCAD на PowerShell
« Ответ #24 : 02-03-2016, 14:21:16 »
(вызывающий функцию должен быть информирован о том, как она работает внутри

Вызывающий функцию смотрит на атрибуты этой функции (из них же берутся описания и возможные значения) и проверяет соответствуют ли передаваемые (извне) значения правилам, описанным в атрибутах, затем вызывает эту функцию. Поэтому нет смысла в двойной проверке. :)

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #25 : 02-03-2016, 14:27:49 »
Поэтому нет смысла в двойной проверке. :)
Я нигде не писал о двойной проверке. Инкапсуляция проверок в теле функции как раз устраняет необходимость выполнения таких избыточных проверок (или их некорректного очередного выполнения, или вовсе отсутствия) вне тела функции. Ты полагаешься на то, что те, кто будет использовать твой код, всегда будут "играть по правилам". Дело твоё.

P.S. замечания, которые я тебе указывал, присутствуют в букварях по программированию, написанных людьми, имеющими за плечами опыт программирования такой, по сравнению с которым все присутствующие на этом форуме (вместе взятые) нервно курят в сторонке.

Оффлайн Alexx

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Re: Программирование в AutoCAD на PowerShell
« Ответ #26 : 02-03-2016, 14:32:35 »
Андрей, я не отрицаю, что проверка значений в теле функции - это правильный подход. И я не утверждал, что являюсь продвинутым программистом. Просто в данном случае мне было гораздо проще вынести проверку в одно место, чем раскидывать ее по функциям. Об этих функциях "знает" только тот, кто их исполняет, поэтому я решил сделать именно так :) В любом случае спасибо Вам за замечания. Приятно, что Вам не все равно :)

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Программирование в AutoCAD на PowerShell
« Ответ #27 : 02-03-2016, 16:14:09 »
Инкапсуляция проверок в теле функции как раз устраняет необходимость выполнения таких избыточных проверок (или их некорректного очередного выполнения, или вовсе отсутствия) вне тела функции.
А если эта функция вызывает другие, которые так-же делают проверки? Я тем не менее не согласен с мнением нескольких именитых авторов, по поводу "тотальной" обработки ошибок. Проверка корректности данных может действительно занимать время большее чем сама функция (либо просто занимать ощутимое время). Да если клас (функция) позиционируется как "публичная", то обработку ошибок следует учесть в результате, даже если это занимает приличное время. Для сохранения производительности, в этом случае можно прибегуть, как пример, к созданию перегрузки метода который обрабатывает сразу последовательность данных  - что при условии наличия у них "общих знаменателей", может давать возможность однократной проверки ко всей последовательности (или ее части). Так-же в таких случаях, нередко, хорошо могут помочь ленивые вычисления ну или простое кэширование. Но что функции которые подразумевают обязательную предварительную проверку результата имеют право на жизнь - лично для меня это неоспоримо. Для меня хороший тон обработки ошибок - это не "тотальная" проверка корректности в каждом возможном месте, а как раз наоборот - обработка исключений может быть только при работе с доступом к "внешним" данным - который может внезапно "сломатья". Все остальное должно быть либо проверенно до, либо учтено в выдаче результата и соответственно обработанно (опциональные типы и пр). Так-же для публичной публикации имеет смысл давать две перегрузки класса (функции) которые расчитанны на подготовленные и не проверенные данные - Int32.Parse, Int32.TryParse.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Программирование в AutoCAD на PowerShell
« Ответ #28 : 02-03-2016, 16:51:50 »
А если эта функция вызывает другие, которые так-же делают проверки?
Что для программиста в приоритете (надёжность или скорость) - это уж каждый решает для себя сам. Я за надёжность кода, пусть даже и в ущерб скорости работы. Если твоя функция А принимает параметры, которые она (не используя) просто должна передать при вызове некой функции Б, то нет нужды проверять эти параметры в А, т.к. проверить их - это забота конечной функции - Б. Если же в коде функции А эти параметры так же используются - тогда их следует проверять и в коде функции А. Такой подход, помимо прочего, устраняет зависимость от внешних факторов (т.е. не нужно надеяться на то, что проверку выполнит внешний код, причём выполнит корректно).

Если существует вероятность того, что функция может быть вызвана сторонними разработчиками или тобою же через некоторый длительный промежуток времени (не важно, документирована она или нет), то и получение некорректных данных на входе вполне реально. Никогда не знаешь кто, когда в каких ситуациях будет запускать код твоих функций. То, что очевидно для тебя, может оказаться в определённом контексте совершенно не очевидным для того, кто дёргает твою функцию.

Кроме того, сегодня ты помнишь, что функция не проверяет параметры, а через год можешь воспользоваться ею забыв об этом (если это не задокументировано или ты просто поленился заглянуть в доки, понадеявшись на память).

Если это критически важный фрагмент кода операционной системы, который гарантировано будет вызываться только из кода, передающего только корректные значения - это одно, но вряд ли код плагинов AutoCAD может давать такие гарантии. Я неоднократно сталкивался с кодом, в котором "гарантировано" (по мнению автора кода) на вход не могли подаваться некорректные данные, но тем не менее такие данные туда попадали (ибо никогда не знаешь кто и как будет использовать твой код и откуда он будет получать данные).

Цитата: Дима_
Для меня хороший тон обработки ошибок - это не "тотальная" проверка корректности в каждом возможном месте, а как раз наоборот - обработка исключений может быть только при работе с доступом к "внешним" данным - который может внезапно "сломатья". Все остальное должно быть либо проверенно до, либо учтено в выдаче результата и соответственно обработанно (опциональные типы и пр).
Б. Стровструп (создатель C++) в "Практике программирования" подробно рассматривает эту тему, приводя наглядные примеры различных вариантов кода, в т.ч. с разными вариантами проверок: вне функции или внутри функции. В конце раздела он задаёт вопрос, мол "так как же в результате лучше всего нам поступать?" и сам же отвечает на этот вопрос: "всегда проверять данные на входе и выходе в коде самой функции". Т.е. он делает выбор в пользу надёжности в ущерб скорости (предварительно сделав на этом акцент, чтобы читатели понимали, что это делается осознанно). Я с ним полностью солидарен в этом.

P.S. Лично мне, как пользователю и как программисту, нафиг не нужно решение, которое работает быстро, но при этом для некоторых исходных данных может либо давать неверные результаты, либо просто кладёт на лопатки приложение (т.е. этакая мина замедленного действия, которая сработает в самый неподходящий момент).