В довольно большом проекте есть исходный файл с несколькими функциями, которые чрезвычайно чувствительны к производительности (вызывается миллионы раз в секунду). Фактически, предыдущий сопровождающий решил написать 12 копий функции, каждая из которых отличается незначительно, чтобы сэкономить время, затрачиваемое на проверку условий в одной функции.
К сожалению, это означает, что код является PITA для поддержки. Я хотел бы удалить весь дублирующий код и написать только один шаблон. Однако язык Java не поддерживает шаблоны, и я не уверен, что дженерики подходят для этого.
Мой текущий план состоит в том, чтобы написать вместо этого файл, который генерирует 12 копий функции (практически одноразовый расширитель шаблона). Я, конечно, дал бы обильное объяснение того, почему файл должен быть создан программно.
Меня беспокоит то, что это может привести к путанице у будущих сопровождающих и, возможно, к появлению неприятных ошибок, если они забудут восстановить файл после его изменения, или (что еще хуже), если они изменят вместо этого сгенерированный программным путем файл. К сожалению, если не считать переписывания всего этого в C ++, я не вижу способа это исправить.
Преимущества этого подхода перевешивают недостатки? Должен ли я вместо этого:
- Возьмите удар производительности и используйте одну, обслуживаемую функцию.
- Добавьте объяснения, почему функция должна дублироваться 12 раз, и любезно возьмите на себя бремя обслуживания.
- Попытайтесь использовать дженерики в качестве шаблонов (они, вероятно, не работают таким образом).
- Кричите на старого сопровождающего за то, что он делает код зависимым от производительности для одной функции.
- Другой метод для поддержания производительности и ремонтопригодности?
PS Из-за плохого дизайна проекта, профилирование функции довольно сложно ... однако, бывший сопровождающий убедил меня, что снижение производительности недопустимо. Я предполагаю, что под этим он подразумевает более 5%, хотя это полное предположение с моей стороны.
Возможно, я должен немного прояснить. 12 копий выполняют очень похожую задачу, но имеют незначительные различия. Различия находятся в разных местах всей функции, поэтому, к сожалению, существует множество условных выражений. В действительности существует 6 «режимов» работы и 2 «парадигмы» работы (слова, придуманные мной). Чтобы использовать функцию, нужно указать «режим» и «парадигму» работы. Это никогда не динамично; каждый кусок кода использует ровно один режим и парадигму. Все 12 пар мод-парадигма используются где-то в приложении. Функции точно названы от func1 до func12, причем четные числа представляют вторую парадигму, а нечетные числа представляют первую парадигму.
Я знаю, что это худший дизайн, если целью является ремонтопригодность. Но он кажется "достаточно быстрым", и этот код некоторое время не нуждался в каких-либо изменениях ... Стоит также отметить, что исходная функция не была удалена (хотя, насколько я могу судить, это мертвый код) поэтому рефакторинг будет простым.
Makefile
» (или любой другой системы, которую вы используете) и удалите его сразу после завершения компиляции . Таким образом, у них просто нет возможности изменить неправильный исходный файл.