LINUX.ORG.RU

паника. Сделать так, чтобы member вычислялся 1 раз

 


0

2

В общем, есть тип из другой сборки, который очень нужно расширить примерно следующим образом:

type AAA with
    member x.arrows_md_table = ArrowMDTable.makeArrowMDTable(x)
ArrowMDTable.makeArrowMDTable(x) вычисляется каждый раз при вызове arrows_md_table у AAA, что совсем не требуется. Нужно именно расширить тип ААА, непосредственного доступа к нему нет, чтобы изменить! Как это сделать?

Напрямую - никак, но можно кешировать.

Если x - какой-нибудь контрол, то имеет свойство Tag. Туда и прописать кеш. Его проверять при каждом обращении. Решение так себе, но может сойти.

Если такого свойства нет, то можно сделать грязный хак - завести глобальную хеш-таблицу с ключом по объектам AAA. Но тут встает вопрос о жизненном цикле, то есть, когда удалять ассоциацию ключ-значение? Решение само по себе мерзкое, может сгодиться только как крайняя мера. Хотя тут возможны варианты, если мы можем удалять ассоциации из хеш-таблицы извне на основе какой-то дополнительной информации.

В общем, тут сложно давать общие советы. Я бы рекомендовал пересмотреть сам подход. Мне он не нравится.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от dave

ну в общем я так и думал :( сейчас подход примерно такой - AAA-это граф, и для каждого пакета(module) нужно расширение этого графа некоторыми полями, но, есть общие алгоритмы, которые работают с таким графом как с изначальным типом, без расширений. Пока есть идея сделать ААА базовым классом для классов-расширений и приводить его к базовому в общих алгоритмах.

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

но есть проблема - создание объекта типа AAA дорогая операция и для каждого дочернего класса создавать его заново не годится, так что думаю сделать класс обертку со специфичными полями, инкапсулирующий ААА

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от dave

да, но есть еще одна проблема, в графе есть вершины и их бы тоже не мешало расширить, но создавать врапер над ними, если даже забить на производительность, не очень хочется, потому что если кастовать их каждый раз до дочернего типа вообще не хочется. Просто чем мне нравится идея расширения типа - можно написать open ModuleWithTypeEctensions и в компайлтайме я буду видеть все ошибки кастования

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Но такое расширение не может иметь своего состояния. Ведь ты этого хотел? Кстати, а тут есть побочные эффекты? Я имею в виду, не может ли измениться значение свойства со временем. Если да, то тут надо обновлять кеш. В общем, у меня слишком мало информации, чтобы давать советы :)

dave ★★★★★
()
Ответ на: комментарий от dave

по моему кэш в данном случае это утопия :) пс - сделал врапперы

pseudo-cat ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.