Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 01-02-2016, 17:21:24

Название: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 01-02-2016, 17:21:24
Интересуют сторонние точки зрения по обозначенному сабжу от тех, кто хотя бы на базовом уровне разбирается в PowerShell (https://msdn.microsoft.com/en-us/powershell/mt173057.aspx). На данный момент мне видятся пока лишь только плюсы. Если упустил минусы - с интересом их рассмотрю.

На мой взгляд возможность хостинга движка PowerShell в AutoCAD, автоматом отправляет в ведро AutoLISP и Visual LISP, поскольку они из очень разных весовых категорий (в плане возможностей). Т.е. вместо скриптов, написанных на AutoLISP и Visual LISP можно использовать скрипты, написанные на PowerShell (проверял - работает как часы). При этом скрипты PowerShell работают в контексте приложения, а не в контексте документа (как это, к сожалению, обстоит у Лиспа от Автодеска). В таких скриптах легко работать не только с COM, но и полноценно использовать возможности .NET. Так же легко работать практически со всеми технологиями и продуктами Microsoft (например с WMI, SQL Server, SharePoint и т.д.).

Хостуемому движку PowerShell автоматом доступен API хостующего приложения (в данном случае - AutoCAD). Хостить можно столько экземпляров движков, сколько нужно. Извлекая данные из чертежа, их можно обрабатывать многопоточно, после чего результаты обработки обратно "заливать" в Database.

Скрипты PowerShell можно подписывать цифровой подписью. Управление возможностями загрузок скриптов легко выполняется посредством политик выполнения (Execution polices).

Я не знаю, почему Autodesk до сих пор не внедрила движок PowerShell в AutoCAD - скорее всего просто потому, что это им в голову пока не приходило. Если конкуренты сделают это ранее, то для них [конкурентов] это может оказаться существенным преимуществом (информация к размышлению для Автодеск).
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Александр Ривилис от 01-02-2016, 19:22:17
На мой взгляд возможность хостинга движка PowerShell в AutoCAD, автоматом отправляет в ведро AutoLISP и Visual LISP
Ты как всегда не в меру категоричен. ;) А что делать с наработками на AutoLisp/VisualLisp за 25+ лет? Предлагаешь их все переписать или туда же в ведро?
При этом скрипты PowerShell работают в контексте приложения, а не в контексте документа (как это, к сожалению, обстоит у Лиспа от Автодеска)
В этом я вижу скорее минус, чем плюс, так как это:
1) Требует блокировки документов для их модификации
2) Делает проблематичным (если не невозможным) синхронный запуск команд AutoCAD/сторонних приложений.
Скрипты PowerShell можно подписывать цифровой подписью.
Лисп-приложения тоже можно подписывать цифровой подписью: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-Customization/files/GUID-A63E8C40-6870-4874-BF7E-FD75E87268AA-htm.html
Кстати, внутрь AutoCAD уже пытались всунуть и не один скриптовый язык. Это был и Python и еще ряд ...Shell. Вроде как не прижилось. о всяком случае широкого распространения не получило.
Я ничего не имею против PowerShell, то твоя категоричность меня поражает...

Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 01-02-2016, 21:43:47
А что делать с наработками на AutoLisp/VisualLisp за 25+ лет? Предлагаешь их все переписать или туда же в ведро?
Под "отправкой в ведро":) я подразумевал  не "вырезать вовсе, как аппендицит", но подразумевал то, что возможности PowerShell полностью перекрывают существующие возможности AutoLisp/Visual Lisp, в виду чего дальнейшие наработки можно создавать на PowerShell вместо Lisp, т.е. переходить с Lisp на PowerShell. Понятное дело, что движок лиспа удалять не стоит (дабы можно было использовать наработанные годами Лиспы). Автодеск не развивает Лисп. Майкрософт постоянно развивает PowerShell.
Цитата: Александр Ривилис
Кстати, внутрь AutoCAD уже пытались всунуть и не один скриптовый язык. Это был и Python и еще ряд ...Shell. Вроде как не прижилось.
Я не пытаюсь изобратеть велосипед. Вместо этого я всего лишь использую в AutoCAD то, что создано Майкрософтом и предлагается программистам для использования. Движок PowerShell разработан так, чтобы его можно было максимально просто использовать в любом Windows-приложении. Имеются успешные примеры его использования (например, тот же NuGet). Код внедрения движка занимает несколько строк, так что существенных затрат для этого не требуется.

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

