Я видел и делал себе множество небольших продуктов, в которых одна и та же часть программного обеспечения разделена на одну исполняемую и несколько DLL, а эти библиотеки DLL - это не только разделяемые библиотеки, созданные кем-то другим, но библиотеки, которые выполняются исключительно для этого программного обеспечения, той же командой разработчиков. (Я не говорю здесь о крупномасштабных продуктах, которым требуется только сотни DLL и широко использовать их вместе с другими продуктами.)
Я понимаю, что разделение кода на несколько частей, каждый из которых компилируется в отдельную DLL, хорош с точки зрения разработчика. Это означает, что:
- Если разработчик меняет один проект, он должен перекомпилировать только этот и зависимые, которые могут быть намного быстрее.
- Проект может быть выполнен одним разработчиком в команде, в то время как другие разработчики просто будут использовать предоставленные интерфейсы, не вступая в код.
- Автоматические обновления программного обеспечения иногда могут быть быстрее, с меньшим воздействием сервера.
Но как насчет конечного пользователя? Разве не так просто доставить часть программного обеспечения, состоящего из одного EXE и нескольких DLL, когда все можно объединить вместе? В конце концов:
- Пользователь может даже не понимать, что это за файлы и почему они заполняют память на своем жестком диске,
- Пользователь может захотеть переместить программу, например, сохранить ее на USB-накопителе. Наличие одного большого исполняемого файла упрощает работу,
- Большинство антивирусных программ проверит каждую DLL. Проверка одного исполняемого файла будет намного быстрее, чем меньший исполняемый файл и десятки библиотек.
- Использование DLL делает некоторые вещи медленнее (например, в .NET Framework должна быть найдена "хорошая" библиотека и проверена, если она подписана),
- Что произойдет, если DLL будет удалена или заменена плохой версией? Поддерживает ли каждая программа это? Или он рухнет, даже не объяснив, что с ним не так?
- Наличие одного большого исполняемого файла имеет некоторые другие преимущества.
Значит, не лучше ли с точки зрения конечных пользователей, для программ малого и среднего размера, предоставить один большой исполняемый файл? Если да, то почему нет инструментов, позволяющих сделать это легко ( например, волшебный инструмент, интегрированный в общие IDE, который компилирует все решение в один исполняемый файл, но не каждый раз, конечно, но по запросу или во время развертывания).
Это похоже на помещая все CSS или все файлы JavaScript в один большой файл для пользователя. Наличие нескольких файлов гораздо умнее для разработчиков и их проще поддерживать, но привязка каждой страницы веб-сайта к двум файлам, а не десяткам, оптимизирует производительность. Точно так же CSS спрайты ужасны для дизайнеров, потому что они требуют гораздо больше работы, но лучше с точки зрения пользователей.