Статья вики действительно слабая (представляет ли она само обращение абстракции? :), и сама концепция немного сомнительна. Но основная суть этого в том, что абстракция скрывает некоторый базовый элемент, заставляя пользователей этой абстракции заново его реализовывать.
Например, со страницы обсуждения появляется гораздо более интересный пример. Предположим, что ЦП имеет математическую функцию tan
, но не sin
или cos
, а язык программирования реализует sin
и cos
в терминах tan
, но не предоставляет саму tan
. Программист, использующий этот язык, был бы вынужден реализовать tan
в терминах sin
и cos
, которые сами по себе реализованы в терминах tan
, поэтому характеризуют инверсию абстракции.
Итак, вернемся к Скале. Естественно, программист, использующий функции в Scala, не занимается инверсией абстракций, потому что он не вынужден повторно реализовывать функциональность, доступную в качестве примитива для Scala.
С другой стороны, можно утверждать, что реализация функций Scala как экземпляров классов является экземпляром инверсии абстракции. Однако для того, чтобы это было правдой, должны также выполняться две вещи:
- Для JVM должен быть доступен «функциональный» примитив.
- Такой примитив должен был предложить альтернативу тому, что делает Скала.
Что именно является функцией? Как будет выглядеть примитив функции? В этом контексте «функция» означает данные, которые могут быть выполнены. Можно сказать, что весь ассемблерный код, по сути, представляет собой данные, которые могут быть выполнены - только он не переносимый и, кроме того, не байт-код, следовательно, не соответствует принципам проектирования.
С другой стороны, на все методы в Java ссылается идентификатор, посредством которого Java находит код, который должен быть выполнен для иерархии классов данного объекта. Этот идентификатор не раскрывается, хотя его можно использовать косвенно через отражение. Если бы он был раскрыт, и некоторые функции предлагали сказать «вызовите этот код», то, возможно, вокруг этого можно построить функцию.
Итак, я думаю, что может быть доказано, что 1 верно. Давайте перейдем к следующему.
Если бы Java предоставляла тип данных "method", перестали бы функции Scala быть экземплярами класса? Нет, они не будут. Одним из фундаментальных аспектов проектирования Scala является то, что каждый элемент работающей программы является объектом. «Примитивы», которые уже есть в Java, представлены так, как если бы они были обычными объектами с методами, и если бы существовал примитив «метода», то так и было бы.
Одним из возможных следствий применения примитивов методов может стать повышение методов до первоклассных граждан, но сами функции вряд ли изменятся.