|
Нужен совет по оптимизации | ☑ | ||
---|---|---|---|---|
0
Steel_Wheel
05.03.12
✎
19:12
|
Гуру рунета молчат, спрошу-ка я на старой доброй Мисте...
Есть контролы, которые очень похожи друг на друга (кнопки, поля ввод, комбо-боксы). Для каждого вида при взаимодействии (например, при нажатии на кнопку, или вводе текста в едит-бокс) выполняется определенная последовательнсоть действий. На данный момент, такого кода в проекте, больше, чем кода, который привносил бы что-нибудь свежее и новое. Хотедось бы оптимизировать структуру таким образом, чтобы избавиться от этого повторяющегося кода. Поделитесь опытом, коллеги, плиз. Вот, например кнопка описывается так: private var createButton:TestActions = new ControlElement("ButtonAdd", "name"); Реализация нажатия на контрол выглядит примерно так: public function clickCreateButton():TestActions { var theCommand:TestActions = new TestActions(ActionsEnum.CLICK, [null], createButton); return theCommand; } В связи с тем, что кнопок много и над ним выполняется всего лишь одно действие, появилось желание создать класс, наследующий ControlElement-у, и в него выкинуть функцию нажатия. А переменные сделать не private, а public. Ну и так для каждого вида контрола: определить класс, реализовав в нем типовой функционал |
|||
1
Lama12
05.03.12
✎
20:45
|
Поздно спросил... завтра подними.
|
|||
2
Ненавижу 1С
гуру
05.03.12
✎
20:56
|
это язык такой или псевдокод?
|
|||
3
ТочноеЯдро
05.03.12
✎
21:50
|
Массив контролов а-ля VB ? На один вид - один обработчик события
|
|||
4
Steel_Wheel
06.03.12
✎
10:25
|
Ап
|
|||
5
Ненавижу 1С
гуру
06.03.12
✎
10:54
|
(4) ни черта не понятно
|
|||
6
Steel_Wheel
06.03.12
✎
12:19
|
(5) А представляешь мне каково это разгребать?
Проще объяснить вряд ли получится |
|||
7
Ненавижу 1С
гуру
06.03.12
✎
12:20
|
(6) забей
|
|||
8
Steel_Wheel
06.03.12
✎
12:33
|
(2) Это actionScript, но, в принципе, это вторично...
(7) не-не-не, забивать нельзя... этот монстр скоро будет состоять из 3-ех строчных функций, которые отличаются только одним параметром |
|||
9
Ненавижу 1С
гуру
06.03.12
✎
13:28
|
(8) ну перенеси в одну функцию с одним параметром и
1. либо вызывай опять таки постоянно )) 2. либо уже генерируй эти функции |
|||
10
Steel_Wheel
06.03.12
✎
13:39
|
А почему бы не сделать метод click() у кнопок, и не сделать их открытыми. Тогда вызывающий код будет кликать нужные кнопки, мы избавимся от тонны отднострочных функций-прослоек....
Это -- автотест, порядок (на данный момент) вызова влияет очень сильно, но у системы 1 пользователь, который этот порядок знает -- Я |
|||
11
Ненавижу 1С
гуру
06.03.12
✎
13:44
|
(10) ну вот кто ж это кроме тебя знал?
|
|||
12
Steel_Wheel
06.03.12
✎
13:45
|
(11) Так я вон в первом посте написал...
Ну, про пользователей не критично, я пока про организацию думаю -- поддерживать архи неудобно |
|||
13
Jolly Roger
06.03.12
✎
13:52
|
(0) >Реализация нажатия на контрол выглядит примерно так:
public function clickCreateButton():TestActions { var theCommand:TestActions = new TestActions(ActionsEnum.CLICK, [null], createButton); return theCommand; } напиши грамотно, что за "реализация нажатия"? обработка нажатия в контейнере кнопки, что ли? а то действительно, ничерта не понятно... |
|||
14
Steel_Wheel
06.03.12
✎
15:00
|
(13) Служба выполняет асинхронные действия, находящиеся в массиве. Фактически, theCommand -- это и есть действие к выполнению. Т.е. как только сервер получает команду theCommand -- он ее выполняет. Фактически, мы реализуем не само нажатие, а формируем вид сообщения сервису.
Если у нас 100 кнопок то в текущем виде будет описано 100 функций clickNButton. Вот от этого хочется уйти, сделав вызывающий код проще, а вызываемый уменьшить в объеме |
|||
15
Ненавижу 1С
гуру
06.03.12
✎
15:19
|
(14) интересный способ использовать GUI
|
|||
16
Steel_Wheel
06.03.12
✎
15:38
|
(15) Со стороны феерично выглядит: сами открываются окошки, сам вводится текст и нажимаются кнопки... если, конечно, exception не взлетит... но его-то мы и ищем ))
|
|||
17
Steel_Wheel
06.03.12
✎
17:41
|
Начну с описания контекста: это -- автотест. Служба автотеста выполняет последовательность действий, записанных в массив.
Есть 3 уровня: 1. Уровень теста, на котором определяется, какие сущности с какими параметрами будут проверены. В моем примере -- CRUD. private function setUpLocTestCommandList(arr:ArrayCollection):void { trace("Setting up command line"); // First of all we need to login into application loginActions.LoginAs(arr, superUserName, superUserPassword); // Now we need to click on the 'Location tab' mainWindowActions.openLocationSection(arr); // Now we need to click button 'Create' on the header tab locationListActions.ClickCreate(arr); // Input name of location locationListActions.inputLocationName(arr, locationPopup.mainTab_name); } 2. Уровень сущности, в котором расписывается действие по шагам. // Наша кнопка public function ClickCreate(arr:ArrayCollection):void{ arr.addItem(locationListView.clickCreateButton() as MonkeyRunnable); } 3. Уровень UI, который формирует само сообщение на "нажатие" private var createButton:ControlElement= new ControlElement("ButtonAdd", "name"); public function clickCreateButton():TestActions { var theCommand:TestActions = new TestActions(ActionsEnum.CLICK, [null], buttonCreate); return theCommand; } Чем больше контролов -- тем сильнее разрастается код уровней 2 и 3. Причем разрастается очень сильно, т.к. для каждой кнопки прописана отдельная процедура клика. Параметры кнопки -- значения, которые мы вытащили spy-программой Кнопка не созлается вызовом createButton() потому, что 1) пока это не реализовано, 2) количество контролов фиксировано и меняется редко Реализация клика находится в службе автотеста. Мы генерируем ему сообщения. Честно говоря, не вижу другого способа (кроме создания иерархии классов) сокращения повторяющегося кода. Классы-наследники (button, editbox) будет включать в себя методы, присущи этому классу. Так мы не будем пытаться делать не те действия, которые недопустимы с точки логики для кеаждого типа элемента. M>А можно небольшую схему (можно словами), что будет в этих классах и какая у них будет ответственность? Пока планировал сделать 3 класса: Button extends ControlElement (метод click()) Editbox extends ControlElement (методы getFocus(), selectText(), inputBox()) Dropbox extends ControlElement (методы getFocus(), open(), selectItem()) Другие элементы пока трогать не будем -- оставим в виде ControlElement |
|||
18
Steel_Wheel
06.03.12
✎
19:15
|
ап
|
|||
19
Krendel
06.03.12
✎
19:16
|
(18) Ты в вебпрограммеры подался?
|
|||
20
Steel_Wheel
06.03.12
✎
19:18
|
(19) Нет. В Автотестеры
|
|||
21
Steel_Wheel
06.03.12
✎
19:18
|
Пишу программы, которые ищут дефекты в других программах
|
|||
22
Krendel
06.03.12
✎
19:18
|
А скока стоит?
|
|||
23
Krendel
06.03.12
✎
19:19
|
т.е. по сути ты делаешь ботов?
|
|||
24
Steel_Wheel
06.03.12
✎
19:21
|
(22) Ты про стоимость работ?
Если про работ, то тут нет конкретной цифры: фактически все пишется с нуля. Ну и фирма, в которой я работаю, работает на аутсорс, и я не знаю, сколько она берет за услуги (23) Да. Меня яндекс уже не любит (тренирую ботов на нем) |
|||
25
Krendel
06.03.12
✎
19:27
|
(24) Ботописатели это хорошоооо
|
|||
26
Krendel
06.03.12
✎
19:40
|
Ждем бота по танкам
|
|||
27
Jolly Roger
06.03.12
✎
20:56
|
(17) >Служба автотеста выполняет последовательность действий, записанных в массив
а это какой-то общеизвестный тестовый фреймворк или ваша собственная разработка? |
|||
28
Jolly Roger
06.03.12
✎
20:58
|
почему, собсно, тестовый сценарий хранится в массиве, а не в виде скрипта?
|
|||
29
vasilii85
06.03.12
✎
21:00
|
Год 86, вопрос понятен, ну почему ни кто не умеет читать!!!!!
|
|||
30
Steel_Wheel
06.03.12
✎
22:12
|
(27) Flexmonkey
(28) Потому что, Flexmonkey требует скрипт в виде последовательности асинхронных действий. Т.е. он сначала компилируется, потом билдится приложение, а после билда приложения, оно запускается и выполняется скрипт... только твой тест уже скомилирован (29) Здравствуй, мой дорогой друг. Чувствуй себя уютненько |
|||
31
Steel_Wheel
07.03.12
✎
12:15
|
Читайте сразу с поста №17
|
|||
32
Steel_Wheel
07.03.12
✎
14:46
|
ап, вдруг кто трезвый есть
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |