![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Rohoss |
|
||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Есть класс с множеством методов
Мне нужно вызывать разные методы этого класса, типа как здесь
только здесь у процедуры один параметр, а мне нужно чтобы количество параметров менялось. Для того чтобы этим процедурным типом можно было вызвать любой метод класса TCommands Надеюсь у меня получилось правильно выразить мысль ![]() Это сообщение отредактировал(а) Rohoss - 19.8.2008, 20:38 |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Возможно ли такое вообще?
|
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
хм, ну в принципе как Tnte объявишь, так и вызывай... в чем проблемма то? -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Так функции имеют разное количество параметров, причём не известно, сколько их будет (параметров).
Добавлено через 1 минуту и 45 секунд Нужно как-то Tnte объявить как функцию с динамическим количеством параметров. Добавлено через 7 минут и 14 секунд Можно было параметром использовать динамический массив, но класс TCommands уже определён |
|||
|
||||
Zmiy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Rohoss, все параметры - строки?
Добавлено через 10 минут и 58 секунд Не знаю, попробуй
или
|
||||
|
|||||
ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Да
Сделал типо теста, сообщения выходят бредовые… |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
ama_kid немного не то… Тип должен использоватся для функции с разным количеством параметрами, а у тебя параметр массив…
Это сообщение отредактировал(а) Rohoss - 20.8.2008, 23:18 |
|||
|
||||
ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
![]()
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
Felan |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Тебе придется делать метод с переменным числом аргументов, потом проверять типы и приводить типы аргументов. Без этого не как. Есть другой вариант,
если есть возможность переделать архитектуру классов, то смотри в сторону паттерна проектирования Command. И, если неизвестно изначально, какие команды могут быть, смотри виртуальные конструкторы. Общая суть такая:
Тест кода:
Это сообщение отредактировал(а) Felan - 21.8.2008, 08:42 -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||
|
|||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
ama_kid либо я не понял твоего примера, либо ты не понял что я хочу…
Есть, к примеру, текстовый файл fun.txt
приложения должно читать каждую строчку этого файла, вызывать метод класса TCommands и передавать этому методу параметрами то что идёт после пробела. «&» - разделитель между параметрами. Команды класса TCommands будут добавляться, а некоторые будут экспортироваться с dll, поэтому заранее определить не получится. Добавлено через 10 минут и 56 секунд Felan в твоём примере запутался, разберусь и отпишусь чуть позже… ![]() Это сообщение отредактировал(а) Rohoss - 21.8.2008, 21:40 |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Rohoss, может и глупость сейчас говорю... Но что если сделать тип TNte с максимальным для методов класса TCommands параметров?
То есть например:
|
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Felan для каждой команды создавать свой класс?
![]() Добавлено через 4 минуты и 38 секунд THandle там точно есть команда с больше чем десятью параметрами… это не весь код класса TCommands. Пока единственный способ вижу изменять класс TCommands (сделать параметром динамический массив), но этого очень не хотелось. |
|||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Почитай про паттерны проектирования. Это паттерн "Команда" и все станет понятно. ![]() Ну и что? В чем проблема-то? Зато каждая команда будет полностью самостоятельной единицей, которую ты сможешь править независимо ни от чего, и все изменения будут локализованы. Лучше что-ли когда у тебя класс с мильоном методов, да еще не дай бог, перегруженных? Да с переменными аргументами? Да тип у этих аргументов общий, который нужно приводить на месте к нужному типу? Да за порядком этих аргументов нужно тщательно следить, за безопасностью типов тоже... за их правильным приведением... Чуть что, все надо перелопачивать... опухнуть можно ![]() И вот это как раз реализуется отлично. В моем примере добавляешь абстрактный метод Parse, в каждой команде реализуешь специфичный для нее парсинг строки. Динамически, создаешь нужную команду и выполняешь ее.... Все работает. В принципе, я тебе даже показал способ как можно команды без перекомпиляции добавлять... Только нужно будет их хранить в длл, и использовать паккаджи для общих классов. ЗЫЖ Логика такая. Есть базвый класс команды. Он используется для полиморфного выполнения и передачи объекта !ЛЮБОЙ! команды, которая унаследована от него (тут правда можно еще интерфейс использовать, но тогда не получит использовать виртуальные конструкторы напрямую). Каждая команда предаставляет собой класс-наследник базовой команды, которые реализует специфичный для себя функционал и инкапсулирует в себе все вспомогательные действия типа парсинга строки команды.... Все команды выполняются единообразно, после того как создается и настраивается класс команды. Их даже хранить не надо, создал команду, когда понадобилась, выполнил ее, уничтожил... Это сообщение отредактировал(а) Felan - 22.8.2008, 07:29 -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Felan, вопрос в том, чтобы не переопределять класс TCommands
Добавлено через 12 минут и 8 секунд А если уже без переопределения класса никак, то чем твой метод лучше от использования динамического массива? 1. Не нужно процедуру парсинга писать для каждой команды. 2. Получится более компактно. 3. Можно использовать общие поля класса для всех команд |
|||
|
||||
Felan |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну тогда конечно такой способ не подойдет. Ибо я сразу сказал, "если есть возможность переделать архитектуру".
Тем, что это классика ООП. Следовательно проверена не раз на практике. Тем что он понятный, прозрачный, типо-безопасный, расширяемый. Ессно программист использующий его должен иметь определенный уровень, что бы четко понимать ООП, виртуальные конструкторы делфи. (не принимай на свой счет, просто это факт. Что бы с чем-то разобраться и понять нужны определенные знания и опыт). Плохо. Т.к. будет одна процедура для всех команд. Команд много - процедура становится огромной, трудной для восприятия и понимания за счет объема. Для расширения списка команд обязательно требуется перекомпиляция и очень внимательное и осторожное добавление команды. Пройдет время и ты не сможешь изменить ее так, что бы не потратить кучу времени на отладку. В моем случае у каждой команды своя маленькая процедурка, ошибки в которой влияют только на эту команду. Проще поддерживать, отлаживать, ошибки локализуются. Цель разработчика сделать код понятным, простым, устойчивым, что бы можно было его легко поддерживать исправлять. А компактность это не показатель. Можно все в одну строку написать без пробелов, будет еще компактнее. Как будешь читать модуль в 1000 символов? С такой компактностью потеряешь все преимущества, про которые я говорил в предидущем пункте + к ним добавишь проблемы с ручным контролем типов. Вот это просто ОШИБКА проектирования! Пройдет пару месяцев и для того, что бы исправить одну команду будешь неделю проверять не затронуло ли это другую. Зачем смешивать данные? Ты что для контроллера пишешь? Тебе принципиально сэкономить несколько байт? Это конечно все не критично, если пишешь проект с тремя командами, который один раз отдашь кому-то и забудешь, а если у тебя будет много команд, тебе придется его поддерживать и расширять, исправлять ошибки, все это хлебнешь по полной ![]() Ну а если тебе принципиально нельзя менять архитектуру, то выбирай из того, что тебе уже сказали. Или можешь все-таки сделать метод, который выбирает команду например таким:
Где TArgument базой класс типа TCommand в моем варианте, а от него наследника для каждой команды. Тогда по типу класса сможешь определить точно, какую команду нужно вызвать а в полях объекта передать нужные данные. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||
|
|||||
Rohoss |
|
||||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Ну вот функция:
Раз написал и забыл о парсинге… ![]() Добавлено @ 14:44 А так выглядят функции класса TCommands
Это сообщение отредактировал(а) Rohoss - 23.8.2008, 14:48 |
||||||
|
|||||||
Rohoss |
|
||||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
А почему они должны смешиваться? К примеру полем является класс для ведения логов
у него функции типа
Почему они будут смешиваться? В принципе они независимы, разница в том, что этот класс создаётся один раз, а не для каждой команды. Каждый байт конечно не важен, но ИМХО это не оправдано… ![]() |
||||||
|
|||||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
ну, здесь я так понимаю опять же нужно переопределять класс… ![]() Дело в том, что TCommands писал не я, и в нём 186 команд, общей длиной 11700 строк ![]() |
|||
|
||||
Felan |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну если так то хорошо. А если придется добавлять еще одну команду, которую надо будет парсить по другому?
Ну возможно я не совсем понял, что ты имеешь ввиду под "общими полями для всех команд". Создашь один раз и он будет у тебя висеть все время, пока работает программа... В моем случае команда существует пока выполняется.
Нет. Здесь как раз его не надо переопределять. Здесь ты делаешь обвязку для этого класса, которая изолирует его.
Не важно кто писал. Важно то, можешь ты его изменить или нет. Вот видишь, количество команд уже большое. ЗЫЖ Количество классов одно, количество объектов - другое. Я не настаиваю на своем способе и не говорю, что твой не правильный. Я просто привел другой вариант, который на мой взгляд более правильный. Но это только на мой взгляд ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||
|
|||||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
||||
|
||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну я даже не знаю, Как тут его привести...
Ну например так:
ЗЫЖ Но учти, что это обертка ![]() ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Пробежал тему по-диагонали.
Вопрос: есть имя метода, скажем, 'XXX'. Есть ли возможность узнать, сколько у него параметров в классе? Т.е. по имени определить число параметров? Если да, то я не вижу проблемы. Можно сделать, например, как-то так:
Не нравится объявление 20-ти типов? Можно вызвать процедуру и без них, если код вызова записать на ассемблере. Первые три аргумента пойдут по регистрам, остальные - циклом до числа параметров пихаются в стек, после чего делаем call. P.S. Что будет, если число параметров у метода и число строк, которое мы напарсили, отличается? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rohoss |
|
||||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Ты имел ввиду в функции? Хз, думаю как-то можно…
В ассемблере я полный ноль… ![]()
Не понял вопроса… Если мы передадим в метод не то количество параметров которые у него есть ![]() Добавлено через 7 минут и 13 секунд Felan твоего примера я пока не понял, попробую разобраться чуть позже, что-то он мне кажется сильно раздутым… Ты предлагаешь писать наследника TArguments для каждой команды??? ![]() |
||||||
|
|||||||
ama_kid |
|
||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Добавлено а, ну после этого - я тебя понял ![]() ![]() Это сообщение отредактировал(а) ama_kid - 25.8.2008, 22:27 -------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||
|
|||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Значит ваше кунг-фу ещё недостаточно хорошо ;)
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
CodeMonkey было бы очень не плохо если бы ты прокомментировал то, что написал… Так как гугл не заваливает инфой по запросу «delphi ObjAuto»
![]() Добавлено через 47 секунд да и drbk тоже… |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Всё это подробно разжёвывается, например, здесь: http://hallvards.blogspot.com/2006/09/exte...class-rtti.html и далее по ссылкам.
На русском: http://www.transl-gunsmoker.ru/2011/07/dig...nd-websnap.html (начало серии тут: http://www.transl-gunsmoker.ru/2011/07/pol...ad-nauseum.html ) P.S. Респект за попытку разобраться вместо бездумного копирования! ![]() Это сообщение отредактировал(а) CodeMonkey - 17.8.2011, 07:10 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
||||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Начиная с Delphi 2010 появилась новая RTTI, где можно делать много новых вещей.
Немного ссылок: http://robstechcorner.blogspot.com/2009/09...tti-basics.html http://habrahabr.ru/blogs/delphi/86840/ http://delphi.about.com/od/oopindelphi/a/delphirtti.htm http://robstechcorner.blogspot.com/search/label/RTTI
Это сообщение отредактировал(а) CodeMonkey - 13.9.2010, 20:51 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |