Альберт Эйнштейн сказал: «Все должно быть сделано как можно проще, но не на немного проще».
Ваша жалоба не имеет смысла в случае динамически типизированного языка, поэтому вы должны указать, что это относится к статически типизированным языкам. В этом случае в вашем примере замены неявно используются универсальные шаблоны (классы шаблонов), что означает, что в любое время, когда используется fun
или gun
, новое определение основывается на типе аргумента. Это может привести к появлению десятков дополнительных методов, независимо от намерений программиста. В частности, вы исключаете преимущество проверенной компилятором безопасности типов для ошибки времени выполнения.
Если ваша цель состояла в том, чтобы просто пройти через аргумент без проверки его типа, то правильный тип был бы Object
, а не T
.
Объявления типов предназначены для того, чтобы упростить жизнь программиста, перехватывая ошибки во время компиляции, а не сбой во время выполнения. Если у вас слишком сложное определение типа, вы, вероятно, не понимаете свои данные. В вашем примере я бы предложил добавить fun
и gun
к MyClass
, а не определять их отдельно. Если fun
и gun
не применяются ко всем возможным типам шаблонов, то они должны быть определены в явном подклассе, а не как отдельные функции, которые принимают аргумент шаблонного класса.
Обобщения существуют как способ обернуть поведение вокруг более конкретных объектов. List, Queue, Stack, это отличные причины для Generics, но в конце концов, единственное, что вы должны делать с чистым Generic, - это создавать его экземпляр и вызывать для него методы. Если вы действительно чувствуете необходимость делать больше, чем это с Generic, то вам, вероятно, нужно встроить ваш Generic класс в качестве объекта экземпляра в класс-оболочку, который определяет поведение, которое вам нужно. Это делается по той же причине, по которой вы встраивали примитивы в класс: потому что сами по себе числа и строки не передают семантической информации об их содержимом.
* * Пример тысяча двадцать-один: * * 1 022
Какую семантическую информацию передает List? Просто вы работаете с несколькими тройками целых чисел. С другой стороны, List, где цвет имеет 3 целых числа (красный, синий, зеленый) с ограниченными значениями (0-255), передает намерение, что вы работаете с несколькими цветами, но не дает подсказки относительно того, является ли список заказал, позволяет дубликаты или любую другую информацию о цветах. Наконец, Палитра может добавить эту семантику для вас: палитра имеет имя, содержит несколько цветов, но не имеет дубликатов, и порядок не важен.
Это немного отошло от первоначального вопроса, но для меня это означает, что DRY (не повторяйте себя) означает указание информации один раз, но эта спецификация должна быть настолько точной, насколько это необходимо.