:: Visual Foxpro, Foxpro for DOS
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
lulgu
Потому что с .h-файлом нужна постоянная перекомпиляция проекта.Потому что с .h-файлом нужна постоянная перекомпиляция проекта.

Вот именно. У меня все значения (ключи) вычитываются во время запуска программы в свойства _SCREEN. Поэтому видны в любом месте программы без всяких PUBLIC.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
pasha_usue
Причём это происходит гораздо раньше чем количество констант перевалит первый десяток. Причём это происходит гораздо раньше чем количество констант перевалит первый десяток.

Хорошо. Ну вычитал я, к примеру, значения из INI-файла. В одной форме нужен некий набор из N, а в другой из M (Фокстрот говорит, что M больше, чем N) значений. Даже если значения СРАЗУ вычитать в коллекцию, это ничего не даст, ибо набор произвольный. Еще обходить НЕЧЕГО, это надо сначала в массив или в коллекцию загнать, в этом и состоит задача. В принципе моей ToCollection хватало, но оказалось далеко не всегда.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
spinz
pasha_usue
Даже если внешняя функция построена целиком на вызове подфункции с неким набором констант, нормальный программист рефакторит набор констант в какой-нибудь внешний файл (INI, DBF), без разницы. Причём это происходит гораздо раньше чем количество констант перевалит первый десяток.
Ересь какая-то.

Если функа вызывается тысячи раз в секунду, то оверхед при чтении из файла будет запредельным
Ересь какая. Речь идёт о 100 константах. Сейчас затраты на вычитку и кэширование пары сотен килобайт - нулевые.



Исправлено 1 раз(а). Последнее : pasha_usue, 12.12.17 08:24
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
spinz
Задефайнить константы в отдельном заголовочном файле много проще и быстрей вычитывания их из файла.
Дефайнить константы - да. Здесь вопрос не в дефайне констант. Саня создаёт наборы перечислений из этих констант. В одном случае - один набор перечислений. В другом - второй набор перечислений. Именует их множествами M и N.
Просто этот набор перечислений - это уже не набор констант. Это должны быть две отдельные гомогенные коллекции M и N. А где их хранить, и как вычитывать - дело десятое. Но факт, что не в коде.
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
sphinx
lulgu
Потому что с .h-файлом нужна постоянная перекомпиляция проекта.Потому что с .h-файлом нужна постоянная перекомпиляция проекта.

Вот именно. У меня все значения (ключи) вычитываются во время запуска программы в свойства _SCREEN. Поэтому видны в любом месте программы без всяких PUBLIC.

В этом промежуточном действии тоже нет необходимости.
Проще сразу направить вывод значений в Collection, где можно оперировать именами ключей.
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
sphinx
Но чисто спортивно все же хочется понять, как красиво сделать, если в коде программы тебе надо в какую-то функцию передать значения "String_1", "String_2", "String_10".
В зависимости от того что это за значения, и ОТКУДА они берутся. Если это константы (неизменная сущность, могут меняться только при сборке новых версий ПО), то их не нужно вообще "передавать" - они будут прописаны в коде (да, вполне возможно через файл с подключаемыми константами компилятора - h-файл), при том там где используются, а не там откуда идёт вызов. Если это "настройки приложения" (не важно меняются они из самого приложения, или только "снаружи" - администратором или самим разработчиком) - ну обычно их считывают в какой-то объект/курсор, чтобы не дёргать при каждом случае хранилище (ini/txt/dbf/xml - абсолютно без разницы) - и да, если там по сути "список" то вполне себе можно при считывании создавать не 100500 отдельных переменных/свойств/полей (ещё и с идиотскими/бессмысленными именами типа param1, param2,... param100500), а один массив или коллекцию.
Если это какие-то "рабочие данные" - ну в фоксе как правило такие данные уже находятся в курсоре - если передача идёт в другую датасессию, придётся сериализовать и потом десериализовать этот курсор - через XML или тот же массив, для одной датасессии просто работать с этим же курсором.
В общем не вижу решительно никаких случаев когда ТРЕБУЕТСЯ передавать в метод/функцию 100500 параметров - именно "однотипных/неразличимых по своему назначению".
sphinx
Вложение коллекции в коллекцию - это тоже костыль
Само по себе - нет. Вопрос в том для чего это сделано и какая задача этим решается.
Если внешняя коллекция это, к примеру, "настройки приложения" (и там у элементов есть свои ключи/имена), то держать одним из значений ещё одну коллекцию (возможно уже без ключей - просто набор значений) вполне себе нормальное решение. Если среди настроек есть "значения-списки".

sphinx
Ну вычитал я, к примеру, значения из INI-файла. В одной форме нужен некий набор из N, а в другой из M
И где хранится КРИТЕРИЙ что входит в N, а что входит в M? В КОДЕ? Но это будет ненадёжно - в ini файле удалят одно из значений, и привет - прога рухнула, или просто работает некорректно, т.к. пытается обратиться к несуществующему "_SCREEN.VeryOldSetting". В самом настроечном файле (скажем не app.ini, а уже более "конкретном" formClient.ini) - в виде "списка имён настроек/свойств _SCREENа? Ну так тут всё получается достаточно прямолинейно, хотя и "в два движения" - сначала считываем этот "список имён свойств" - и таки в коллекцию/массив (ALINES к примеру побьёт строку "имён через запятую"), затем уже цикл по нему, и используя GETPEM() получаем сами "значения". При том это лучше будет делать внутри соответствующей функции, т.е. на её вход будет подаваться либо "список свойств _SCREEN разделённых запятой", либо имя ini/txt/pnl/не_суть_важно файла с таким списком. Т.е. в любом случае в КОДЕ не будет никаких конструирований
DIME params[100]
params[1]=_SCREEN.Some
params[2]=_SCREEN.Other
...
params[100]=_SCREEN.OneMore

Если эти "наборы" не специфичны для конкретных форм, т.е. на всё приложения есть 2-3 "набора" а используются они в 100 местах, то лучше уже переосмыслить саму систему хранения "настроек", привязав тем или иным способом к каждой настройке информацию о том в какой набор она входит. Это позволит вполне себе "прямо" получать нужные "подмножества N" и "подмножества M".

Вот только я отчего то уверен на 90% что всё это "горе от ума" - излишнее усложнение системы. Конструирование на фоксе ещё одного "фокса, но проще"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Igor Korolyov
в ini файле удалят одно из значений, и привет - прога рухнула в ini файле удалят одно из значений, и привет - прога рухнула

Тогда давай другие возможные случаи рассмотрим:

- удалили EXE-файл
- убили разработчика
- грохнули БД
- спи... украли компьютер


М-да, это серьезнее, нежели удалять значения из INI-файла, существование которых, кстати, нетрудно проверить при старте (правда я не делаю, мне незачем).




------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Ну по-хорошему валидность и полноту ini проверять таки нужно
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Цитата:
Ну так тут всё получается достаточно прямолинейно, хотя и "в два движения" - сначала считываем этот "список имён свойств" - и таки в коллекцию/массив (ALINES к примеру побьёт строку "имён через запятую"), затем уже цикл по нему, и используя GETPEM() получаем сами "значения". При том это лучше будет делать внутри соответствующей функции, т.е. на её вход будет подаваться либо "список свойств _SCREEN разделённых запятой", либо имя ini/txt/pnl/не_суть_важно файла с таким списком.

Да я тоже к строке и пришел (от нее же и выходил). Отличия от передачи параметрами несущественные - лепить плюсы и разделитель, ну это ДЛЯ МЕНЯ всяко лучше, чем копипастить 100500 вызовов коллекции/массива/функции без веской на то необходимости. А так передал - и пусть функция сама создаст коллекцию. Меня устроит, другие решения как-то не подходят. Пусть даже это нехорошо и неправильно, просто
а) я этим пользоваться не собираюсь всегда, порой действительно лучше/проще/удобнее сделать каким-то другим способом, если немного везения - то и не г-кодом ;)
б) разработка ведется (опять же для меня!) быстрее, код проще и понятнее в сопровождении. Но если Игорь назвал это г-кодом - то значит так оно и есть, тут ничего не поделать с диагнозом. Придется с ним жить.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
spinz
Ну по-хорошему валидность и полноту ini проверять таки нужноНу по-хорошему валидность и полноту ini проверять таки нужно

