назначение имен переменных и функций
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > назначение имен переменных и функций

назначение имен переменных и функций

Ответ
Поиск в этой теме
Непрочитано 22.08.2005, 10:36 #1
назначение имен переменных и функций
Александер
 
Регистрация: 15.06.2005
Сообщений: 184

написал несколько программок, возникла такая проблема:
например в программе 1 есть некоторая переменная Х - строка, а в программе 2 точно так же называется функция, при выполнении программы 1 - проблем нет, но после ее выполнения, запускаю программу 2 - выдает ошибку. обе прораммы стоят в автозагрузке.
т.е. в программе 2 функция Х определяется при загрузке, а после запуска программы 1 эта функция Х переопределяется, и при попытке запуска программы 2 Х - определен не как функция, а как строка.
поправьте если что-то не так объяснил. как можно избежать таких проблем (кроме переименования переменных) посоветуйте что-нибудь. как лучше называть переменные и функции, так чтобы таких проблем не возникало...
Просмотров: 5121
 
Непрочитано 22.08.2005, 10:43
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


ИМХО, ИМХО.
Все имена делать с собственным префиксом - практически гарантия, что с соседями конфликтовать не будет.
Глобальные переменные в лиспе обрамлять символами * (например, *kpblc-activedoc*, *kpblc-sysvar-list* etc)
Функции (в зависимости от контекста) начинать либо с kpblc, либо с _kpblc - первые вызывать из меню и ком.строки, вторые - только из-под функций.
Имена функций давать более-менее осмысленные, например:
(defun kpblc-get-sysvar-list()) (defun _kpblc-norm-system) (defun _kpblc-draw-line) (defun kpblc-draw-line) - последняя вызывает _kpblc-fraw-line с передачей туда вычисленных параметров.
Т.е. разделение слов производить "-".
Параметры не имеют в наименовании слова "kpblc", слова разделяются "-". Локальные переменные не имеют слова "kpblc", слова разделять "_". По-моему, не очень сложно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2005, 12:10
#3
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


При всем уважении к гурам и гуриям замечу, что лечить надо болезнь, а не симптом. Существование дноименные переменных допустимо, если они являются ПАРАМЕТРАМИ функций, т.е. в defun (/)стоят ПОСЛЕ /. В противном случае, единожды поименованная и определенная в ходе сессии функция будет сохранятьсвой идетификатор до конца сессии - закрытия документа. Другой способ - использовать функцию set для присвоения "переходящего" имени разным переменным.
Лентяй вне форума  
 
Непрочитано 22.08.2005, 12:14
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


> Лентяй : с неменьшим уважением. У меня ж, насколько я понимаю, не только симптомы лечатся, но и сама хворь. Сразу и безболезненно. Таким манером избегается совпадение имен - любых.
С set у меня пока отношения не очень, так что я с уровня собственной колокольни...
Лиспы не жрут память килотоннами, две-три дополнительных переменных для них (имхо) не особо критично.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2005, 13:48
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Лентяй
...если они являются ПАРАМЕТРАМИ функций, т.е. в defun (/)стоят ПОСЛЕ /...
Хотел бы уточнить, что то, что стоит ПОСЛЕ / называется локальными переменными, а то что ДО / - параметрами. Так вот имена и параметров и локальных переменных могут совпадать в разных функциях и это ни к чему плохому не приведет.
И еще одно правило. Если переменная не должна быть глобальной (т.е. ее значение не будет использоваться в других функциях), то она должна быть локальной и ее имя следует поместить в список локальных переменных. Это, как и задание уникальных имен глобальным переменным и функциям, избавит от кучи сложно отлавливаемых ошибок.
Александр Ривилис вне форума  
 
Непрочитано 22.08.2005, 13:57
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Что-то совсем запутано:
Цитата:
Сообщение от Лентяй
Существование дноименные переменных допустимо, если они являются ПАРАМЕТРАМИ функций, т.е. в defun (/)стоят ПОСЛЕ /.
Как это - ПАРАМЕТР после / ?

