Если Вы смотрели Движение Глубокие шоу Channel9 в последнее время, одной очень часто упоминаемой темой является математическая дуальность в программировании. TomasP имеет хорошее сообщение в блоге о дуальности в объектно-ориентированном программировании.
Это было, так как Microsoft Research нашла, что шаблон разработки наблюдателя является на самом деле математическим двойным из шаблона итератора. С тех пор они использовали понятие дуальности различными способами.
Мой вопрос:
Какие математические дуальности находятся там в программировании?
Объектно-ориентированное программирование является хорошим началом. Главные шаблоны разработки GoF: Декоратор, состояние, Итератор, Фасад, Стратегия, Прокси, Метод фабрики, Адаптер, Наблюдатель, Шаблонный Метод, Составной объект, Singleton, Абстрактная Фабрика и Команда. Вот хороший плакат графа объектов.
Я бы сказал, что основная двойственность в программировании - это двойственность кода и данных, которая наиболее четко проявляется в Лиспе, но также очевидна в большинстве современных языков, которые обеспечивают функциональность самоанализа.
Вы можете возразить, что двойственность наблюдателя / итератора является (вроде, работайте со мной здесь :-)) проявлением более общих объектно-ориентированных парадигм наследования и альтернативной парадигмы делегирования и агрегации. В первом случае более специализированные объекты используют базовую функциональность (точка вверх) для наследования общих возможностей, а во втором более общие объекты используют делегирование для доступа к более специализированной функциональности (точка вниз / вниз) - существует много академических дискуссий о том, что oo дизайны могут быть выражены в любой форме, и, поскольку разница между формами (разумно) строгая и определенная, я бы сказал, что ее можно классифицировать как двойную
См. Орландское соглашение 2 для получения дополнительной информации
Я считаю объекты и замыкания / анонимные функции двойственными.
Объект - это набор данных с набором подпрограмм, которые «прикреплены» к нему (то есть его методы).
Замыкание в функциональном программном смысле слова - это (вызываемая) ссылка на функцию с набором прикрепленных данных (в форме связанных свободных переменных).
Не уверен, что это полностью то, что вы искали, поскольку это больше FP, чем OO, но есть, конечно, соответствие Карри-Ховарда (оно же изоморфизм Карри-Ховарда), которое "приравнивает" программы к доказательствам, а типы к формулам.