Согласен. Но может тогда, когда все работает, а этой проверки еще не было. Начинать писать прогу (или класс для работы с данными) мне не кажется разумным и правильным. А потом добавить несложно, если все полетело.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
sphinx
Да я тоже к строке и пришел (от нее же и выходил). Отличия от передачи параметрами несущественные - лепить плюсы и разделитель, ну это ДЛЯ МЕНЯ всяко лучше, чем копипастить 100500 вызовов коллекции/массива/функции без веской на то необходимости. А так передал - и пусть функция сама создаст коллекцию.

А если тупо отказаться от передачи параметров в функцию, определив все требуемые параметры как глобальные переменные?

Это безусловно хреновая практика, но как костыль для конкретного решения, думаю, может и сгодиться.
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А в чем проблема-то?
- передать в функцию 100 произвольных параметров (например, 100 обьектов, их особо и не сериализируешь, не превратишь в JSON/XML)
- если это не переменные, а настроечные параметры (ИНИ-файл, метаданные), то сделать так чтобы они были видны в этой функции
- еще что-то

Все это решается, если знать конкретные детали, а именно какой вариант исходных, передаваемых, данных - 1й или 2й, или еще какой (3й)

(в фоксе все инструменты для передачи чего угодно куда угодно, внутри приложения, есть - PUBLIC, PRIVATE, _SCREEN, Empty-обьект, массив, коллекция, XML, DBF, ВК-строки, ALINES... - ВСЁ есть )

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



Исправлено 1 раз(а). Последнее : of63, 12.12.17 18:52
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
spinz
А если тупо отказаться от передачи параметров в функцию, определив все требуемые параметры как глобальные переменные? А если тупо отказаться от передачи параметров в функцию, определив все требуемые параметры как глобальные переменные?

Да ты не понял. Они и так все глобально лежат в коллекции _SCREEN. Нужно определенный набор в одну форму передать, другой набор - в другую форму. Их придется перечислять. Но не хочется писать .Add() в коллекцию, заполнять массив и пр. напрямую. Удобнее же кинуть список, пусть автоматически все сам метод заполнит.
Разумеется, если есть другие способы - я на них внематочно посмотрю.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
of63
Не надо ставить во главу угла быстродействие, а ставить лучше "грамотность" построения
+100500
Главное, что бы взглянув на код, сразу было ясно что он делает.
Лично для меня, легкость сопровождения, выше легкости написания)
Потому внятные имена, и ясный код (не у меня, а в идеале )

Но сама задача не понятна. Пытался придумать зачем такое, и не смог толком.
sphinx
В одной форме нужен некий набор из N, а в другой из M
Ну так конкретная форма то знает об этом.
Как то просится некий класс (метод) который и обрабатывает этот набор.
Вопрос о самом наборе. Он неизменный, так одно. Меняется - другое.
Но по любому, сам то набор уже есть?
А коли есть, так натравить на него этот метод, у которого 1 параметр (указатель что используется набор из N, M,Q,W...)))
А уж метод, с имеющимся набором разберется...
Все же сама задача непонятна...(
Тем более что не раз встречается...

Например сохранить с формы все, хоть положение, хоть данные, совсем не сложно.
Но речь наверное не о том?


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




Исправлено 1 раз(а). Последнее : Аспид, 12.12.17 19:26
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
sphinx
Они и так все глобально лежат в коллекции _SCREEN. Нужно определенный набор в одну форму передать, другой набор - в другую форму.

Вот тут не понял. Т.е. разные формы не могут напрямую обращаться к коллекции _SCREEN?

Если могут, то зачем им что-то предавать?
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
sphinx
spinz
А если тупо отказаться от передачи параметров в функцию, определив все требуемые параметры как глобальные переменные? А если тупо отказаться от передачи параметров в функцию, определив все требуемые параметры как глобальные переменные?

Да ты не понял. Они и так все глобально лежат в коллекции _SCREEN. Нужно определенный набор в одну форму передать, другой набор - в другую форму. Их придется перечислять. Но не хочется писать .Add() в коллекцию, заполнять массив и пр. напрямую. Удобнее же кинуть список, пусть автоматически все сам метод заполнит.
Разумеется, если есть другие способы - я на них внематочно посмотрю.

Форма1 ждет список параметров N (например, все, которые и так "глобально лежат в коллекции _SCREEN", ее сломают) ?
Форма2 ждет список параметров M (например, все, которые и так "глобально лежат в коллекции _SCREEN", ее сломают) ?

Например, передавай в каждую из форм список (через запятую или ВК) имен, которые ей нужно в себя прочитать (из _SCREEN), b это всего ОДИН C-параметр... Не подойдет?
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
spinz
Вот тут не понял. Т.е. разные формы не могут напрямую обращаться к коллекции _SCREEN?
Если могут, то зачем им что-то предавать?
Передавать им надобно "к кому обращаться". Имена свойств.
Я тоже не могу придумать разумного применения такого подхода.
Ну "настройки" приложения обычно РАЗНО-смысловые. Скажем "отчётный период", "папка для выкладывания созданных отчётов", "имя последнего авторизовавшегося пользователя", "название организации для отчётов", "адрес веб-сервиса для проверки ИНН"... Я не представляю как можно комбинировать настолько разные значения для "вызова какой-то функции для каждого из них".
Это логично делать для однотипных "настроек" - ну, если есть "папка для отчётов 1", "папка для отчётов 2", ... "папка для отчётов 100" - и в форму "А" надо передать что она будет работать с 1,3,5,7,9,...99 папками (конкретные имена которых и прописаны в настройках _SCREEN.OutputFolderNNN), а в форму "Б" что она работает к примеру с 5,10,15,85,95... Ну ладно, можно заменить "папку" на "адрес веб-сайта". Но всё одно тут основной косяк как раз в том что "однородная" информация распихана по отдельным свойствам со своими именами (и не важно даже, "шаблонные" они или абы-какие).
Буде это помещено в коллекцию, или вообще записано в курсор/таблицу где дополнительно будут поле/поля "для фильтрации" - и собственно нужный "массив данных" будет получаться тривиальным запросом... И не нужно никаких "опосредований", "списка имён" и т.п.
Но задача не озвучена, что это за "оно" - неизвестно, автор доволен своим решением (скорее всего костылём, но какая разница) и никаких альтернатив не хочет...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Igor Korolyov
автор доволен своим решением (скорее всего костылём, но какая разница) и никаких альтернатив не хочет...

Тащемта подобная психология присуща наверное минимум 90% программистов - своё всегда "ближе к телу", даже когда логика подсказывает, что "своё" - это извращение
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Непонятно, что детали задачи (своего решения) так и остались непонятны на протяжении 5-ти страниц, и не мне одному. Тебе понятны?
Ratings: 0 negative/0 positive
Re: Как можно обойти ограничение в 26 параметров?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
spinz
Вот тут не понял. Т.е. разные формы не могут напрямую обращаться к коллекции _SCREEN?
Если могут, то зачем им что-то предавать?Вот тут не понял. Т.е. разные формы не могут напрямую обращаться к коллекции _SCREEN?

Если могут, то зачем им что-то предавать?

Все объекты видят коллекцию _SCREEN. Но для формы Form1 нужно передать 3, 7, 11, 19 номер. То есть разработчик сам определяет множество в очередном наборе. Через заполнение массива/коллекции я знаю, но не хочу.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


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

On-line: 29 (Гостей: 29)

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