PowerShell - язык администрирования Windows, так что зная его, в Windows можно делать почти всё что угодно, не прибегая к помощи компилятора. Песочница AutoLisp и Visual Lisp гораздо меньше.

Цитата: Александр Ривилис
В этом я вижу скорее минус, чем плюс, так как это:
1) Требует блокировки документов для их модификации
2) Делает проблематичным (если не невозможным) синхронный запуск команд AutoCAD/сторонних приложений.
При желании можно использовать PowerShell и в контексте документа. А в необходимости блокировки документа я не вижу ничего страшного.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 03-02-2016, 01:47:23
PowerShell - язык администрирования Windows, так что зная его, в Windows можно делать почти всё что угодно, не прибегая к помощи компилятора.
Примерно в той-же мере, что и автолисп позволяет делать с автокадом - а если нужны "изыски" то можно программировать на чем-то посерьезней. Насчет, что автолисп в ведро - ихмо он еще вполне переживет PowerShell, как пережил VB, у того тоже возможностей было поболее. У автолиспа есть фишка - это "лисп основа" и ее не имеет смысла сравнивать с умением вызывать API. На автолиспе можно как начать писать через 10 минут, так и в "ясном виде" описать сложнейший алгоритм - с его сочетанием простоты и выразительности мало кто до сих пор может соревноваться.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 03-02-2016, 02:05:14
Примерно в той-же мере, что и автолисп позволяет делать с автокадом
В той, да не в той. Например, насколько я помню, из акадовского лиспа невозможно работать с подшивками. Добраться к подшивкам, например, можно через AutoCAD .NET API, но лисп сам по себе туда [туда - это к AutoCAD .NET API] добраться не может. PowerShell может.
Цитата: Дима_
У автолиспа есть фишка - это "лисп основа" и ее не имеет смысла сравнивать с умением вызывать API.
Если важен результат, то очень даже имеет, на мой взгляд.
Цитата: Дима_
На автолиспе можно как начать писать через 10 минут, так и в "ясном виде" описать сложнейший алгоритм - с его сочетанием простоты и выразительности мало кто до сих пор может соревноваться.
Ну, через 10 минут, начав писать на лиспе, сложнейший алгоритм вряд ли можно качественно написать, т.к. необходимы некоторые навыки работы, опыт. Относительно сложные вещи - да, можно. Но это в равной степени относится и к PowerShell. Мне не интересно вести полемику вида "PowerShell vs AutoLISP". Меня интересуют подводные камни, которые могут встретиться в случае использования PowerShell (не важно, вместо лиспа, или же параллельно с лиспом).

Я смотрю на PowerShell в том числе (но далеко не в первую очередь) и как на возможную альтернативу для AutoLISP\Visual LISP. Против лиспа, как такового, я ничего не имею (тем более против настоящего LISP).
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Привалов Дмитрий от 03-02-2016, 08:02:16
с его сочетанием простоты и выразительности
Выразительность лиспа может превратиться в плохо читаемый код.
Попробуйте описать математическую(физическую) формулу с корнями, дробями и т.д. и от выразительности не останется и следа. Всю выразительность съедят скобки и шифровка логики, когда операция над переменными предшествует переменным (+ a b). И это не естественно для большинства, т.к. со школы учат a + b. В итоге быстро проверить/дополнить формулу не получится.

 
Я смотрю на PowerShell в том числе (но далеко не в первую очередь) и как на возможную альтернативу для AutoLISP\Visual LISP
Собственно я за введение альтернативы LISP. Подход c Lisp очень хорош, если бы не сам язык Lisp.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: trir от 03-02-2016, 11:01:55
Цитировать
Добраться к подшивкам, например, можно через AutoCAD .NET API
через COM
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 03-02-2016, 11:54:50
через COM
Что "через COM"? Я в курсе, что API подшивок реализовано посредством COM и имел в виду то, что с COM API подшивок можно работать из AutoCAD .NET API, в то время как из акадовского лиспа с этим возникнут проблемы. Из скриптов PowerShell можно работать с подшивками как напрямую (через COM), так и через .NET API (которое за кулисами будет дёргать всё тот же COM API).
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 03-02-2016, 12:05:33
Собственно я за введение альтернативы LISP.
Сегодня займусь оформлением уже имеющегося примера, а так же хочу добавить в него пример того, как PowerShell может исполнять исходный код, написанный на C# (для VB.NET пример делать не буду). Результат выложу на Bitbucket (исходники, откомпилированную версию и описание). Так же напишу демонстрационное видео и закину на youtube. В блоге отпишусь об этом, как только сделаю.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 03-02-2016, 18:32:54
Выразительность лиспа может превратиться в плохо читаемый код.
Попробуйте описать математическую(физическую) формулу с корнями, дробями и т.д. и от выразительности не останется и следа. Всю выразительность съедят скобки и шифровка логики, когда операция над переменными предшествует переменным (+ a b). И это не естественно для большинства, т.к. со школы учат a + b. В итоге быстро проверить/дополнить формулу не получится.
Пробовал и не раз - "Вы просто не умеете их готовить".
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 03-02-2016, 23:02:45
Пробовал и не раз - "Вы просто не умеете их готовить".
"Приготовь" и покажи это юзерам не имеющим твоего опыта программирования. Смогут прочесть и (в идеале) понять его? :) Интереса ради, можно показать им код на др. языках. Вряд ли код на лиспе будет им более понятен.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 04-02-2016, 00:04:06
Собственно я за введение альтернативы LISP.
Закинул в блог.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Привалов Дмитрий от 04-02-2016, 07:19:46
Пробовал и не раз - "Вы просто не умеете их готовить".
Так вот о каком выразительном, декларативном языке был намек))))
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 05-02-2016, 21:49:21
    Посмотрел коды - свои впечатления. PowerShellHost - мне очень понравился - есть немалая сила динамических языков в методе Invoke (или eval, apply итп).
