Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
zlocal - в хелпе нет, поиском на форуме тоже нет. DEFINE можно бы сделать длинный, но... на весь проект нельзя распространить файл с любимыми DEFINE, надо в каждой PRG-шке INCLUDE. Тоже везде "не забыть", "учесть", в любом написании, после 10-20 лет программирования будет достигнут порог "наикратчайшего" кода, когда остальные варианты будут равноценны по геморности
> И в них часто пишу ... discount=?nDiscount... Т.е. где-то в вызывающей процедуре есть PRIVATE nDiscount ? И так тоже бывает, когда параметры замучишься передавать, или интерфейс подпрограммы застарелый, а передать надо, и в классы переоформлять все это нет возможности... |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Нет. Я с самого начала написал, что это ВНУТРИ класса. Время жизни = время жизни объекта.Все крутится внутри этого класса. (набора классов, для объекта) Никаких PRIVATE nDiscount я не пишу. При объявлении она и так приват. Просто скажем есть метод SaveDat и в нем nDiscount= тому_что_надо В нем все собирается. а в методе ins
------------------ |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Да понятно, что если специально переменную не определять, то она PRIVATE. Но это не "внутри класса". Например, если ты вызовешь после
insert into (Discount ) value (?nDiscount) DO подпрограмма_фреймверка то в коде подпрограмма_фреймверка вполне будет видна эта "переменная внутри класса", и может быть испорчена. Здесь да, правильно использовать свойство класса .nDiscount или честно передавать ее в качестве параметра в метод INS |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Пардоньте, немного промахнулся. Есть ZLOC и есть Locals. Первое идет с самим фоксом, второе тут Цитата:А это тут при чем? ------------------ Лень - это неосознанная мудрость. |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Не верю. Но будет время - проверю) В свойствах класса это все есть. Как множество. Пробовал. Неудобно-плохо читаемо. Как параметр в ins нет смысла, там просто текст, которые в ехес передается. В общем - это самое простое. Но писал уже. Сознательно), аккуратно. С чего бы такое писать. Виноват есть такое. Из меню. Отчеты. Выборки прямо в ексель передаю. ------------------ Исправлено 1 раз(а). Последнее : Аспид, 09.06.17 16:20 |
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 |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Я в растерянности. Все же надо как то поглубже в ООП. И так висит у меня в проге объект - его форма. Юзер с ним ничего не делает. Из меню, запускает другой. НУ НЕТ У НИХ ТОЧЕК ПРЕСЕЧЕНИЯ! (Естественно все в своих ДС) Никаких "нижележащих вызовах" нет. ------------------ |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Блиииин... И опять двадцать пять... Писать везде Private all не напрягает и не надо ничего отслеживать, а с #Define столько проблем... Классы пишут или в одном файле, где нужный #Include вставляется один раз, или в vcx, где для него отведено специальное место. Тоже одно. Locals.prg избавляет и от #define, и от ручного прописывания. Такое ощущение, что однобуквенные переменные для тебя просто святые и расстаться с ними для тебя смерти подобно. ------------------ Лень - это неосознанная мудрость. |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Она там и видима. Но именно в ниже лежащих по стеку вызова. ------------------ Лень - это неосознанная мудрость. |
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)) пока подожду использовать. Одну строку в подпрограмме я и сам напишу. > Такое ощущение, что однобуквенные переменные для тебя просто святые и расстаться с ними для тебя смерти подобно. Неправильное ощущение. Но слог интересный - святые, расстаться, смерть. Апокалиптичненько |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Она и будет видна. Если будут такие вызовы. А раз их нет, то автор и находится в полной уверенности что он написал безопасный код. Главное чтобы он не забыл во время его модификации что там таки ЕСТЬ private и что абы кого вызывать нельзя. Впрочем, тут проблема совсем другого рода. Имеет место совершенно точная неоднозначность - что понимается под nDiscount - переменная памяти, или, вдруг, поле в текущем курсоре. После того как хоть раз попадётся поле с такими именем, охота пропускать m. будет отбита навсегда. Ну и да, поскольку речь идёт о классе, то смысла в private я не вижу - вместно него совершенно нормально сработает This.nDiscount - в предположении что сам SQLEXEC тоже прописан в методе этого же класса. Это скрипт для intellisense, который сам создаёт команду Local для всех встреченных в данном модуле переменных. Т.е. не надо "напрягаться" вспоминая их имена. Ну и, естественно, не надо заниматься глупостями типа перечисления ВСЕХ потенциальных имён, если нужно лишь 1-2 из них. Вот как раз в ЭТИХ случаях m. является избыточной - тут нет неоднозначности с именами полей. Слева от оператора присваивания (т.к. запись в поля НЕ оператором = производится), и в команде LOCAL - там тоже никак не "поля" объявляются локальными. Впрочем, это просто небольшая избыточность, а не ошибка. ------------------ WBR, Igor |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Но Аспид похоже так не считает, или он не вызывает подпрограммы "фремверка" (подключенных в SET PROCEDURE и пр.) из методов класса, но вызывает только методы этого же класса. Тогда проблем с PRIVATE-переменными быть не должно > DO подпрограмма_фреймверка >> С чего бы такое писать. Виноват есть такое. |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В том то и дело что "затраты" сопоставимы (ничего ты не выигрываешь с этим private - и так и так надо писать, при том private вообще писать надо ВСЕГДА, даже если текущий метод и не создаёт/записывает никаких переменных), а результат кардинально отличается. В одном случае код защищённый от "внешнего и глупого кода", в другом - уязвимый. Меню Form/Class - пункт "include file". Только он не "один на vcx", а один на КЛАСС (разные классы в vcx могут подключать разные h-файлы). Есть ещё _INCLUDE - системная переменная которая позволяет задать h-файл автоматом подключающийся ко всем вновь создаваемым формам и визуальным классам (на ранее созданные классы/формы это не действует). Ну так "ленишься" же Мне вот не лень писать LOCAL - потому мне и утиль такая как-то без особой надобности... Но я понимаю и принимаю что кому-то реально лень - кто во время работы мало думает и очень много строк кода пишет ------------------ WBR, Igor |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Да, и он об этом явно написал:
То есть, он действительно считает, что если переменную не описать, то она при первом присваивании неявно объявляется как PRIVATE. Но это верно лишь до тех пор, пока переменная с таким именем не существует. Если же она существует, то никакой новой PRIVATE переменной не появится, а "испортится" существующая переменная. PRIVATE для того и пишется, чтобы "защититься" от порчи вышележащих private-переменных. Как только встречается команда PRIVATE, то ничего не происходит кроме того, что ранее доступная переменная становится Hidden, а при последующем присваивании (если оно будет) действительно появится новая private-переменная с тем же именем. Но как private она появится вовсе не потому, что где-то выше была команда PRIVATE, а потому, что все новые переменные по умолчанию являются private. Поэтому команду PRIVATE лучше вообще понимать не как ОБЪЯВЛЕНИЕ новой переменной (ведь она при этом не создается), а как команду скрытия существующей переменной - ведь только это она и делает. Исправлено 4 раз(а). Последнее : akvvohinc, 09.06.17 17:57 |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Да, PRIVATE суть "экранирование" от переменных вызывающих программ. Был с год назад точно такой же
Добьем. Получается двоякое применение слова: - переменная типа PRIVATE (создается при присваивании, если таковой не видно) - переменная с областью видимости в точке создания и в нижележащих подпрограммах; - команда PRIVATE переменная - ничего не создает, но убирает из видимости переменную вышележащих подпрограмм. Подпрограмма - любая штукенция с обьявлением PROCEDURE, FUNCTION, причем это не только подпрограммы фрейверка или соседние, но и методы обьектов. 1. Если код явно вызывает подпрограмму (DO подпрограмма, или This.Click() ) - то это вызов этой подпрограммы с предьявлением ей для порчи своих PRIVATE-переменных. 2. Если Click вызван как событие (нажатие мышкой), то код .Click будет выполнен как вызванный из строки READ EVENTS, т.е. где-то из стартового модуля с его видимыми переменными... Исправлено 1 раз(а). Последнее : of63, 09.06.17 19:08 |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Странно, что он случился спустя 30 лет. Ведь все, что я написал, примерно теми же словами было написано еще в хелпе к FPD, а может, и к Foxbase. Если речь о слове, то Да. А если о команде, то она только скрывает переменные. Я бы даже использовал 2 слова - private (тип переменной с областью видимости от момента создания и ниже, в том числе, во всех программах, расположенных в стеке вызовов ниже текущей) и PRIVATE (команда, делающая переменную скрытой, но ничего не определяющая и ничего не создающая). Команды PUBLIC и LOCAL в корне отличаются от PRIVATE - они действительно создают переменные соответствующих типов.
Для меня это как-то мудрено написано, но смысл понятен - все private-переменные, определенные в программах (в том числе, методах), которые пока не завершились (расположенные в стеке вызовов выше текущей) и не скрытые в текущей программе или где-то выше, будут доступны. Исправлено 4 раз(а). Последнее : akvvohinc, 09.06.17 19:43 |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Кстати, еще один способ скрыть private-переменную - передать ее как параметр в вызываемую программу по ссылке:
|
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Необязательно. Зависит от использования "модальности" в формах. Если форма вызвана как модальная, то "контекстом" из которого якобы "вызваны" срабатывающие обработчики событий (если так можно выразится - точнее будет сказать просто "предыдущий по стеку модуль кода") будет вовсе не модуль с READ EVENTS, а модуль с кодом показа этой самой модальной формы - т.е. там где DO FORM ... или тот же oForm.Show(1) прописаны. Соответственно видны (доступны для "порчи") будут именно private переменные этого модуля. ------------------ WBR, Igor |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Я сразу признался, что не пишу m. Ну не привык. Такой персональный стиль))) И если скажу что не напарывался - совру) И советую сразу привыкать. Меня поздно переучивать) Можно было бы, коли это был бы 1 параметр. Скажу более того, у меня уже эти переменные собраны в классе. Просто они в массиве класса. И тем не менее, не редко перевожу их в вот такие имена. Легче потом разбираться. nDiscount яснее чем this.aMap[3,6] Просто так проще. Косяк там практически невозможен. Говорю же - сознательно. Смею уверить, что из параллельно крутящихся объектов, или же запускаемых подпрограмм, эти переменные не видны. Коли запускаю какие то утилиты (прг) из класса... ну не бывает такого тупизма, чтобы пересеклись. У меня нет однобуквенных. Переменные эти пользую сознательно. В общем тут косяков не бывает. Так опять же - это просто способ передачи вложенным вызовам неизвестного, большого кол-ва параметров) Рекомендовать это пользовать - поостерегся бы. Тут... видимо специфический опыт) Я в курсе. Хочется сказать, что у офа, все же странное на мой взгляд отношение к классам. Впечатление, что ты просто собираешь в кучу некую логику, и называешь это классом. Просто по всему что написано, так кажется. И, пардон, тупое сохранение сетов. И "сложность" их написания. Ну положим у меня есть базовый класс форм. Он совершенно абстрактен. Так уже в нем у меня есть метод sets
Написано это лет 15 назад. Больше не писал. Если тебе что то постоянно надо, почему это не вынести в базовый класс, этой породы?) И так со всем. Потому в итоге, при создании функционального наследника, не надо париться, над общим поведением, а сосредоточиться на логике данного класса... По мне, это и есть главный смысл ООП. Именно это, максимально сокращает код, понимание где и что. Ускоряет нахождение месть для исправления логиик. ------------------ |
Re: Что делать, когда лень исправлять. Вопрос о работе с классами | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
И это все, что вы можете предложить? |
© 2000-2024 Fox Club  |