Поиск

Правила разработки

Индексаторы — пример того, как добавленная к языку командой разработчиков небольшая, но мощная функция помогает повысить производительность наших усилий по разработке. Однако, как и у любой функции любого языка, у индексаторов своя область применения. Их нужно использовать только там, где понятно, что с данным объектом можно обращаться, как с массивом. Рассмотрим приложение по подготовке счетов. В нем, конечно, нужен класс Invoice, определяющий член-массив объектов InvoiceDetail. В таком случае пользователю будет совершенно понятно применение следующего синтаксиса при обращении к подробностям счетов:

InvoiceDetail detail = invoice[2]; // Возвращает 3-ю строку
// с подробностями счета.

Однако этого не скажешь о попытке превращения всех членов InvoiceDetail в массив, доступ к которому будет осуществляться через индексатор. Как видите, первая строка гораздо понятнее, чем вторая:

TermCode terms = invoice.Terms; // Аксессор свойства для члена Terms. TermCode terms = invoice[3]; // Тут есть над чем задуматься.

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