:: Visual Foxpro, Foxpro for DOS
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
zlocal - в хелпе нет, поиском на форуме тоже нет. DEFINE можно бы сделать длинный, но... на весь проект нельзя распространить файл с любимыми DEFINE, надо в каждой PRG-шке INCLUDE. Тоже везде "не забыть", "учесть", в любом написании, после 10-20 лет программирования будет достигнут порог "наикратчайшего" кода, когда остальные варианты будут равноценны по геморности

> И в них часто пишу ... discount=?nDiscount...
Т.е. где-то в вызывающей процедуре есть PRIVATE nDiscount ? И так тоже бывает, когда параметры замучишься передавать, или интерфейс подпрограммы застарелый, а передать надо, и в классы переоформлять все это нет возможности...
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
of63
Т.е. где-то в вызывающей процедуре есть PRIVATE nDiscount ? И так тоже бывает, когда параметры замучишься передавать, или интерфейс подпрограммы застарелый, а передать надо, и в классы переоформлять все это нет возможности...
Нет. Я с самого начала написал, что это ВНУТРИ класса.
Время жизни = время жизни объекта.Все крутится внутри этого класса. (набора классов, для объекта)
Никаких PRIVATE nDiscount я не пишу.
При объявлении она и так приват.
Просто скажем есть метод SaveDat
и в нем nDiscount= тому_что_надо
В нем все собирается.
а в методе ins
insert into (Discount ) value (?nDiscount)
UPG
update set Discount = ?nDiscount


------------------
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Да понятно, что если специально переменную не определять, то она PRIVATE. Но это не "внутри класса". Например, если ты вызовешь после
insert into (Discount ) value (?nDiscount)
DO подпрограмма_фреймверка
то в коде подпрограмма_фреймверка вполне будет видна эта "переменная внутри класса", и может быть испорчена. Здесь да, правильно использовать свойство класса .nDiscount или честно передавать ее в качестве параметра в метод INS
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
of63
zlocal - в хелпе нет, поиском на форуме тоже нет.
Пардоньте, немного промахнулся. Есть ZLOC и есть Locals. Первое идет с самим фоксом, второе тут
Цитата:
DEFINE можно бы сделать длинный, но... на весь проект нельзя распространить файл с любимыми DEFINE, надо в каждой PRG-шке INCLUDE. Тоже везде "не забыть", "учесть", в любом написании, после 10-20 лет программирования будет достигнут порог "наикратчайшего" кода, когда остальные варианты будут равноценны по геморности
А это тут при чем?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
of63
то в коде подпрограмма_фреймверка вполне будет видна эта "переменная внутри класса"
Не верю. Но будет время - проверю)
В свойствах класса это все есть. Как множество.
Пробовал. Неудобно-плохо читаемо.
Как параметр в ins нет смысла, там просто текст, которые в ехес передается.
В общем - это самое простое.
Но писал уже. Сознательно), аккуратно.

of63
DO подпрограмма_фреймверка
С чего бы такое писать.

Виноват есть такое.
Из меню. Отчеты. Выборки прямо в ексель передаю.


------------------




Исправлено 1 раз(а). Последнее : Аспид, 09.06.17 16:20
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм? (метод и подпрограмма - это одно и тоже)

2ssa
Почитаю, но попозже. Про DEFINE:
#DEFINE zlocal LOCAL m.a, m.b, m.c, m.d, m.e...
...
zlocal
m.a = 1
m.b = 2
...



Исправлено 1 раз(а). Последнее : of63, 09.06.17 16:23
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
of63
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм? (метод и подпрограмма - это одно и тоже)
Я в растерянности.
Все же надо как то поглубже в ООП.
И так висит у меня в проге объект - его форма.
Юзер с ним ничего не делает.
Из меню, запускает другой.
НУ НЕТ У НИХ ТОЧЕК ПРЕСЕЧЕНИЯ!
(Естественно все в своих ДС)
Никаких "нижележащих вызовах" нет.


------------------
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
of63
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм? (метод и подпрограмма - это одно и тоже)
2ssa
Почитаю, но попозже. Про DEFINE:
#DEFINE zlocal LOCAL m.a, m.b, m.c, m.d, m.e...
...
zlocal
m.a = 1
m.b = 2
...
Блиииин... И опять двадцать пять...
Писать везде Private all не напрягает и не надо ничего отслеживать, а с #Define столько проблем...
Классы пишут или в одном файле, где нужный #Include вставляется один раз, или в vcx, где для него отведено специальное место. Тоже одно.
Locals.prg избавляет и от #define, и от ручного прописывания.
Такое ощущение, что однобуквенные переменные для тебя просто святые и расстаться с ними для тебя смерти подобно.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
of63
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм? (метод и подпрограмма - это одно и тоже)
Она там и видима. Но именно в ниже лежащих по стеку вызова.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Писать везде Private all не напрягает и не надо ничего отслеживать, а с #Define столько проблем...
Ровно столько же проблем (сколько и с LOCAL) - одна строка кода в каждой подпрограмме