В defun могут передаваться аргументы, т.к. defun всегда функция. После / записываются локальные переменные. А не ПАРАМЕТРЫ. Аргументы функции внутри функции являются локальными переменными. Их имена, как и имена других локальных переменных, могут совпадать с кем угодно. Еще могут быть локальные функции, определенные внутри defun. Их имена лучше внести в список локальных переменных.

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

Цитата:
Другой способ - использовать функцию set для присвоения "переходящего" имени разным переменным.
Этим Вы только запутаете. Теперь придется долго объяснять различия между set и setq.

В любом случае надо избегать создания глобальных переменных, с любыми именами. Однако совсем избежать не получится, поэтому и надо давать им выделяющиеся имена, привлекающие внимание и присвоенные осознанно.

kpblc привел пример правильного подхода. Собственные префиксы, стандартный вид и прочее.
ShaggyDoc вне форума  
 
Непрочитано 22.08.2005, 14:02
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


> ShaggyDoc : Фактически немного переделано под себя и собственные привычки ruCAD.
---
Добавлено:
Для системных переменных использую следующую методику:
(setq _osmode_ (getvar "osmode"))
Т.е. идет повторение имени системной переменной, но обрамленное "_"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.08.2005, 05:10
#8
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
ShaggyDoc: Как это - ПАРАМЕТР после / ? В defun могут передаваться аргументы, т.к. defun всегда функция. После / записываются локальные переменные. А не ПАРАМЕТРЫ.
Я так понимаю, что спор - сугубо терминологический. Обратимся к первоисточникам. Я лично AutoLISP изучал по книге Ю.А. Кречко "AutoCAD: прпграммирование и адаптация", "Диалог-МИФИ", М. 1995. Так вот, в сем уважаемом труде на стр. 46 сказано: "Формат функции DEFUN следующий:
(defun имя (АРГУМЕНТЫ / локальные ПАРАМЕТРЫ) тело функции).

Т.е. параметры стоят ПОСЛЕ "/", а то что перед - то аргументы.
ShaggyDoc
Цитата:
После / записываются локальные переменные. А не ПАРАМЕТРЫ. Аргументы функции внутри функции являются локальными переменными
Как следует из вышеприведенной цитаты, локальные перменные (параметры) не могут быть аргументами и так же наоборот.
Цитата:
Александр Ривилис: Хотел бы уточнить, что то, что стоит ПОСЛЕ / называется локальными переменными, а то что ДО / - параметрами.
См. выше. Впрочем, охотно поверю, что в России нового тысячелетия все перерменилось. Если было указание властей под страхом закатывания в Бутырку называтьать аргументы параметрами, а прарметры - аргументами, то наш долг - усердно повиноваться и исполнять.
Лентяй вне форума  
 
Непрочитано 23.08.2005, 05:18
#9
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
kpblc: У меня ж, насколько я понимаю, не только симптомы лечатся, но и сама хворь. Сразу и безболезненно.
Гильотина тоже прекрасно излечивает насморк. Мое намерение было разъяснить товарищу суть проблемы. А как избегать СПИДа - практикой безопасного секса или воздержанием - вопрос пристрастий и привычек.
Лентяй вне форума  
 
Непрочитано 23.08.2005, 11:19
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Лентяй
Я так понимаю, что спор - сугубо терминологический. Обратимся к первоисточникам. Я лично AutoLISP изучал по книге Ю.А. Кречко "AutoCAD: прпграммирование и адаптация", "Диалог-МИФИ", М. 1995. Так вот, в сем уважаемом труде на стр. 46 сказано: "Формат функции DEFUN следующий:
(defun имя (АРГУМЕНТЫ / локальные ПАРАМЕТРЫ) тело функции).