Off-Topic: показать
Я не силен в API PS, но с выводом в psOutput там по моему какая-то "борода", я бы поискал асинхронный метод или создал его сам - но это больше придирки.
Я не раз уже писал, что считаю лучший вид отладки это REPL, который, к сожалению, в прямом виде достаточно проблемно работает в разрезе .Net в автокаде. Если нужно в "он-лайне" посмотреть работу "корявых" акадовских api (документация к которым, к сожалению, оставляет желать лучшего) я использую подобный самописный "порт" из AutoLisp в Net. (то есть вызываю .Net api из лиспа - через аналогичный по сути плагин).
    С точки зрения примера рисующего рожицу - он показателен. Он показывает почему лисп не умрет, по крайней мере от PS. Т.к. и подготовительные затраты и сам код реализации не может сравниться в трудозатратах с лиспом - даже если мы "зафиксим" подготовительную работу на большинство операций. Но ключевое в лиспе даже не это, он своей структурой (в сочетании с возможностями) заставляет идти от специфики, то есть в лиспе подобная функция в "естественном" виде была-бы выражена, не как написание функции рисования окружности, вычисления их координат и запуска функций с соответствующими параметрами, а как функция получения примитивов из некого "списочного" описания рожицы в ее результат (примитивы), причем с выводом в самом конце - что дает очень сильную гибкость при внесении изменений в исходный алгоритм в случае необходимости. При написании на лиспе DSL (https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык) создается сам собой естественным образом и именно в этом его преимущество в выразительности (конечно для тех кто научился "читать" лисп выражения - то Привалов Дмитрий - кстати по поводу что все со школы пишут 2+2 - спросите у знакомых на работе сколько будет 2+2*2 - и вы поймете в чем сила скобок).
    Но вернемся к теме, инструмент (PSHost) для .Net'чиков действительно классный (даже не для .Net'чиков, а для PS кодеров). Кому надо "затычку" для юзера и он знает PS - просто подарок. + Очень хорошая "подмога" для .Net отладки изнутри. Прикрутить туда еще кнопок для подстрочника или копирования из VS (на автодополнения замахиваться это "крутовато" - готовых API я не встречал - хотя я их и не искал) - инструмент вполне годный и имеющий право на жизнь в своем сегменте.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 05-02-2016, 22:25:51
подготовительные затраты и сам код реализации не может сравниться в трудозатратах с лиспом - даже если мы "зафиксим" подготовительную работу на большинство операций.
Если на PS создать некоторую коллекцию общих функций, для последующего их использования (подобно тому, как это уже сделано Автодеском для Лиспа), то размер кода, использующего эти функции, будет сопоставим с аналогичным кодом на лиспе, т.к. используя эти функции можно создавать цепочки вызовов, когда результаты вызова одной функции передаётся в очередную посредством оператора "|" - это так называемый конвейр объектов в PS (при этом получаем отсутствие гигантского количества скобок, коими изобилует Лисп). Ведь и за кулисами лаконичности "стандартных" функций Лиспа стоИт их реализация, которая не факт что всегда будет короче кода PS.

Показанный мною пример PS кода не претендует на красоту и краткость. Я более чем уверен, что опытный PS-программист мог бы существенно сократить объём этого кода (скорее всего даже в разы).