> Классы пишут или в одном файле, где нужный #Include вставляется один раз, или в vcx, где для него отведено специальное место. Тоже одно.
Что-то я не нашел этого места... Вот у меня файл VCX, в нем 10ок классов, в каждом методы (в поле methods файла, для каждого класса своя серия методов и обработчиков событий). Фокс компилирует эти серии по очереди, и неизвестно в каком порядке. В каком месте VCX указать #INCLUDE с моими #DEFINE, чтобы каждая серия методов (в каждом классе файла VCX) его учла? Если имеется ввиду "включить файл с DEFINE в проект", то включил, но он не участвует при компиляции без #INCLUDE в каждом файле PRG (указать в начале файла), а вот где в файле VCX указать ОДИН раз на файл?

> Locals.prg избавляет и от #define, и от ручного прописывания.
По ссылке... Я такой "ИИ" (Creates the 'LOCAL' declaration by scanning a codeblock (c)) пока подожду использовать. Одну строку в подпрограмме я и сам напишу.

> Такое ощущение, что однобуквенные переменные для тебя просто святые и расстаться с ними для тебя смерти подобно.
Неправильное ощущение. Но слог интересный - святые, расстаться, смерть. Апокалиптичненько
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм?
Она и будет видна. Если будут такие вызовы. А раз их нет, то автор и находится в полной уверенности что он написал безопасный код. Главное чтобы он не забыл во время его модификации что там таки ЕСТЬ private и что абы кого вызывать нельзя.

Впрочем, тут проблема совсем другого рода.
Аспид
update set Discount = ?nDiscount
Имеет место совершенно точная неоднозначность - что понимается под nDiscount - переменная памяти, или, вдруг, поле в текущем курсоре. После того как хоть раз попадётся поле с такими именем, охота пропускать m. будет отбита навсегда.
Ну и да, поскольку речь идёт о классе, то смысла в private я не вижу - вместно него совершенно нормально сработает This.nDiscount - в предположении что сам SQLEXEC тоже прописан в методе этого же класса.

of63
Почитаю, но попозже.
Это скрипт для intellisense, который сам создаёт команду Local для всех встреченных в данном модуле переменных. Т.е. не надо "напрягаться" вспоминая их имена. Ну и, естественно, не надо заниматься глупостями типа перечисления ВСЕХ потенциальных имён, если нужно лишь 1-2 из них.
of63
LOCAL m.a, m.b, m.c, m.d, m.e...
...
m.a = 1
m.b = 2
...
Вот как раз в ЭТИХ случаях m. является избыточной - тут нет неоднозначности с именами полей. Слева от оператора присваивания (т.к. запись в поля НЕ оператором = производится), и в команде LOCAL - там тоже никак не "поля" объявляются локальными. Впрочем, это просто небольшая избыточность, а не ошибка.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ssa
of63
А почему бы PRIVATE-переменной не быть видимой в нижележащих вызовах подпрограмм? (метод и подпрограмма - это одно и тоже)
Она там и видима. Но именно в ниже лежащих по стеку вызова.

Но Аспид похоже так не считает, или он не вызывает подпрограммы "фремверка" (подключенных в SET PROCEDURE и пр.) из методов класса, но вызывает только методы этого же класса. Тогда проблем с PRIVATE-переменными быть не должно
> DO подпрограмма_фреймверка
>> С чего бы такое писать. Виноват есть такое.
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
Ровно столько же проблем (сколько и с LOCAL) - одна строка кода в каждой подпрограмме
В том то и дело что "затраты" сопоставимы (ничего ты не выигрываешь с этим private - и так и так надо писать, при том private вообще писать надо ВСЕГДА, даже если текущий метод и не создаёт/записывает никаких переменных), а результат кардинально отличается. В одном случае код защищённый от "внешнего и глупого кода", в другом - уязвимый.
of63
Что-то я не нашел этого места...
Меню Form/Class - пункт "include file". Только он не "один на vcx", а один на КЛАСС (разные классы в vcx могут подключать разные h-файлы).
Есть ещё _INCLUDE - системная переменная которая позволяет задать h-файл автоматом подключающийся ко всем вновь создаваемым формам и визуальным классам (на ранее созданные классы/формы это не действует).
of63
По ссылке... Я такой "ИИ" (Creates the 'LOCAL' declaration by scanning a codeblock (c)) пока подожду использовать. Одну строку в подпрограмме я и сам напишу.
Ну так "ленишься" же Мне вот не лень писать LOCAL - потому мне и утиль такая как-то без особой надобности... Но я понимаю и принимаю что кому-то реально лень - кто во время работы мало думает и очень много строк кода пишет


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Но Аспид похоже так не считает

