У меня есть некоторый код, который почти идентичен, но использует абсолютно разные типы, без наследования между ними, в основной переменной. В частности, я пишу анализатор с Roslyn для C # и VB.NET следующих типов:
Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax
Мне интересно, если из-за того, что код выполняет одно и то же, я должен сохранить его как можно более СУХИМЫМ, разделив как можно меньше на отдельные (но идентичные, отличные от типа) методы, или полностью разделив его, потому что эти два метода не связанные и будущие изменения могут заставить одну версию изменить, но не другую (хотя это маловероятно)?
Изменить: Примерно через год я столкнулся с той же проблемой, и команда Roslyn помогла мне решить ее: написать базовый класс, который принимает дженерики и имеет TAttributeSyntax
параметр, который выполняет большую часть работы. Затем напишите производные классы с минимальным объемом данных, которые требуют определенного типа.
Ответы:
Вы не делаете СУХОЙ, потому что кто-то написал это в книге где-то, что это хорошо делать, вы делаете СУХОЙ, потому что это на самом деле имеет ощутимые преимущества.
Именно из этого вопроса:
Так что, в принципе, не думайте: «О, чувак, этот код очень похож, может быть, я должен рефакторинг, чтобы не повторяться». Подумайте: «Разве рефакторинг, чтобы заставить эту кодовую базу повторно использовать общие элементы, делает код более понятным или менее обслуживаемым ?» Затем выберите тот, который делает его более ремонтопригодным.
При этом, учитывая SRP и просто пытаясь иметь небольшие гибкие классы в целом, может иметь смысл проанализировать ваш код по этой причине , разбить на части фрагменты поведения, которые используют универсальные типы (вы сказали, что они идентичны, кроме типа), в маленькие классы. Затем вы обнаружите, что некоторые из этих классов на самом деле полностью идентичны (а не просто идентичны), и затем вы можете создать инструментарий на случай, если захотите добавить
Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax
.источник