Цитата: Дима_
Я не силен в API PS, но с выводом в psOutput там по моему какая-то "борода", я бы поискал асинхронный метод или создал его сам - но это больше придирки.
В PS код легко можно запускать код как синхронно, так и асинхронно. Обозначенный мною пример написан так, чтобы максимально походить на .NET-код, дабы программисты, знакомые с .NET API могли без проблем понять его. Не знаю, насколько это у меня получилось.

Цитата: Дима_
Прикрутить туда еще кнопок для подстрочника или копирования из VS
Помимо движка PS компания Майкрософт так же бесплатно предоставляет и набор готовых контролов, разработанных специально для создания GUI приложений, предназначенных для написания кода PS, его тестирования, отладки (насколько я понял - даже с подсветкой синтаксиса и прочими плюшками, возможно что даже с ИнтеллиСенсом). Но я пока с этим не разбирался, поэтому могу в чём-то и ошибаться.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 05-02-2016, 23:12:51
это так называемый конвейр объектов в PS
Ну скажем так, в PS он позаимствован, конвейер и композиция функций - это элементы присутствующий во всех без исключения функциональных языках, для частичного замещения лисповских скобок - именно для "проведения" логики "от описания".
с PS контролами - это они (Microsoft) молодцы...
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 05-02-2016, 23:17:36
Ну скажем так, в PS он позаимствован, конвейер и композиция функций - это элементы присутствующий во всех без исключения функциональных языках, для частичного замещения лисповских скобок - именно для "проведения" логики "от описания"
Заимствовано или нет - это не имеет значения. Важен результат. Заимствовать полезные вещи - это правильно. Кроме того, в отличие от большинства других "*Shell", в PowerShell по конвейру передаются полноценные .net-объекты, а не текстовые данные.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 05-02-2016, 23:49:40
Ни в коем случае не в качестве спора - как не странно но самые "интересные" вещи с конвейером реализуются при передачи по сути текста в котором "квотирован" код - который предварительно модифицируется в зависимости от первичных аргументов общей функции - это по сути и есть "основа" метапрограммирования - в лиспе (не авто) это макросы, в F# - цитированный код - открывающее отдельную и очень нетривиальную ветвь в программировании как таковом. Вполне допускаю, что данный функционал реализован и в PS (по крайней мере в нем это достаточно просто реализовать - т.к. динамическая типизация, в статической это реализация - намного сложнее). В "стандартном" варианте-же (и он в общей массе проще в реализации), через конвейер передаются "объекты" языка (платформы).
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 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 наших админов - это для меня гораздо более важно, чем заинтересовать кого-то на форумах.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 07-02-2016, 20:24:14
Дополнительная информация для размышления: хостинг PowerShell в AutoCAD может оказаться полезным в т.ч. и для программистов, пишущих на AutoLISP\Visual LISP, т.к. помимо доступа к различным технологиям и платформам от Майкрософт, дополнительно предосталяет им возможность в Lisp-коде пользоваться .NET-библиотеками, в т.ч. выполнять динамическую компиляцию произвольного .NET-кода с последующим его исполнением.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Alexx от 02-03-2016, 13:49:18
Скрипты на Powershell довольно медленно исполняются (ну по крайней мере так было 4 года назад, когда их писал). В сравнении с тем же VBScript. Лично я предпочел написать плагин пакетной обработки, который выполняет задачи, написанные на C# :-)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs019.radikal.ru%2Fi601%2F1603%2F0b%2F7a438bc24cef.png&hash=58ecd9337da96a1b9b6e27ee98d36a87)
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs020.radikal.ru%2Fi723%2F1603%2F53%2Fbb40e304ff6e.png&hash=6ffc4615876a3315cf5b613c40bec4db)
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs14.radikal.ru%2Fi187%2F1603%2Fea%2Fbcf091979fce.png&hash=0afd85847e801b12b222bb4f1748cb8d)

"Сам себя не похвалишь - ходишь как оплеваный" :D
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 02-03-2016, 14:03:34
Alexx,

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

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

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

Цитата: Alexx
Лично я предпочел написать плагин пакетной обработки, который выполняет задачи, написанные на C# :-)
Я никого не заставляю использовать PowerShell - дал лишь информацию к размышлению. Всякий инструмент нужно применять к месту и в меру.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Alexx от 02-03-2016, 14:08:35
Распространена тенденция не проверять корректность параметров, полученных на входе, а так же результатов, готовых к отправке на выход. Однако это плохо.

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