Да, и он об этом явно написал:
Аспид
Никаких PRIVATE nDiscount я не пишу.
При объявлении она и так приват

То есть, он действительно считает, что если переменную не описать, то она при первом присваивании неявно объявляется как PRIVATE.

Но это верно лишь до тех пор, пока переменная с таким именем не существует. Если же она существует, то никакой новой PRIVATE переменной не появится, а "испортится" существующая переменная.

PRIVATE для того и пишется, чтобы "защититься" от порчи вышележащих private-переменных. Как только встречается команда PRIVATE, то ничего не происходит кроме того, что ранее доступная переменная становится Hidden, а при последующем присваивании (если оно будет) действительно появится новая private-переменная с тем же именем. Но как private она появится вовсе не потому, что где-то выше была команда PRIVATE, а потому, что все новые переменные по умолчанию являются private.

Поэтому команду PRIVATE лучше вообще понимать не как ОБЪЯВЛЕНИЕ новой переменной (ведь она при этом не создается), а как команду скрытия существующей переменной - ведь только это она и делает.



Исправлено 4 раз(а). Последнее : akvvohinc, 09.06.17 17:57
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Да, PRIVATE суть "экранирование" от переменных вызывающих программ. Был с год назад точно такой же срспич, и выяснили, что PRIVATE - это вот такое слово (ИК, конечно, слово подобрал, и принес )

Добьем. Получается двоякое применение слова:
- переменная типа PRIVATE (создается при присваивании, если таковой не видно) - переменная с областью видимости в точке создания и в нижележащих подпрограммах;
- команда PRIVATE переменная - ничего не создает, но убирает из видимости переменную вышележащих подпрограмм.

Подпрограмма - любая штукенция с обьявлением PROCEDURE, FUNCTION, причем это не только подпрограммы фрейверка или соседние, но и методы обьектов.
1. Если код явно вызывает подпрограмму (DO подпрограмма, или This.Click() ) - то это вызов этой подпрограммы с предьявлением ей для порчи своих PRIVATE-переменных.
2. Если Click вызван как событие (нажатие мышкой), то код .Click будет выполнен как вызванный из строки READ EVENTS, т.е. где-то из стартового модуля с его видимыми переменными...



Исправлено 1 раз(а). Последнее : of63, 09.06.17 19:08
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Был с год назад точно такой же спич

Странно, что он случился спустя 30 лет.
Ведь все, что я написал, примерно теми же словами было написано еще в хелпе к FPD, а может, и к Foxbase.

of63
Добьем. Получается двоякое применение слова:
- переменная типа PRIVATE (создается при присваивании, если таковой не видно) - переменная с областью видимости в точке создания и в нижележащих подпрограммах;
- команда PRIVATE переменная - ничего не создает, но убирает из видимости переменную вышележащих подпрограмм.
Если речь о слове, то Да.
А если о команде, то она только скрывает переменные.

Я бы даже использовал 2 слова - private (тип переменной с областью видимости от момента создания и ниже, в том числе, во всех программах, расположенных в стеке вызовов ниже текущей) и PRIVATE (команда, делающая переменную скрытой, но ничего не определяющая и ничего не создающая).

Команды PUBLIC и LOCAL в корне отличаются от PRIVATE - они действительно создают переменные соответствующих типов.

of63
2. Если Click вызван как событие (нажатие мышкой), то код .Click будет выполнен как вызванный из строки READ EVENTS, т.е. где-то из стартового модуля с его видимыми переменными...

Для меня это как-то мудрено написано, но смысл понятен - все private-переменные, определенные в программах (в том числе, методах), которые пока не завершились (расположенные в стеке вызовов выше текущей) и не скрытые в текущей программе или где-то выше, будут доступны.



