Есть ли способы упростить эту функцию JavaScript? - PullRequest
1 голос
/ 08 июля 2020

Я пишу JavaScript скриптов, которые взаимодействуют с GUI windows. В большинстве c терминов я определяю объекты и пишу функции для взаимодействия с этими объектами. Моя стандартная практика - создать объект для каждого поля в окне, а затем функцию для взаимодействия и функцию для проверки.

Так, например, если у меня есть такое окно:

Пример окна

У меня был бы один объект для выпадающего поля № 1, а другой - для текстового поля. То же самое для поля №2. У меня также есть объект для кнопки «Готово». Затем у меня была бы функция для выбора из раскрывающегося поля №1, ввода текста в текстовый объект, нажатия кнопки «Готово» и т. Д. c. Это упрощение, но основная идея. Мы используем класс для общей компоновки окна, а затем дочерние классы для каждого отдельного окна, но все они в основном работают таким образом.

Хорошо, у меня есть окно, в котором я пытаюсь создать функцию быстрого доступа где я хочу выбрать вариант из раскрывающегося списка в зависимости от того, не установлен ли текст в текстовом поле для этого. Это легко проверить, так как есть только два варианта: «Да» и «Нет».

Итак, у меня есть этот кусок длинного кода для простой операции:

function toggleOption(option)
{
    //Simplistic check to see that users are only using Yes or No
    if (option.length > 3)
    {
        test.fatal("FATAL: \"" + option + "\" is not a valid input. Please use a variant of \"Yes\" or \"No\"");
    }
    
    //Allows for multiple variants of yes/no to be used in the option parameter
    option = option.substring(0,1).toUpperCase();
    var text;
    

    //Defines a text variable depending on what option is used 
    if (option === "Y")
    {
        text = option + " - Yes";
    }
    else
    {
        text = option + " - No";
    }
    

    // Opens the window if not already open
    if (!object.exists(names.Window))
    {
        openWindow();
    }
    

    // There are two fields that will be selected
    // Only selects the option if the text box is set to a different option.
    if (waitForObjectExists(names.TextBox1).text !== text)
    {
        selectField1(option);
        clickDoneButton();
    }
    
    // Only selects the option if the text box is set to a different option.
    if (waitForObjectExists(names.TextBox2).text !== text)
    {
        selectField2(option);
        clickDoneButton();
    }
    

    //The assumption is that this is going to take care of closing the window (which automatically closes when done is clicked) if none of the options are selected.
    if (object.exists(names.Window))
    {
        closeWindow();
    }
}

Итак, весь этот код работает, но он кажется смехотворно запутанным и раздутым для чего-то, что должно быть довольно простым. Мне было интересно, есть ли у кого-нибудь представление о методах, которые я мог бы использовать, чтобы упростить это и сделать его более эффективным.

ПРИМЕЧАНИЕ. Я заменил фактические имена объектов на общие c имена, чтобы, надеюсь, сделать код более разборчивым. Извините, если я пропустил какие-либо изменения текста.

1 Ответ

1 голос
/ 08 июля 2020

Ну, вы можете использовать троичное вычисление :

    if (option === "Y")
    {
        text = option + " - Yes";
    }
    else
    {
        text = option + " - No";
    }

превращается в:

    text = option  + ((option === "Y") ? " - Yes" : " - No" );

Вы также можете сделать generi c стрелочная функция в ES6 для инкапсуляции option и text:

    // There are two fields that will be selected
    // Only selects the option if the text box is set to a different option.
    if (waitForObjectExists(names.TextBox1).text !== text)
    {
        selectField1(option);
        clickDoneButton();
    }
    
    // Only selects the option if the text box is set to a different option.
    if (waitForObjectExists(names.TextBox2).text !== text)
    {
        selectField2(option);
        clickDoneButton();
    }

Примерно так:

const clickButton = (selectFunc, nameTextBox) => {
    // I use closure here to encapsulate 'option' and 'text'
    if (waitForObjectExists(nameTextBox).text !== text){
        selectFunc(option);
        clickDoneButton();
    }
}

и использование:

clickButton(selectField1, names.TextBox1)
clickButton(selectField2, names.TextBox2)

Ура! : -)

...