Синтаксис C# - Ваша предпочтительная практика для получения 2 или 3 ответов из метода

Я думаю, что вы хотите, это

  1. Градиент значений оттенков
  2. Преобразование из HSL (оттенок, насыщенность, яркость) в RGB
  3. RGB в Обозначение #hex, которое вы уже рассмотрели

Градиент оттенков - это простая задача линейной интерполяции:

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);

8
задан BuddyJoe 3 December 2008 в 17:10
поделиться

16 ответов

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

То, что это означает, - то, что Ваша сигнатура метода останется тем же, даже если внутреннее представление объекта Вы раздадите изменения для размещения большего количества данных. Это - также хорошая практика по причинам инкапсуляции и удобочитаемости.

5
ответ дан 5 December 2019 в 04:32
поделиться

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

0
ответ дан 5 December 2019 в 04:32
поделиться

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

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

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

Например, если я реализую шаблон TryXYZ, где у Вас есть метод XYZ, который выдает исключение при отказе и методе TryXYZ, который возвращает булевскую переменную, TryXYZ будет использовать параметр.

Если результаты будут ориентированы на последовательность (т.е. возвратите 3 клиентов, которые должны быть обработаны), затем, то я буду обычно возвращать некоторый набор.

Кроме этого я обычно просто использую пользовательский класс.

0
ответ дан 5 December 2019 в 04:32
поделиться

Другое решение состоит в том, чтобы возвратить словарь ссылок именованного объекта. Мне это довольно эквивалентно использованию пользовательского класса возврата, но без помехи. (И использование RTTI и отражение это столь же безопасно с точки зрения типов как любое другое решение, хотя динамично так.)

0
ответ дан 5 December 2019 в 04:32
поделиться

Если 2, пара.

Если больше чем 2 класс.

0
ответ дан 5 December 2019 в 04:32
поделиться

Возвратите пользовательский тип, но не используйте класс, используйте структуру - никакое выделение памяти / сборка "мусора" наверху не означает оборотных сторон.

1
ответ дан 5 December 2019 в 04:32
поделиться

Некоторые люди использование KeyValuePair для двух значений. Это не является большим хотя, потому что это просто маркирует эти две вещи как Key и Value. Не очень описательный. Также это серьезно извлекло бы выгоду из добавления этого:

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

Сохраняет Вас от необходимости указать типы, когда Вы создаете тот. Общие методы могут вывести типы, универсальные конструкторы класса не могут.

1
ответ дан 5 December 2019 в 04:32
поделиться

Если Вы желаете передать обновление обратно, запускаются и время окончания, который предлагает возможный класс или структуру, возможно, названную DataRefreshResults. Если Ваше возможное третье значение также связано с обновлением, то оно могло быть добавлено. Помните, структура всегда передается значением, таким образом, это выделяется на "куче", не должен быть собран "мусор".

1
ответ дан 5 December 2019 в 04:32
поделиться

Для Вашего сценария можно хотеть определить универсальный Диапазон {T} класс (с проверками на законность диапазона).

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

1
ответ дан 5 December 2019 в 04:32
поделиться

Я думаю наиболее распространенный способ, который сделал бы программист C#, это должно будет перенести объекты, которые Вы хотите возвратить в отдельном классе. Это предоставило бы Вам продвижение наибольшей гибкости, по моему скромному мнению.

1
ответ дан 5 December 2019 в 04:32
поделиться

Я использую, если это - только 1 или 2 дополнительных переменные (например, функция возвращает bool, который является фактическим важным результатом, но также и длинным как параметр для возврата, сколько времени функция работала для входа целей).

Для чего-либо более сложного я обычно создаю пользовательскую структуру/класс.

1
ответ дан 5 December 2019 в 04:32
поделиться

Лично, я ненавижу/касательно параметрические усилители, таким образом, я не использовал бы тот подход. Кроме того, большую часть времени, если необходимо возвратить больше чем один результат, Вы, вероятно, делаете что-то не так.

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

2
ответ дан 5 December 2019 в 04:32
поделиться

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

2
ответ дан 5 December 2019 в 04:32
поделиться

Для два, обычно 4)

Больше, чем это, 2)

10
ответ дан 5 December 2019 в 04:32
поделиться

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

Если бы они действительно не связаны, я или использовал бы параметр или разделил бы метод. Если метод хочет возвратить три несвязанных объекта, он, вероятно, делает слишком много. Исключение к этому - когда Вы говорите через границу веб-сервиса или что-то еще, где "более чистый" API может быть слишком болтливым.

28
ответ дан 5 December 2019 в 04:32
поделиться

Это зависит. Для внутреннего только API, я буду обычно выбирать самую легкую опцию. Обычно это отсутствует.

Для общедоступного API пользовательский класс обычно имеет больше смысла - но если это будет что-то довольно примитивное, или естественным результатом функции является булевская переменная (как *.TryParse), то я буду придерживаться с параметрический усилитель. Можно сделать пользовательский класс с неявным броском к bool также, но это обычно просто странно.

Для Вашей конкретной ситуации простой неизменный класс DateRange кажется наиболее соответствующим мне. Можно легко добавить что новое значение, не тревожа существующих пользователей.

1
ответ дан 5 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: