Рекомендации по разработке метода расширения: должно ли одинаковое имя метода быть одинаковым для подкласса и суперкласса? - PullRequest
5 голосов
/ 04 июля 2011

Я только что закончил читать раздел, посвященный элементам расширения в Руководстве по проектированию инфраструктуры, 2-е издание, написанное Кшиштофом Квалиной и Брэдом Абрамсом, и не нашел примера для этого.Мой вопрос касается суперкласса и подкласса в библиотеке F #, но я ожидаю, что ответ относится ко всем языкам .NET.

F # имеет два типа: супертип Expr и подтип Expr<'a>где последний является просто оберткой для типизированной версии первого.Эти типы используются для выражений в кавычках.

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

  1. Делать как F # PowerPackвыполняет и определяет методы с разными именами EvalUntyped() : Expr -> obj в Expr и Eval() : Expr<'a> -> 'a в Expr<'a>.
  2. Сделайте что-то ближе к тому, что вы сделали бы, если бы вы владели типами и использовали одно и то же имя (гдеметод для супертипа можно рассматривать как виртуальный, а метод для подтипа можно рассматривать как переопределение супер-виртуального метода).то есть Eval() : Expr -> obj на Expr и Eval() : Expr<'a> -> 'a на Expr<'a>.

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

1 Ответ

1 голос
/ 30 июля 2011

Не может быть однозначного ответа на этот вопрос.Однако, если вы действительно не верите, что F # PowerPack действительно ошибся в дизайне, я бы следовал их стилю по двум причинам:

  1. Чтобы стиль соответствовал тому, с чем другие разработчики уже работают в F #и официальные расширения.
  2. Чтобы более явно показать разницу в типах возвращаемых данных двух методов, поскольку это имеет значение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...