Я думаю, что вы хотите, это
Градиент оттенков - это простая задача линейной интерполяции:
const length = 100;
const hueGradient = Array.from({length}, (v, k) => k/(length-1));
Пример преобразования из HSL в RGB можно найти в ответ на на этот вопрос . Используя это:
const saturation = 1.0;
const lightness = 0.5;
const rgbValues = hueGradient.map(hue => hslToRgb(hue, saturation, lightness));
Результатом является массив [R, G, B]
, который вы можете выразить как #rgb
значения:
const htmlRgbValues = rgbValues.map(([r,g,b]) => `#${htd(r)}${htd(g)}${htd(b)}`);
Есть хороший шанс, что вы не хотите таблица поиска, но вместо этого вы хотите интерполировать на лету, просто используйте
const htmlRgbValue = hslToRgb(x / x_max, saturation, lightness);
Ваш вопрос указывает на возможность, что Вы будете возвращать больше данных в будущем, таким образом, я рекомендовал бы реализовать Ваш собственный класс для содержания данных.
То, что это означает, - то, что Ваша сигнатура метода останется тем же, даже если внутреннее представление объекта Вы раздадите изменения для размещения большего количества данных. Это - также хорошая практика по причинам инкапсуляции и удобочитаемости.
Если бы метод производит два - три связанных значения, я сгруппировал бы их в типе. Если бы значения не связаны, метод, скорее всего, делает слишком очень, и я осуществил бы рефакторинг его во многие более простые методы.
Это зависит от типа и значения результатов, а также закрыт ли метод или нет.
Для закрытых методов я обычно просто использую Кортеж от моей библиотеки классов.
Для общедоступных/защищать/внутренних методов (т.е. не частный), я использую или параметр или пользовательский класс.
Например, если я реализую шаблон TryXYZ, где у Вас есть метод XYZ, который выдает исключение при отказе и методе TryXYZ, который возвращает булевскую переменную, TryXYZ будет использовать параметр.
Если результаты будут ориентированы на последовательность (т.е. возвратите 3 клиентов, которые должны быть обработаны), затем, то я буду обычно возвращать некоторый набор.
Кроме этого я обычно просто использую пользовательский класс.
Другое решение состоит в том, чтобы возвратить словарь ссылок именованного объекта. Мне это довольно эквивалентно использованию пользовательского класса возврата, но без помехи. (И использование RTTI и отражение это столь же безопасно с точки зрения типов как любое другое решение, хотя динамично так.)
Возвратите пользовательский тип, но не используйте класс, используйте структуру - никакое выделение памяти / сборка "мусора" наверху не означает оборотных сторон.
Некоторые люди использование KeyValuePair
для двух значений. Это не является большим хотя, потому что это просто маркирует эти две вещи как Key
и Value
. Не очень описательный. Также это серьезно извлекло бы выгоду из добавления этого:
public static class KeyValuePair
{
public static KeyValuePair<K, V> Make(K k, V v)
{
return new KeyValuePair<K, V>(k, v);
}
}
Сохраняет Вас от необходимости указать типы, когда Вы создаете тот. Общие методы могут вывести типы, универсальные конструкторы класса не могут.
Если Вы желаете передать обновление обратно, запускаются и время окончания, который предлагает возможный класс или структуру, возможно, названную DataRefreshResults. Если Ваше возможное третье значение также связано с обновлением, то оно могло быть добавлено. Помните, структура всегда передается значением, таким образом, это выделяется на "куче", не должен быть собран "мусор".
Для Вашего сценария можно хотеть определить универсальный Диапазон {T} класс (с проверками на законность диапазона).
Если метод закрыт, то я обычно использую кортежи из своей библиотеки помощника. Открытые или защищенные методы обычно всегда заслуживают отдельный.
Я думаю наиболее распространенный способ, который сделал бы программист C#, это должно будет перенести объекты, которые Вы хотите возвратить в отдельном классе. Это предоставило бы Вам продвижение наибольшей гибкости, по моему скромному мнению.
Я использую, если это - только 1 или 2 дополнительных переменные (например, функция возвращает bool, который является фактическим важным результатом, но также и длинным как параметр для возврата, сколько времени функция работала для входа целей).
Для чего-либо более сложного я обычно создаю пользовательскую структуру/класс.
Лично, я ненавижу/касательно параметрические усилители, таким образом, я не использовал бы тот подход. Кроме того, большую часть времени, если необходимо возвратить больше чем один результат, Вы, вероятно, делаете что-то не так.
Если это действительно будет неизбежно, то Вы, вероятно, будете самыми счастливыми в конечном счете запись пользовательского класса. Возврат массива заманчив, поскольку это легко и эффективно при коротком teerm, но использование класса дает Вам опцию изменения типа возврата в будущем, не имея необходимость волноваться к очень о порождении проблем вниз поток. Вообразите потенциал для кошмара отладки, если кто-то подкачивает порядок двух элементов в массиве, который возвращается....
Кодируйте Architeture мудрый, я всегда шел бы с Пользовательским Классом при необходимости несколько в определенной сумме замененных переменных. Почему? Просто, потому что Класс является на самом деле "проектом" часто используемого типа данных, создавая Ваш собственный тип данных, который это в этом случае, поможет Вам получающий хорошую структуру и помогающий программе других для Вашего интерфейса.
Это полностью зависит от того, каковы результаты. Если бы они связаны друг с другом, я обычно создавал бы пользовательский класс.
Если бы они действительно не связаны, я или использовал бы параметр или разделил бы метод. Если метод хочет возвратить три несвязанных объекта, он, вероятно, делает слишком много. Исключение к этому - когда Вы говорите через границу веб-сервиса или что-то еще, где "более чистый" API может быть слишком болтливым.
Это зависит. Для внутреннего только API, я буду обычно выбирать самую легкую опцию. Обычно это отсутствует.
Для общедоступного API пользовательский класс обычно имеет больше смысла - но если это будет что-то довольно примитивное, или естественным результатом функции является булевская переменная (как *.TryParse), то я буду придерживаться с параметрический усилитель. Можно сделать пользовательский класс с неявным броском к bool также, но это обычно просто странно.
Для Вашей конкретной ситуации простой неизменный класс DateRange кажется наиболее соответствующим мне. Можно легко добавить что новое значение, не тревожа существующих пользователей.