На счет db - согласен. Но насколько велика такая вероятность? На счет строковых переменных - такая вероятность отсутствует, поскольку перед выполнением функции "движок" проверяет "правильность" параметров. В атрибуте параметра указывается может ли быть пустое значение и соответствует ли введенное значение списку возможных значений. Пока что с этим проблем не было.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 02-03-2016, 14:15:11
Я подредактировал предыдущее сообщение, для большей ясности.

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

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

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


Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Alexx от 02-03-2016, 14:21:16
(вызывающий функцию должен быть информирован о том, как она работает внутри

Вызывающий функцию смотрит на атрибуты этой функции (из них же берутся описания и возможные значения) и проверяет соответствуют ли передаваемые (извне) значения правилам, описанным в атрибутах, затем вызывает эту функцию. Поэтому нет смысла в двойной проверке. :)
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 02-03-2016, 14:27:49
Поэтому нет смысла в двойной проверке. :)
Я нигде не писал о двойной проверке. Инкапсуляция проверок в теле функции как раз устраняет необходимость выполнения таких избыточных проверок (или их некорректного очередного выполнения, или вовсе отсутствия) вне тела функции. Ты полагаешься на то, что те, кто будет использовать твой код, всегда будут "играть по правилам". Дело твоё.

P.S. замечания, которые я тебе указывал, присутствуют в букварях по программированию, написанных людьми, имеющими за плечами опыт программирования такой, по сравнению с которым все присутствующие на этом форуме (вместе взятые) нервно курят в сторонке.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Alexx от 02-03-2016, 14:32:35
Андрей, я не отрицаю, что проверка значений в теле функции - это правильный подход. И я не утверждал, что являюсь продвинутым программистом. Просто в данном случае мне было гораздо проще вынести проверку в одно место, чем раскидывать ее по функциям. Об этих функциях "знает" только тот, кто их исполняет, поэтому я решил сделать именно так :) В любом случае спасибо Вам за замечания. Приятно, что Вам не все равно :)
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Дима_ от 02-03-2016, 16:14:09
Инкапсуляция проверок в теле функции как раз устраняет необходимость выполнения таких избыточных проверок (или их некорректного очередного выполнения, или вовсе отсутствия) вне тела функции.
А если эта функция вызывает другие, которые так-же делают проверки? Я тем не менее не согласен с мнением нескольких именитых авторов, по поводу "тотальной" обработки ошибок. Проверка корректности данных может действительно занимать время большее чем сама функция (либо просто занимать ощутимое время). Да если клас (функция) позиционируется как "публичная", то обработку ошибок следует учесть в результате, даже если это занимает приличное время. Для сохранения производительности, в этом случае можно прибегуть, как пример, к созданию перегрузки метода который обрабатывает сразу последовательность данных  - что при условии наличия у них "общих знаменателей", может давать возможность однократной проверки ко всей последовательности (или ее части). Так-же в таких случаях, нередко, хорошо могут помочь ленивые вычисления ну или простое кэширование. Но что функции которые подразумевают обязательную предварительную проверку результата имеют право на жизнь - лично для меня это неоспоримо. Для меня хороший тон обработки ошибок - это не "тотальная" проверка корректности в каждом возможном месте, а как раз наоборот - обработка исключений может быть только при работе с доступом к "внешним" данным - который может внезапно "сломатья". Все остальное должно быть либо проверенно до, либо учтено в выдаче результата и соответственно обработанно (опциональные типы и пр). Так-же для публичной публикации имеет смысл давать две перегрузки класса (функции) которые расчитанны на подготовленные и не проверенные данные - Int32.Parse, Int32.TryParse.
Название: Re: Программирование в AutoCAD на PowerShell
Отправлено: Андрей Бушман от 02-03-2016, 16:51:50
А если эта функция вызывает другие, которые так-же делают проверки?
Что для программиста в приоритете (надёжность или скорость) - это уж каждый решает для себя сам. Я за надёжность кода, пусть даже и в ущерб скорости работы. Если твоя функция А принимает параметры, которые она (не используя) просто должна передать при вызове некой функции Б, то нет нужды проверять эти параметры в А, т.к. проверить их - это забота конечной функции - Б. Если же в коде функции А эти параметры так же используются - тогда их следует проверять и в коде функции А. Такой подход, помимо прочего, устраняет зависимость от внешних факторов (т.е. не нужно надеяться на то, что проверку выполнит внешний код, причём выполнит корректно).

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

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

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

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

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