У меня есть сильное чувство в отношении методов, возвращающих несколько результатов для дальнейшего множественного присваивания, например:Возвращает несколько результатов антипаттерн?
class ImportUsersFromFile
def perform
...
[imported_rows, errors]
end
end
потому что он вводит неясную и inobvious структуру данных «массив, первый элемент которого является этой вещью, и вторым это что-то другое ». Было бы замечательно, если бы было очевидно, что метод должен вернуть такую структуру. Например, можно ожидать три значения first_name, middle_name, last_name
по методу Person#name_parts
.
Но я не могу подтвердить свое мнение ничем, кроме моих слов. Является ли множественный результат рассмотренным запахом какого-либо вида шаблона или кода? Хотелось бы иметь некоторые ссылки.
Ваш код возвращает массив, который может быть введен в несколько значений с использованием функции «Уничтожение» Ruby. Что случилось с массивом? BTW: Почему бы не поднимать ошибки, а не вводить их в возвращаемые значения? – sschmeck
Я объяснил, что не так с деструкцией массива в этом случае: интерфейс не ясен. Одно дело ожидать, что 'perform' возвращает список импортированных пользователей, а другой - знать, что он действительно возвращает массив из двух списков. Ошибки не возникают в моем случае, потому что они не являются исключительными - если в некоторых строках есть ошибки, другие строки должны быть импортированы в любом случае. – Hnatt
Затем ваш интерфейс метода возвращает два ведра: один с хорошими строками и один с плохим. Это звучит разумно для меня, но не как антипаттерн. Если ошибки не имеют значения, то игнорировать их явно, как 'users, _ = importer.perform'. – sschmeck