2014-01-18 4 views
10

У меня есть класс. вещь, что этот класс предназначен для представления, таков, что мы можем говорить о таких вещах, которые равны друг другу, и мы также можем разработать схему для ранжирования их для целей сравнения.Должен ли я реализовать IEquatable или IComparable?

Однако, так бывает, что редко бывает, чтобы кто-то чувствует необходимость ранжировать эти вещи, но один часто нужно проверить, если две такие вещи равны.

Итак, я могу реализовать как IEquatable для своего класса, так и IComparable. В то время как IComparable предоставляет некоторые дополнительные функции, маловероятно, что кто-то будет заботиться об этой дополнительной функциональности. Ни один из них, по-видимому, не дает явного преимущества, логически или функционально.

Какой интерфейс следует использовать, IEquatable, IComparable или оба? Зачем? (Я просто задаюсь вопросом об изменениях в рамках каркаса либо интерфейса)

This question похоже, но ответы только указывают на очевидное, что мне не помогает.

В случае, если вам интересно, класс предназначен для обозначения нуклеотида. Нуклеотиды можно легко отождествлять, но их также можно сравнить (например, в алфавитном порядке).

+0

Есть ли вероятность, что вам нужно будет их отсортировать? Я знаю, что вы сказали, что это маловероятно, но если вы должны дать класс кому-то другому, можете ли вы подумать о причине, которую они когда-либо должны были бы отсортировать? – JNYRanger

+0

Я уверен, что можно придумать надуманный сценарий, в котором, возможно, потребуется сортировать их по алфавиту (для получения удобочитаемого вывода с хорошим форматированием) или, возможно, сортировать их по некоторым биохимическим свойствам (например, массе). Но это было бы надуманно, и если бы я должен был реализовать «IComparable», мне пришлось бы писать документацию (без этого метод был бы бесполезен) для методов, которые очень редко использовались. – Superbest

ответ

8

Я бы обязательно реализовал IEquatable<T>, но пропустил IComparable/IComparable<T> пока.

Как вы сказали, нет никакого способа сравнить нуклеотиды. Кому-то может потребоваться сравнить их в алфавитном порядке, кому-то может понадобиться другой способ их сортировки. Я предпочел бы предоставить различные реализации IComparer<Nucleotide> для реализации IComparable/IComparable<T>.

+1

Нет универсального 'IEquatable', как если бы он был просто совпадающим с' Equals() 'переопределить все объекты. Тем не менее, всегда необходимо переопределять 'Equals()' и 'GetHashCode()' соответственно, когда вы реализуете 'IEquatable ', поэтому ваша точка сохраняется. –

+0

@JonHanna Ты прав. Я исправил свой ответ. Благодаря! – MarcinJuraszek

1

Вы должны реализовать интерфейс, который дает вам то, что вам нужно сейчас. Если позже вы обнаружите, что IComparable - это то, что вам нужно, тогда реализуйте его.

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

+0

Более подробно, 'IComparable', прежде чем станет понятно, как это необходимо, это анти-будущая проверка, потому что, если более позднее требование для данного средства сравнения не соответствует ему, было бы нарушением изменений для изменения текущей реализации , –

2

Это прежде всего мнение, но я бы не реализовал IComparable, если сопоставимость не очевидна (как в номере). Например, если кто-то хочет сортировать нуклеотиды, он может обеспечить свою собственную реализацию IComparer. В качестве автора библиотеки я бы предоставил набор возможных IComparer s, например, чтобы отсортировать их по алфавиту, как вы сказали.

2

Если объекты по своей сути сопоставимы, я бы сделал дополнительную работу и осуществил IComparable<T> поверх IEquatable<T>. Как автор этого типа вы находитесь в лучшем положении для обеспечения правильной реализации. Оставляя его другому разработчику для реализации, появляется вероятность того, что произойдет следующее:

  • Иммиграция осуществляется неправильно. Другие разработчики, скорее всего, будут менее знакомы с данными, чем вы, и, следовательно, с большей вероятностью пропустят угловые случаи.
  • Повторяющееся кадо.Если вы не предоставите сравнение defacto, каждый разработчик отдельно должен сделать это сам, что приведет к дублированию кода
+0

Если другие разработчики каждый реализуют свое собственное сравнение, то общение в этой организации довольно плохое: -/ –

+0

@MattGreer, чья работа в одной компании? Возможно, этот код становится все более широко используемым, и у вас есть разработчики из разных компаний, использующих его. – JaredPar

+0

@MattGreer. Конечно, в моем конкретном случае другие разработчики (если они есть) «меня в далеком будущем». – Superbest

Смежные вопросы