Должны ли индексаторы всегда ссылаться на дискретную последовательность? - PullRequest
1 голос
/ 11 ноября 2011

Должны ли индексаторы всегда ссылаться на дискретную последовательность?У меня возникает соблазн думать «нет», но я хотел бы спросить, что думают другие.

Вопрос возник после того, как в классе полиномов был сделан «ярлык».

Polynomial p = new Polynomial(coefficients);

Нормальный способдля вычисления y = p (5.2) использовался следующий вызов метода:

double y = p.Evaluate(5.2);

Созданное сочетание клавиш (с использованием индексатора типа double) было:

double y = p[5.2];

Iдумаю, идея заключалась в том, что полином (непрерывная функция) рассматривается как своего рода аналоговый массив или непрерывный массив, если это имеет смысл.Однако функция Evaluate происходит из интерфейса IMathFunction.Этот интерфейс также используется в классе интерполяции:

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)

Здесь есть проблема, поскольку классы интерполятора уже имеют открытый индексатор типа int для доступа к своему массиву точек, используемых для интерполяции.Интерполятор может действовать как непрерывная функция (в своих пределах), но если ярлык распространяется на все классы IMathFunction, то f [5.0] и f [5] возвращают разные объекты и могут сбивать с толку при чтении кода.

double y;
Point<double> p;

// ... some other code

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)
y = f[5.0];
p = f[5];

Должен ли я беспокоиться об использовании индексатора типа double или для этого их следует использовать?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

В соответствии с рекомендациями Microsoft по индексированным свойствам , "индексированные свойства обеспечивают доступ к группам элементов в виде массива". Таким образом, цель состоит в том, чтобы индексаторы исходили из дискретного набора. Кроме того:

Избегайте индексаторов с типами параметров, отличными от System.Int32, System.Int64, System.String, System.Object, перечислений или универсальных параметры типа.

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

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

Обратите внимание, что делегаты являются частным случаем этого, когда метод Invoke рассматривается как метод по умолчанию. Это позволяет вам писать myDelegate(arg1) вместо myDelegate.Invoke(arg1). Это частный случай, хотя. Методы по умолчанию недоступны в C # или VB.

Может быть, лучше думать об индексаторах как о подписках. В конце концов, в математике такие элементы коллекции, как вектор или последовательность, обычно представлены именем коллекции с нижним индексом. Только очень редко вы видите, что f x представляет значение функции f со значением x.

2 голосов
/ 11 ноября 2011

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

...