Обязательных сеттеров быть не должно по многим причинам, но конкретно в вашем случае, по сути, вы делаете объявление еще больше громоздким и многострочным. Вместо условного:
// псевдокод
obj = new ObjClass(a, b, c, d, ...)
.. объект готов
вы получаете:
// псевдокод
obj = new ObjClass(a, b, ...)
obj->SetC(c)
obj->SetD(d, ...)
.. и только теперь объект готов
Очевидно, что второй вариант и длиннее, и более подвержен ошибкам (легко забыть какой-то из сеттеров, или перепутать порядок сеттеров).
Конструктор должен быть достаточным для создания адекватно-работающего экземпляра класса (обычно, пустой объект указанного класса, тоже считается валидным). Иногда, действительно, требуется много параметров (обычно, правда, это считается признаком неудачной архитектуры). Если для создания объекта нужно столько много параметров и они так же вместе используются где-то еще - имеет смысл объединить их, например, в структуру (или в отдельный класс/объект).