Т.е. параметры стоят ПОСЛЕ "/", а то что перед - то аргументы.
Я лично Кречко тоже читал. Но изучал LISP по документации, так как Кречко не первоисточник.

Давайте обратимся к первоисточникам. Читаем (F1):

The defun function combines a group of expressions into a function or command.

This function requires at least three arguments, the first of which is the name of the function (symbol name) to define.

The second argument is the argument list (a list of arguments and local variables used by the function). The argument list can be nil or an empty list (). Argument lists are discussed in greater detail in Functions with Arguments.

If local variables are provided, they are separated from the arguments by a slash (/).

(defun symbol_name ( args / local_variables )
expressions
)


Совершенно ясно написано - локальные переменные.

Цитата:
охотно поверю, что в России нового тысячелетия все перерменилось. Если было указание властей под страхом закатывания в Бутырку называтьать аргументы параметрами, а прарметры - аргументами, то наш долг - усердно повиноваться и исполнять.
Потрясающий аргумент. Или параметр? Оказыватеся мы читаем первоисточники "под страхом закатывания". Тогда, наверное, Кречко и другие неточные компиляторы документации вообще диссиденты. И "ихняя правда" еще восторжествует. "Товарищ, верь..."
ShaggyDoc вне форума  
 
Непрочитано 23.08.2005, 15:26
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Лентяй
Цитата:
Александр Ривилис: Хотел бы уточнить, что то, что стоит ПОСЛЕ / называется локальными переменными, а то что ДО / - параметрами.
См. выше. Впрочем, охотно поверю, что в России нового тысячелетия все перерменилось. Если было указание властей под страхом закатывания в Бутырку называтьать аргументы параметрами, а прарметры - аргументами, то наш долг - усердно повиноваться и исполнять.
Хм... Кажется представитель "Незалежної України" (это я о себе) внес раздор между представителями великих держав. :-) Если бы в Россие было указание властей назвать параметры аргументами, то бузусловно на Украине было бы с точностью до наоборот - из принципа! :-)
А по поводу параметров и аргументов - признаю свою неточность - ShaggyDoc как всегда абсолютно точен.
Александр Ривилис вне форума  
 
Непрочитано 23.08.2005, 23:27
#12
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
ShaggyDoc: f local variables are provided, they are separated from the arguments by a slash (/).
(defun symbol_name ( args / local_variables )
Об чем спорим, товарисч? О том, что перед "/" стоят аргументы, мы вроде, бы согласны. О том, что стоящее после "/" называется в русскоязычной литературе "параметром", а в англоязычной "локальной переменной" (local variable) - спорить бессмыссленно. Один и тот же кусок изогнутой трубы называется по-русски "колено", в по-английски - "локоть" (elbow). Неужели из-за этого тоже будем ругаться недругам нашим на радость? Это до вас, пане Ривилис.
Лентяй вне форума  
 
Непрочитано 24.08.2005, 06:26
#13
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Лентяй
... стоящее после "/" называется в русскоязычной литературе "параметром", а в англоязычной "локальной переменной" (local variable) ...
Не называется так "в русскоязычной литературе". Встретилось у одного автора, в период "кооперативного" издания книг, когда надо было хоть что-то по Автокад издать. И в фирменной документации Autodesk по R12 полностью переведенной на русский (а именно с нее писалась книга Ю.Кречко) такого не было.

Сейчас такое не проходит. Издательства тщательно проверяют терминологию, сверяют с документацией и не допускают подобного.

Сам столкнулся при подготовке книги. Стоило где-нибудь назвать "аргументы" "параметрами" (а так многие делают), как получал замечание.

И мы не ругаемся, а выясняем истину. Если будем неточны в терминологии, то запутаем кого угодно.
ShaggyDoc вне форума  
 
Непрочитано 24.08.2005, 09:21
#14
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


"Хоть горшком назови ..."
Хотя, если кастрюли горшками обзывать, то и тут путаница будет.
Pilot вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > назначение имен переменных и функций