Дублирование исходного кода — это одна из причин, которые значительно усложняют поддержку и развитие крупных программных продуктов. Программная система, способная использовать различные алгоритмы поиска дубликатов и поддерживать множество языков программирования, позволила бы максимально эффективно устранять дублирование кода.
Цель данной работы — проектирование унифицированной многослойной архитектуры приложения для поиска программных клонов.
Архитектура [1] — это фундаментальная организация системы, реализованная в ее компонентах, связях этих компонентов друг с другом и внешней средой и принципах, определяющих структуру и развитие системы.
Многослойная архитектура обеспечивает группировку связанной функциональности приложения в разных слоях, выстраиваемых вертикально, поверх друг друга (рис. 1).

Функциональность каждого слоя объединена общей ролью или ответственностью. Слои слабо связаны, и между ними осуществляется явный обмен данными.
Сквозная функциональность охватывает все слои приложения и включает в себя такие важные блоки, как: журнализация, конфигурирование и связь.
Система журнализации призвана упростить диагностику и локализацию ошибок в случае их возникновения, а также может использоваться как система аудита действий пользователя.
Конфигурирование включает в себя не только манипуляцию параметрами приложения, но и их хранение, и удобный доступ к ним из любой точки приложения.
Для реализации обмена информацией между объектами, поддержки их в актуальном состоянии и уведомления пользователя о происходящих в системе процессах целесообразно использовать паттерн «Наблюдатель».
За поддержку многоязычности отвечает набор компонентов, реализующих интерфейс ICloneExtension. Основная задача этих компонентов — предоставить всю необходимую информацию для обработки исходного кода, написанного на соответствующем языке программирования.
Слой доступа к данным отвечает за загрузку, подготовку исходного кода к поиску клонов и его представление в удобном виде. Именно этот слой выполняет предварительную обработку кода, реализуемую посредством семейства классов, унаследованных от CBaseCodePreProcessingStrategy.
Для представления единицы кода служит класс CBaseSourceRow и его наследники. Объектами этого типа оперируют алгоритмы, определяющие похожие единицы кода.
Работа с фрагментами кода реализована через класс CCodeFragment. При этом фрагмент кода может начинаться с произвольной позиции в строке и также заканчиваться.
За представление файла с исходным кодом отвечает класс CSourceFile.
Слой логики включает в себя весь функционал по поиску схожих единиц кода, извлечению дублирующихся фрагментов и сохранению полученной информации в удобном для дальнейшего использования виде. Взаимодействие этого слоя с вышележащими слоями целесообразно реализовать посредством паттерна «Фасад».
За поиск схожих строк отвечает семейство классов, унаследованных от CBaseCloneSearchStrategy. Сохранение результатов осуществляется в наследнике CBaseClonedRowsMatrix; а для извлечения дублирующихся фрагментов кода служит класс CBaseCloneExtractor и его потомки.
В общем случае для каждого алгоритма поиска клонов должен быть реализован свой наследник вышеперечисленных классов.
Слой сервисов призван обеспечить единообразный доступ к функциональности приложения в интерфейсном и безынтерфейсном режимах.
Слой представления визуализирует выходную информацию, делая процесс поиска клонов более понятным и прозрачным пользователю.
Описанная выше архитектура приложения инкапсулирует особенности поведения в конкретных слоях и объектах, позволяя тем самым построить гибкую и масштабируемую систему.