В чем разница между вызовом функции с параметрами и без? - PullRequest
0 голосов
/ 14 июля 2020

Представьте, что у меня есть две функции:

У меня есть глобальная переменная string username, значение которой я получаю из текстового поля.

public void sample_function() {

    // initialize connection, prepared Stmnt and resultset.
    String query="select id from test_table where name=?";
    pst = c.prepareStatement(query);
    pst.setString(1, username); 
    rs = pst.executeQuery();
    if(!rs.next()) 
    {
        // something
    }
    else
    {
        do{
            // something

        }while(rs.next());
    }
}

и всякий раз, когда я хочу чтобы вызвать выполнение этого блока кода, я просто использую sample_function(); Это хорошо работает. Я видел код, в котором в качестве аргумента передается строка, например

public void sample_function(String username) {

    // initialize connection, prepared Stmnt and resultset.
    String query="select id from test_table where name=?";
    pst = c.prepareStatement(query);
    pst.setString(1, username); 
    rs = pst.executeQuery();
    if(!rs.next()) 
    {
        // something
    }
    else
    {
        do{
            // something

        }while(rs.next());
    }
}

, а функция вызывается с помощью sample_function(username);.

Мои вопросы:

  1. Когда запрос получает требуемый ввод из текстового поля, зачем в первую очередь передавать аргумент.
  2. Если это способ написать функцию, почему sample_function () работает так же хорошо, как sample_function (имя пользователя)
  3. В каких случаях следует передавать параметры / аргументы, а когда просто использовать пустую скобку ()

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Наличие функций, принимающих параметры, позволяет вам выполнять одну и ту же функцию с разными данными.

Представьте, что вы хотите использовать эту функцию не только для выполнения кода для одного имени пользователя, но и для трех имен пользователей подряд. Как будет выглядеть код, вызывающий функцию?

С параметрами он будет выглядеть так:

sampleFunction("User One")
sampleFunction("User Two")
sampleFunction("User Three")

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

username = "User One"
sampleFunction()
username = "User Two"
sampleFunction()
username = "User Three"
sampleFunction()

Этот код не только уродливее, но и сложнее для понимания.

Подумайте о своих товарищах по команде, которые хотели бы использовать вашу функцию из своих код (помните, программное обеспечение обычно разрабатывается в группах). Как они узнают, что перед вызовом этой функции им необходимо установить для глобальной переменной username какое-то значимое значение? Да, они могут найти это в вашей документации (если вы ее написали) или спросить вас (есть ли у вас на это время). Но с параметрами функции среда разработки обычно говорит им: «Эй, эта функция хочет String username в качестве входных данных, а вы не дали ей его». (однако может зависеть от языка. Например, в JavaScript все параметры функции являются необязательными, поэтому забывание параметров является синтаксически правильным, даже если это может привести к неожиданному поведению во время выполнения)

А как насчет человека, читающего этот код и пытающегося понять, как он работает? Им придется предположить, что установка username на какое-то значение каким-то образом связано с вызовом sampleFunction позже. В этом конкретном примере это все еще очевидно. Но в реальной программе эти два шага могут происходить на расстоянии нескольких строк или даже в разных файлах исходного кода. Таким образом, зависимость sampleFunction от глобальной переменной username не сразу очевидна.

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

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

Это просто дизайнерское решение, а не сделать ваш код чистым, многоразовым и хорошо структурированным, в зависимости от использования.

Я даю вам несколько примеров:

Пример 1 :

Если username является , используемым во многих методах вашего класса , лучше сделать его свойством класса , чем передавать его как аргумент для каждого метода, чтобы он стал глобальным или общим со всеми из них.

С другой стороны, если username используется только sample_function(), нет необходимости делать его свойством класса и делать класс беспорядочным и уродливым с помощью бесполезных переменных, особенно если для класса не имеет смысла иметь свойство с именем username.

Пример 2:

Давайте рассмотрим, что sample_function() - это просто метод поиска и называется searchByUsername(). Чтобы этот метод был читаемым и значимым , он должен принимать username в качестве аргумента, а также быть слабо связанным со своим классом, особенно если класс repository .

Пример 3:

Вы можете решить, в зависимости от того, где устанавливается значение username в поле ввода и когда вызывается sample_function(). Если есть кнопка поиска и когда пользователь нажимает на нее, , вы должны прочитать значение username из текстового поля, затем вызовите sample_function(), sample_function() должен принять username как аргумент как username здесь local внутри функции кнопки, и нет необходимости передавать его в глобальную переменную и перечитывать в sample_function().

Но если sample_function() вызывается в месте , отличном от , в котором установлено значение username, лучше сохранить username в глобальной переменной, чтобы оно могло быть доступно дюйм sample_function()

... И все больше и больше примеров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...