Имя: Пароль:
IT
 
Нужен совет по оптимизации
,
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
ап, вдруг кто трезвый есть
Основная теорема систематики: Новые системы плодят новые проблемы.