Подход к разработке метода, при котором метод принимает переменное число значений для параметра - PullRequest
0 голосов
/ 19 марта 2020

У меня есть метод, который может принимать одно имя файла или массив / список файлов, и выполняет некоторую обработку для них следующим образом:

public void methodName(String file, int arg2) {
...
}

ИЛИ

public void methodName(String[] files, int arg2) {
...
}

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

  1. Создайте метод 1 и напишите обертку вокруг него, чтобы обрабатывать список файлов
public void methodName(String file, int arg2) {
...
}
public void methodName2(String[] fileName, int arg2) {
    for(String fn : fileName) {
        methodName(fn, arg2);
    }
}
Создание метода 2 и запись оболочки для обработки одного экземпляра файла
public void methodName(String[] files, int arg2) {
...
}
public void methodName2(String file, int arg2) {
    methodName(new String[]{file});
}
Принимать одиночные и множественные аргументы через массив
public void methodName(String[] files, int arg2){
...
}

methodName(new String[]{"fileOne"});
methodName(new String[]{"fileOne", "fileTwo"});

Вариант 3 кажется немного грубым при передаче аргументов; необходимость создания массива для одного экземпляра.

Может быть, другой подход. Допустим, переменные аргументы нежелательны, изменяя параметр other.

Какие вещи следует учитывать сейчас и для удобства обслуживания в будущем?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вариант 3 может заключаться в использовании varargs, обратите внимание, что arg2 должен предшествовать файлам в объявлении метода

public void methodName(int arg2, String... files) {
    for (String file: files) {

    }
}

Что касается вариантов 1 и 2, они в основном одинаковы, но с небольшими внутренними различиями. Вы должны воспользоваться перегрузкой методов и использовать те же имена методов, это даст большое преимущество пользователю publi c методов.

public void methodName(String file, int arg2) {
    ...
}

public void methodName(String[] file, int arg2) {
    ...
}

Это, конечно, применимо к обоим вариантам 1 и 2

0 голосов
/ 19 марта 2020

Еще одна вещь, которую вы могли бы рассмотреть, это не только удобство сопровождения, но и тестируемость .

На мой взгляд, опция 1 говорит

У меня есть метод methodName для одного файла. Если у меня есть список файлов, я могу последовательно применить к нему methodName.

Вы просто создаете естественное расширение methodName2, построенное на более простых функциях methodName.

Обратите внимание, что это некий метод " разделяй и властвуй ".


опция 2 говорит:

У меня есть метод methodName в списке files. Если у меня есть один файл, я могу создать список файлов (один файл) и вызвать для него methodName.

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


Так что опция 1 определенно более естественная.

Лучше проверить что-то работает над одной вещью, тогда вы можете быть уверены, что она будет работать и со списком этих вещей.

...