Должны ли методы расширения иметь префикс?


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

В Objective-C (с их версией, категориями) этой проблемы можно избежать, добавив префикс перед каждым методом. Я знаю, что мы можем определить методы расширения в пространствах имен, так что мы можем контролировать, импортируются они или нет, но это только решает проблему столкновений между методами расширения, а не столкновений между методом расширения и базовым классом.

Обновление:

Никто на самом деле не упоминал об этом, но методы расширения не являются виртуальными. Это означает, что если вы можете i. myExtension () на интерфейсе i, то он всегда будет вызывать метод классов интерфейса, поэтому метод подкласса (который мог бы имеют разные намерения) не будет называться. Таким образом, в целом, использование методов расширения вполне безопасно.

4   6  

4 ответа:

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

Я рекомендую вместо этого быть осторожным, чтобы не создавать большое количество методов расширения и использовать имена методов, которые имеют смысл. Таким образом, в случае конфликта более вероятно, что, например, метод extension Where и метод Conflict Where будут иметь сходную семантику.

Общее соглашение состоит в том, чтобы иметь их в своем собственном отдельном пространстве имен (обычно в форме <something>.Extensions), которое вы можете затем использовать, чтобы решить, используете ли вы их в любом конкретном фрагменте кода, который содержит типы, на которых обычно работают расширения.

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

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

Нет, вы не должны префиксировать имена методов расширения в C#, так как они только запутывают ваш код и затрудняют его обслуживание.

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

  1. базовый класс реализовал ту же функциональность, которую вы добавляли сами с помощью метода расширения. Вам больше не нужен метод расширения. Удалите его и используйте вместо него метод базового класса.
  2. Базовый класс реализовал нечто отличное от того, что вы хотели, но дал ему то же самое имя. Либо вы, либо они используют неправильное имя. Наверное, ты. Переименуйте свой метод расширения в нечто, описывающее, что на самом деле делает функция.

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

  • маловероятно, что ваша сигнатура метода будет дублироваться в большинстве случаев.
  • Если это так, то он всегда должен быть обнаружен в модульных тестах.
  • должно быть тривиально исправить.

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