Внедрение зависимостей, как его сейчас принято делать, не работает со static-классами. У меня получается, что классы, обрабатывающие данные, имеют только зависимости в полях.
Почему ломается? Потому что SEH устроен так, что когда выбрасывается SEH-исключение, системный код начинает обходить цепочку SEH-фреймов в поисках обработчика, который возьмётся обработать исключений
Не актуально для x64. Код не создаёт seh-фреймы. Адреса обработчиков исключений прописаны статически в PE-файле.
При том, что "китайская комната" не обучена визуальной модальности, как крестьянин не умеет читать UTF-8, а слепой не видит "банальное яблоко".
так будет очевидно что человек в данном случае низведен просто до винтика в системе
Да и так очевидно. Роль человека в китайской комнате - выполнять инструкции. Если он это делает качественно, он не должен вносить отсебятину и что-то там делать по-своему. Даже если он знает китайский и видит, что получается неверный перевод.
если китайской комнате показать что то, например банальное яблоко
Потому что другой способ кодирования, к которому она не приспособлена. Если китайскому крестьянину показать слово "яблоко" hex-кодами в кодирвке utf-8 (E8 98 8B E6 9E 9C), он тоже ничего не поймёт. И что с того, он не знает китайский, по-вашему?
включала в себя восприятие визуальных образов человеком и выбор им иероглифа подходящего визуальному образу то даже тот человек кто раньше применял этот неправильный аргумент уже не будет его применять, потому что ну как можно про человека который умеет подбирать слово к предмету сказать что он не понимает язык
А если так описать:
выдели признаки изображения
если есть острые углы, открой ящик #2
если есть скругления, радиус которых меньше 10% от объекта, открой ящик #3
и т.д... В итоге, человек достаёт из самой глубины какого-то ящика табличку с нужным иероглифом, но он сам не распознавал образ, он лишь выполнял формальные замеры, с которым справится несложный датчик, и к полученным числовым значениям применял правила.
Решение не production-ready, т.е. для другой структуры данных нужно будет писать новый код. Для другой операции над данными (поиск по 2 словам, например) - тоже писать код.
Похожий подход в общем виде реализован в БД полнотекстового поиска (Sphinx, Lucene). Там либо индексный файл, либо подход "читаю блоб 1 раз от начала до конца, для скорости прыгая через блоки, используя скип-листы). И там куча операций реализована, куча эвристик, чтобы сжать данные. Например, словарь сортируется, а соседние слова пишутся только с разницей в суффиксе.
Хотя, я посмотрел asm-код. В class procedure уже передаётся классовый параметр vt. То есть в Delphi class procedure это не то же самое, что static метод в C++.
Иногда мне тоже было нужно такое, и оно решалось через generics. Но чтобы прямо в языке, нигде этого не видел. Наверное, потому что сложно реализовать компилятору. Под капотом будет что-то типа виртуального наследования из C++, т.е. чтобы получить доступ к переменной, надо сходить в VT и оттуда достать смещение этой переменной (для классовой переменной - адрес, т.к. поле глобальное, а не в экземпляре объекта класса).
Самое неприятное - это оверхед на ровном месте. Во все static-функции класса придётся передавать ещё один параметр - указатель на vt класса, чтобы понять в контексте какого класса работает метод. Хотя это нужно почти никогда.
Поэтому ваш эксперимент и вызывает столько непонимания. А я сразу объявил это нереалистичной абстракцией.
По вашим же условиям
которое приняли бы вы сами, будь у вас столько же данных
То есть, если бы вы владели всей информацией, то есть были сверхразумом, вы бы приняли лучшие для себя решения. А теперь, оказывается, вы это не так понимаете, как описали.
Пусть они мне совершенно не понравятся
Не имея ответа на вопрос "почему", вы их не будете выполнять. Ах, опять же "у нас мысленный эксперимент, представьте ситуацию 100% доверия", да? Но смысл, если в реальности таких условий никогда не будет.
Вам нужна возможность в рантайме создавать новые классы? Накидывать в созданные классы новые поля, методы? И каким синтаксисом потом всё это вызывать, сейчас-то компилятор проверяет валидность методов и полей в compile-time.
Единственное что не хватает это классовых переменных.
Delphi 7 так умеет:
type
TMyObjectClass = class of TMyCustomObject;
var
aClass: TMyObjectClass;
aObject: TMyCustomObject;
begin
aClass := TMySpecificObject;
aObject := aClass.Create( ... );
end;
Значит, будет года через 2, как с Re:Fantasio, или с FF7.
Сейчас прогресс в графике минимальный, игра не устареет за 2 года.
Не могу сообразить, как это будет выглядеть с зависимостями.
Вот например anemic модель
Если делаем rich-объект
Customerи переносим методSaveв него, конструктор доменного объекта должен принимать зависимости?Выглядит некрасиво.
Внедрение зависимостей, как его сейчас принято делать, не работает со static-классами. У меня получается, что классы, обрабатывающие данные, имеют только зависимости в полях.
Не актуально для x64. Код не создаёт seh-фреймы. Адреса обработчиков исключений прописаны статически в PE-файле.
Если вы столкнулись с такой ситуацией, вот пошаговые действия:
Сохраняйте спокойствие
Такое может случиться с каждым из-за стресса, болезни, проблем с пищеварением или других причин. Главное – не паниковать.
Очистите кожу
Аккуратно снимите испачканную одежду.
Промойте кожу теплой водой с мягким мылом (лучше детским или pH-нейтральным).
Если нет доступа к воде, воспользуйтесь влажными салфетками (лучше для чувствительной кожи).
Смените одежду
Наденьте чистое белье и одежду.
Если находитесь вне дома, по возможности примите душ.
Решите проблему с запахом
Проветрите помещение.
Используйте освежитель воздуха, если нужно.
Разберитесь с причиной
Если это произошло из-за диареи, примите смекту, лоперамид или активированный уголь.
Пейте больше воды, чтобы избежать обезвоживания.
Если проблема повторяется, обратитесь к врачу (гастроэнтерологу или терапевту).
Если ситуация произошла в общественном месте Найдите туалет, чтобы привести себя в порядок.
В крайнем случае можно купить новую одежду в ближайшем магазине.
Главное – не переживать, такое случается, и это не конец света! 😊
То есть то же самое, что в rust. Проверка будет в run-time. А нам тут рассказывали, как компилятор сможет всё устроить без оверхеда.
При том, что "китайская комната" не обучена визуальной модальности, как крестьянин не умеет читать UTF-8, а слепой не видит "банальное яблоко".
Да и так очевидно. Роль человека в китайской комнате - выполнять инструкции. Если он это делает качественно, он не должен вносить отсебятину и что-то там делать по-своему. Даже если он знает китайский и видит, что получается неверный перевод.
Потому что другой способ кодирования, к которому она не приспособлена.
Если китайскому крестьянину показать слово "яблоко" hex-кодами в кодирвке utf-8 (E8 98 8B E6 9E 9C), он тоже ничего не поймёт. И что с того, он не знает китайский, по-вашему?
А если так описать:
выдели признаки изображения
если есть острые углы, открой ящик #2
если есть скругления, радиус которых меньше 10% от объекта, открой ящик #3
и т.д...
В итоге, человек достаёт из самой глубины какого-то ящика табличку с нужным иероглифом, но он сам не распознавал образ, он лишь выполнял формальные замеры, с которым справится несложный датчик, и к полученным числовым значениям применял правила.
Решение не production-ready, т.е. для другой структуры данных нужно будет писать новый код.
Для другой операции над данными (поиск по 2 словам, например) - тоже писать код.
Похожий подход в общем виде реализован в БД полнотекстового поиска (Sphinx, Lucene).
Там либо индексный файл, либо подход "читаю блоб 1 раз от начала до конца, для скорости прыгая через блоки, используя скип-листы). И там куча операций реализована, куча эвристик, чтобы сжать данные. Например, словарь сортируется, а соседние слова пишутся только с разницей в суффиксе.
Вот так китаец Хуанг стал мексиканцем/испанцем Хуаном.
Если конечно это не первоапрельская шутка редактора...
Думаю, нет. Игра работает нормально. А проблемы модов устранят сами моддеры.
Большая статья на тему, как бы это могло быть реализовано в Delphi, здесь: https://habr.com/en/articles/504386/
Хотя, я посмотрел asm-код. В class procedure уже передаётся классовый параметр vt. То есть в Delphi class procedure это не то же самое, что static метод в C++.
Теперь я понял, что требуется.
Иногда мне тоже было нужно такое, и оно решалось через generics.
Но чтобы прямо в языке, нигде этого не видел. Наверное, потому что сложно реализовать компилятору. Под капотом будет что-то типа виртуального наследования из C++, т.е. чтобы получить доступ к переменной, надо сходить в VT и оттуда достать смещение этой переменной (для классовой переменной - адрес, т.к. поле глобальное, а не в экземпляре объекта класса).
Самое неприятное - это оверхед на ровном месте. Во все static-функции класса придётся передавать ещё один параметр - указатель на vt класса, чтобы понять в контексте какого класса работает метод. Хотя это нужно почти никогда.
Не понимаю, чего не хватает в указателях на классовый объект, если новые классы в рантайме вы не собираетесь создавать.
Приведите кусок псевдокода, в котором эти "классовые переменные" были бы полезны.
Поэтому ваш эксперимент и вызывает столько непонимания. А я сразу объявил это нереалистичной абстракцией.
По вашим же условиям
То есть, если бы вы владели всей информацией, то есть были сверхразумом, вы бы приняли лучшие для себя решения. А теперь, оказывается, вы это не так понимаете, как описали.
Не имея ответа на вопрос "почему", вы их не будете выполнять.
Ах, опять же "у нас мысленный эксперимент, представьте ситуацию 100% доверия", да? Но смысл, если в реальности таких условий никогда не будет.
Вам нужна возможность в рантайме создавать новые классы?
Накидывать в созданные классы новые поля, методы? И каким синтаксисом потом всё это вызывать, сейчас-то компилятор проверяет валидность методов и полей в compile-time.
Delphi 7 так умеет:
А какие решения вам нужны?
Если по условию эксперимента, эта нейросеть - гарантированно лучшая/оптимальная, то другая - всегда хуже. Вы сознательно выбираете результат хуже?