Способ записи изменений объекта с помощью F # - PullRequest
4 голосов
/ 07 августа 2010

Есть ли умный способ записи изменений, внесенных в объект в F #?

Я исследовал F # как способ построения объектной модели, которая воспроизводит себя по сети. Одна из задач, которую мне нужно решить, - как обнаружить изменения, внесенные в объекты, чтобы я мог отправлять только изменения клиентам

Примечание: я ищу ответы , отличные , кроме "внедрить INotifyPropertyChanged" или "сделать что-то, что можно легко сделать в C #". Если это единственный способ решить проблему в F #, тогда F # - это не тот инструмент, который я ищу.

Почему F #? Потому что я не удовлетворен тем, как этот шаблон наблюдателя состояния реализован в C #. Поэтому я исследую, существует ли какой-нибудь элегантный способ реализовать его на динамическом языке, начиная с F #.

Ответы [ 5 ]

4 голосов
/ 11 августа 2010

Вместо того, чтобы обнаруживать и уведомлять об изменениях по мере их возникновения, вы можете сделать ваши классы неизменяемыми (например, используя стандартные неизменяемые типы, такие как записи и объединения, или заставляя объект содержать только неизменяемые вещи). Тогда вы могли бы написать функцию, которая «разыскивает» два экземпляра класса, и иметь некоторый агент, который ищет изменения в расписании или на основе какого-либо триггера и отправляет разногласия на другой конец.

Поскольку данные будут неизменными, агенту потребуется только сохранить указатель на версию, которую он отправил в последний раз. Сама функция сравнения может быть либо написана от руки для каждого класса, что обеспечит эффективную реализацию, учитывающую свойства данных, либо вы можете написать обобщенную, используя отражение.

4 голосов
/ 08 августа 2010

Пример использования INotifyPropertyChanged в F #.

type DemoCustomer() =
    let mutable someValue = 0
    let propertyChanged = Event<_, _>()

    member this.MyProperty
        with get() = someValue
        and  set(x) =
            someValue <- x
            propertyChanged.Trigger(this, PropertyChangedEventArgs("MyProperty"))

    interface INotifyPropertyChanged with
        [<CLIEvent>]
        member this.PropertyChanged = propertyChanged.Publish
3 голосов
/ 07 августа 2010

Как насчет использования интерфейса INotifyPropertyChanged?и вызывать события, которые вызывают репликацию данных при их изменении?

1 голос
/ 08 августа 2010

Я бы использовал прокси-библиотеку: Castle DynamicProxy , LinFu , Spring.NET и т. Д.

Использование прокси-библиотекиВы можете легко реализовать INotifyPropertyChanged прозрачным, неинвазивным способом.

0 голосов
/ 13 августа 2010

Можете ли вы использовать отражение, чтобы пройтись по полям объекта и посмотреть, что изменилось?Если они содержат неизменяемые данные F #, то проверки на равенство заберут изменения.Затем вы можете отправить различия относительно последнего отправленного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...