Фон:
Художественный учитель однажды дал мне проблему проектирования нарисовать тигра с помощью только 3 строк. Так как идея - это, я изучаю тигра и изучаю эти 3 строки для рисования, чтобы люди все еще были в состоянии сказать, что это - тигр.
Решение для этой проблемы состоит в том, чтобы запуститься с полного рисунка тигра и удалить элементы, пока Вы не добираетесь до трех частей, которые являются самыми распознаваемыми как тигр.
Я люблю эту проблему, поскольку она может быть применена в нескольких дисциплинах как разработка программного обеспечения, особенно в удалении сложности.
На работе я имею дело с поддержанием большой программной системы, которая была взломана до смерти и является на грани становления неудобным в сопровождении. Именно мое задание для удаления обременительной сложности было вызвано прошлыми разработчиками.
Вопрос:
Существует ли процесс набора для удаления сложности в программных системах - своего рода шаблон процесса сокращения, который будет применен к проблеме?
Посмотрите книгу Refactoring Мартина Фаулера и его http://www.refactoring.com/ веб-сайт.
Чистый код Роберта К. Мартина - еще один хороший ресурс для снижения сложности кода.
К сожалению, аналогия с изображением тигра может не работать. С помощью всего трех строк зритель может представить себе все остальное. В программной системе действительно должны быть все детали. Обычно вы не можете многое убрать, не удалив что-то важное.
Хотя концепция удаления деталей и стимулирует интеллектуальную деятельность, она не очень хорошо подходит (по крайней мере, как есть) для программ. Причина в том, что рисунок переоценивается человеком с его способностью принимать нечеткие входные данные, в результате чего программа переоценивается процессором, который очень плохо «заполняет пробелы». Еще одна более тонкая причина заключается в том, что программы передают пространственно-временное повествование, тогда как рисунок по сути является пространственным.
Следовательно, в программном обеспечении гораздо меньше возможностей для аппроксимации и полного удаления определенных частей кода. Тем не менее, рефакторинг является ключевым словом операций и иногда применим даже для самых неудобных устаревших частей. Однако эта дисциплина отчасти является искусством, а отчасти наукой, и в ней не так много "быстрых трюков", о которых я знаю.
Правка : Однако никто не беспомощен против унаследованного кода. См., Например, отличные ссылки на книги в ответах Алекса Бараноски и Кристофера Джонсона. Эти книги предоставляют множество полезных методов, но в целом я остаюсь твердым в своем утверждении, что рефакторинг нетривиального устаревшего кода - это итеративный процесс, требующий как искусства, так и науки (а также терпения, безжалостности и мягкости ;-)).
Ознакомьтесь с книгой, Эффективная работа с устаревшим кодом
Обсуждаемые темы включают
Эта книга также включает каталог из двадцати четырех методов устранения зависимостей, которые помогут вам работать с элементами программы изолированно и вносить более безопасные изменения.
Прочтите книгу Anti-Patterns , чтобы получить хорошо написанную книгу по всей теме перехода от плохого (или неадаптивного) дизайна к лучшему. Он предоставляет способы восстановления после целого ряда проблем, обычно обнаруживаемых в программных системах. Затем я бы добавил поддержку рекомендации Кристофера Рефакторинг в качестве второго важного шага.
Это наглый вопрос: -)
Во-первых, как мы измеряем «сложность»? Без какой-либо определенной априори метрики может быть трудно оправдать любой проект «сокращения».
Во-вторых, выбор за вами? Если мы можем взять пример, предположим, что в некоторой кодовой базе молоток «наследования» используется для решения любой другой проблемы. Хотя использование наследования идеально подходит для некоторых случаев, оно может быть не для всех. Что вы делаете в таких случаях?
В-третьих, можно ли доказать, что поведение / функциональность программы не изменились из-за рефакторинга? (Это становится более сложным, когда код является частью поставляемого продукта.)
В-четвертых, вы можете начать с более простых вещей, таких как: (а) избегать глобальных переменных, (б) избегать макросов, (в) использовать константные указатели и ссылки на константы, насколько это возможно, (г) используйте методы с квалификацией константы везде, где это логично. Я знаю, что это не методы рефакторинга, но думаю, что они могут помочь вам продвинуться к вашей цели.
Наконец, по моему скромному мнению, я думаю, что любой такой проект рефакторинга - это скорее проблема людей, чем проблема технологий. Все программисты хотят писать хороший код, но восприятие хорошего и плохого очень субъективно и варьируется между членами одной команды. Я бы предложил установить «соглашение о дизайне» для проекта (что-то вроде C ++ Coding Standards ). Если вам это удастся, вы в основном готовы. Оставшаяся часть - это модификация частей кода, которые не соответствуют соглашению о дизайне . (Я знаю, это очень легко сказать, но очень сложно сделать. Добрые пожелания вам.)