Что такое "проблема выражения"?
У меня есть приблизительное представление о том, что это такое, но если у кого-то есть объяснение "проблемы выражения", которое, по их мнению, является кратким и интуитивным, я бы хотел услышать это.
3 ответа
Посмотрите эту лекцию.
Идея состоит в том, что ваша программа представляет собой комбинацию типа данных и операций над ним. Проблема требует реализации, которая позволяет добавлять новые случаи типа и новые операции без необходимости перекомпиляции старых модулей и сохранения статической безопасности типов (без приведения или проверки типов во время выполнения).
Интересно отметить, что в функциональных языках программирования легко добавлять новые операции, но сложно добавлять случаи в тип данных. В то время как на языке ОО это наоборот. Это одно из больших концептуальных различий между двумя парадигмами программирования.
Идея, стоящая за проблемой, заключается в том, что текст является одномерным Даже если у вас есть строки и столбцы, вы обычно читаете их, слово за словом, строка за строкой. Так же как и компилятор.
И вы пытаетесь представить какие-то 2 или более мерных данных в нем. Например, таблица в порядке мэров строк выглядит следующим образом:
((A, B, C), (D, E, F), (G, H, I))
В этом представлении довольно легко добавить новую строку в конце, не касаясь остальных:
((A, B, C), (D, E, F), (G, H, I), (J, K, L))
Но добавить столбцы немного проблематично, вам нужно прикоснуться к нему в 4 разных местах:
((A, B, C, M), (D, E, F, N), (G, H, I, O), (J, K, L, P))
Обычно вы сталкиваетесь с этой проблемой на практике, когда имеете дело с абстрактными классами: довольно просто добавить новый подтип как новый модуль, но когда вы добавляете новый абстрактный метод, вам нужно дотронуться до всех модулей и добавить его; Вы должны сделать то же самое во многих местах. Обычно вы делаете абстракции для защиты от этих повторяющихся вещей.
Нет решения этой проблемы, пока вы используете 1D представление.
Решением этой проблемы был бы редактор, который позволяет вам редактировать эти таблицы как вещи, подобные реальной таблице, а не как текст (в виде, подобном Excel, где вы можете удобно добавлять новые столбцы и строки).
Есть также эта статья о решении проблемы с Clojure, однако проблема представлена в Java, поэтому она должна иметь смысл, даже если вы не знаете Clojure, особенно с помощью маленьких диаграмм.