Исправлено 4 раз(а). Последнее : akvvohinc, 09.06.17 19:43
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Кстати, еще один способ скрыть private-переменную - передать ее как параметр в вызываемую программу по ссылке:
CLEAR
var = 1
DO Func1 WITH m.var && скроет var в Func1
DO Func1 WITH (m.var) && не скроет var в Func1
?
= Func1(m.var) && не скроет var в Func1
= Func1(@m.var) && скроет var в Func1
FUNCTION Func1
PARAMETERS parm1
? 'Переменная var '+IIF(VARTYPE(m.var)='U','не ','')+'существует.'
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
2. Если Click вызван как событие (нажатие мышкой), то код .Click будет выполнен как вызванный из строки READ EVENTS, т.е. где-то из стартового модуля с его видимыми переменными...
Необязательно. Зависит от использования "модальности" в формах.
Если форма вызвана как модальная, то "контекстом" из которого якобы "вызваны" срабатывающие обработчики событий (если так можно выразится - точнее будет сказать просто "предыдущий по стеку модуль кода") будет вовсе не модуль с READ EVENTS, а модуль с кодом показа этой самой модальной формы - т.е. там где DO FORM ... или тот же oForm.Show(1) прописаны. Соответственно видны (доступны для "порчи") будут именно private переменные этого модуля.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Igor Korolyov
Впрочем, тут проблема совсем другого рода.
Аспид
update set Discount = ?nDiscount
Имеет место совершенно точная неоднозначность - что понимается под nDiscount - переменная памяти, или, вдруг, поле в текущем курсоре. После того как хоть раз попадётся поле с такими именем, охота пропускать m. будет отбита навсегда.
Я сразу признался, что не пишу m. Ну не привык. Такой персональный стиль)))

И если скажу что не напарывался - совру)
И советую сразу привыкать. Меня поздно переучивать)
Igor Korolyov
Ну и да, поскольку речь идёт о классе, то смысла в private я не вижу - вместно него совершенно нормально сработает This.nDiscount - в предположении что сам SQLEXEC тоже прописан в методе этого же класса.
Можно было бы, коли это был бы 1 параметр.
Скажу более того, у меня уже эти переменные собраны в классе. Просто они в массиве класса.
И тем не менее, не редко перевожу их в вот такие имена.
Легче потом разбираться. nDiscount яснее чем this.aMap[3,6]
Просто так проще. Косяк там практически невозможен. Говорю же - сознательно.
of63
Но Аспид похоже так не считает
Смею уверить, что из параллельно крутящихся объектов, или же запускаемых подпрограмм, эти переменные не видны.

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

Хочется сказать, что у офа, все же странное на мой взгляд отношение к классам.
Впечатление, что ты просто собираешь в кучу некую логику, и называешь это классом.
Просто по всему что написано, так кажется.
И, пардон, тупое сохранение сетов. И "сложность" их написания.
Ну положим у меня есть базовый класс форм. Он совершенно абстрактен.
Так уже в нем у меня есть метод sets
SET CENTURY Off
SET COMPATIBLE OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET HOURS TO 24
SET DATE german
SET SECONDS OFF
SET SAFETY OFF
SET CONFIRM OFF
SET EXCLUSIVE OFF
SET EXACT OFF
SET CLOCK STATUS
SET MULTILOCKS ON
SET MEMOWIDTH TO 1000
SET DECIMALS TO 2
SET NULLDISPLAY TO ''
Который вызывется в ините.
Написано это лет 15 назад. Больше не писал.
Если тебе что то постоянно надо, почему это не вынести в базовый класс, этой породы?)
И так со всем. Потому в итоге, при создании функционального наследника, не надо париться, над общим поведением, а сосредоточиться на логике данного класса...
По мне, это и есть главный смысл ООП.
Именно это, максимально сокращает код, понимание где и что. Ускоряет нахождение месть для исправления логиик.


------------------
Ratings: 0 negative/0 positive
Re: Что делать, когда лень исправлять. Вопрос о работе с классами
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Аспид
Ну положим у меня есть базовый класс форм. Он совершенно абстрактен.
Так уже в нем у меня есть метод sets
SET CENTURY Off
SET COMPATIBLE OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET HOURS TO 24
SET DATE german
SET SECONDS OFF
SET SAFETY OFF
SET CONFIRM OFF
SET EXCLUSIVE OFF
SET EXACT OFF
SET CLOCK STATUS
SET MULTILOCKS ON
SET MEMOWIDTH TO 1000
SET DECIMALS TO 2
SET NULLDISPLAY TO ''
Который вызывется в ините.
Написано это лет 15 назад. Больше не писал.

И это все, что вы можете предложить?
Ratings: 1 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 Каратаев  (Гостей: 29)

© 2000-2024 Fox Club 
Яндекс.Метрика