Comments 4
Статья что то типа картинки https://a.d-cd.net/87d8fb2s-480.jpg с заголовком "Сова и глобус" и пояснением "Глобус вы можете видеть в левом верхнем углу картинки". JS же интерпретируется, поиск методов класса/интерфейса/объекта осуществляется по человеко-читаемому имени на этапе run-time, для меня это позднее связывание однозначно. Трансляция TS->JS также ничего не меняет в этом плане, пока, надеюсь ... Или я пропустил, к tsc уже добавили флаг obfuscation по умолчанию?
Вот то, что вы здесь написали, вы написали с точки зрения исполнителя кода. А то, что написано в статье - с точки зрения "писателя" кода:
В этой публикации я «на пальцах» попытаюсь объяснить, чем отличается раннее и позднее связывание кода для обычного программиста. Не для компилятора или статического анализатора, а для человека, который пишет JavaScript/TypeScript-код.
Попробуйте посмотреть на мой текст вот с этой точки зрения. И вы совершенно правы:
поиск методов класса/интерфейса/объекта осуществляется по человеко-читаемому имени на этапе run-time
и если
для меня это позднее связывание однозначно
то я могу за вас только порадоваться :)
Если писать на JS то ничего никуда волшебным образом не пропадает, если писать на TS, то контекст, в который был помещен программист-писатель, будет утерян, да. При трансляции TS > JS (хотя в некоторых источниках это уже названо компиляцией). Потерю контекста (информации о типах и интерфейсах) можно пытаться назвать ранним связыванием, но в статье упоминаются шаблоны проектирования. Шаблоны проектирования опять же явным образом не описаны, а всего лишь подразумеваются и несть им числа, а значит опять в коде информация утеряна для его читателя (и на первый взгляд "позднее" связывание оказывается достаточно "раненьким").
При чём тут трансляция/транспиляция? Когда вы, как программист, пишете код в котором вам нужно знать, где находятся исходники ваших зависимостей (import ... from ...
) - это ранее связывание, когда вы предоставляете возможность кому-то из-вне дать вам эти зависимости - это позднее. Всё. Код после этого может транспилировать/компилироваться/интерпретироваться. Можно использовать любой ЯП. Инверсия контроля - она про позднее связывание. Но чтобы инверсия заработала, ваш код должен быть готов к этому. Вы сами, как разработчик, должны быть к этому готовы.
Вот вам пример JS-кода с 6 зависимостями и без единого статического импорта. Чистейшее позднее связывание. На этапе написания кода вы декларируете, какого типа (с каким интерфейсом) объект (уже готовый и настроенный!) вы хотите получить в качестве зависимости, а что вы получите во время исполнения - зависит от приложения, в котором этот код работает.
Спасибо за ваши комментарии, всегда интересно понять, как именно по-другому люди видят те же самые вещи и процессы.
Разница между ранним и поздним связыванием