Я думаю, что это еще один из тех примеров, когда ни один, догматический ответ не будет разумно охватывать все случаи. Я бы всегда смотрел на отдельный случай и принимал решение на основе всех доступных факторов.
Одним из факторов является то, что первый имеет много ifs.В вашем коде также есть ошибка: вы добавляете значение null
в список цветов;чтобы исправить эту ошибку, вам нужно еще больше ifs.Такой конструктор может легко запутаться.Множество ifs указывает на то, что есть несколько случаев, в которых логика существенно отличается, поэтому наличие отдельных конструкторов для каждого из этих случаев имеет смысл.
Однако в случаях, когда не так много ifsлогика одинакова для всех, поэтому теперь имеет смысл вызывать один конструктор, который выполняет эту логику и делает это хорошо.Тогда есть только одно место для его обслуживания.
Другой фактор заключается в том, что в вашем примере первый оставляет weight
неинициализированным. Это не должно быть плохо , потому что, к счастью, инициализация по умолчанию в C # предсказуема;но я бы счел это плохим тоном, если бы объявление поля для weight
инициализировало его чем-то ненулевым, и только некоторые конструкторы перезаписывают это значение по умолчанию другим значением.Параметры конструктора и / или вызов this(...)
лучше подходят для документирования значения по умолчанию для этого поля.(Предпочтительно параметры конструктора, потому что тогда даже клиентский программист может видеть значение по умолчанию , но очевидно, что для этого требуется C # 4.) Конечно, также возможно инициализировать все поляиспользуя инициализатор поля и оставьте конструктор (и) пустым, что является разумной стратегией, если у вас есть только один конструктор без аргументов.
Так что, как вы сказали, вы не хотите, чтобы тела методов получалислишком долго, но вы также не хотите, чтобы код становился слишком сложным для навигации, поэтому вам нужно найти баланс между ними для любой конкретной ситуации.