Повторное использование кода довольно хорошая идея. Не большой один .
У меня есть перспектива, извлеченная из 30-летнего опыта разработки программного обеспечения, пытающегося «повторно использовать».
Я начал исследовать «повторное использование кода» в качестве темы исследования еще в 80-х годах, когда обнаружил, что повторно использовал дизайн одной ОС, созданной в начале 70-х годов, для другой ОС, которую я создал в конце 70-х годов.
Хорошей частью повторного использования кода является возможность иногда повторно использовать честный ранее существовавший код. Но мир полон кода; как найти то что хочешь? Вот что я называю проклятием повторного использования :
Я Санта-Клаус (хорошо с открытым исходным кодом), и у меня есть пакет из 1 миллиарда программных компонентов. Вы можете иметь любой из них.
Удачи в выборе.
Чтобы решить проблему повторного использования хорошо:
- пользователь должен каким-то образом указать, что ему нужно (функциональность, производительность, целевой язык, предположения среды, ...)
- должна быть библиотека «многоразового» кода, которая была проиндексирована различными способами по этим потенциальным критериям
- должен существовать какой-то механизм, чтобы выбирать элементы-кандидаты (из миллиарда элементов вы не можете рассматривать их все лично)
- должен быть способ охарактеризовать, насколько далеко от спецификации выбраны кандидаты
- должен существовать некоторый регулярный процесс, позволяющий пользователю изменять измененный код, который можно использовать повторно (вот самый большой вклад ООП: вы можете редактировать существующий компонент / объект, переопределяя его слоты. ООП не предоставляет никакой другой помощи).
- все это должно быть явно дешевле, чем просто перекодировать
Главным образом то, что было обнаружено за эти годы, заключается в том, что для того, чтобы код можно было многократно использовать, он должен быть спроектирован для этой цели или содержит слишком много неявных допущений. Самые успешные библиотеки повторного использования кода были довольно маленькими. Возможно, библиотеки и фреймворки представляют собой «повторно используемый» код, и они чрезвычайно успешны; Java и C # достигают успеха не потому, что они являются довольно хорошими компьютерными языками, а потому, что они имеют огромные хорошо разработанные, реализованные и документированные доступные библиотеки. Но люди не смотрят на исходный код в библиотеках; они просто вызывают хорошо документированный API (предназначенный для общего пользования).
То, что повторное использование кода еще не сделало (и ООП), - это улучшение порядка наших возможностей для систем кодирования.
Я думаю, что ключевым недостатком является то, что любое повторное использование кода принципиально ограничено, потому что в коде слишком много встроенных допущений . Если вы делаете код крошечным, вы сводите к минимуму допущения, но тогда затраты на сборку с нуля не очень велики, а выгоды от повторного использования неэффективны. Если вы сделаете куски кода огромными, они в значительной степени бесполезны в новом контексте. Как и Гулливер, они привязаны к пляжу миллионами крошечных ниточек, и вы просто не можете позволить себе разрезать их все.
То, над чем мы должны работать, это повторное использование знаний для создания кода . Если мы сможем сделать это, то сможем применить эти знания для создания необходимого кода, обрабатывая текущий набор предположений.
Чтобы сделать это, все еще нужна та же спецификационная возможность для характеристики программных компонентов (вы все равно должны сказать, что хотите!). Но затем вы применяете эти «конструкторские» знания к спецификациям, чтобы сгенерировать нужный код.
Как сообщество, мы еще не очень хороши в этом. Но люди делают это все время; почему мы не можем автоматизировать это? Есть много исследований, и это показывает, что это может быть сделано при многих обстоятельствах.
Одним из ключевых механизмов, необходимых для этого, являются механические инструменты для принятия «описаний компонентов» (это просто формальные документы и могут быть проанализированы как языки программирования) и применения к ним программных преобразований .
Компиляторы уже делают это: -} И они действительно хороши в классе задач, которые они решают.
Модели UML с генерацией кода являются одной из попыток сделать это. Не очень хорошая попытка; почти все, что говорят в большинстве моделей UML: «У меня есть данные, которые выглядят так». Довольно сложно создать настоящую программу, если ее функциональность не учитывается.
Я пытаюсь создать практические системы преобразования программ, инструмент под названием DMS . Очень хорошо отвлекся, применяя программные преобразования не столько к абстрактным спецификациям для генерации кода, сколько к устаревшему коду для его очистки. (Это та же проблема в резюме!). (На создание таких инструментов уходит много времени; я занимаюсь этим уже 15 лет, а пока вы должны есть).
Но у DMS есть два ключевых свойства, которые я описал выше: способность обрабатывать произвольные формальные спецификации и способность собирать «знания о генерации кода» в виде преобразований и применять их по требованию. И что примечательно, в некоторых особых случаях мы генерируем довольно интересный код из спецификаций; DMS в значительной степени построен с использованием самого себя для генерации своей реализации. Это дало нам, по крайней мере, некоторые возможности многократного использования (знаний): чрезвычайно значительное повышение производительности. У меня есть команда из около 7 технических специалистов; мы написали, вероятно, 1-2 MSLOC «спецификаций» для DMS, но у нас есть 10MSLOC сгенерированного кода.
Резюме: повторное использование знаний поколения - это победа, а не повторное использование кода .