Готово ли производство ReactiveUI?

Я изучал возможность использования Reactive UI в производственном коде. Некоторые функции действительно привлекательны, но меня беспокоит зависимость от этой библиотеки. К ним относятся:

  1. Причудливые названия и условности. Например, защищенные члены начинаются с нижнего регистра, а метод RaiseAndSetIfChanged зависит от вашего закрытого члена, начинающегося с подчеркивания. Я понимаю, что Пол Беттс (автор ReactiveUI) имеет опыт работы с Ruby, так что я предполагаю, что именно отсюда и возникло странное именование. Однако это вызовет для меня настоящую проблему, поскольку стандартное именование (согласно Stylecop) применяется во всем моем проекте. Даже если бы это не было принудительно, я был бы обеспокоен возникающей в результате несогласованностью в именовании.

  2. Отсутствие документации / образцов. Есть немного документации и одинокий образец. Однако документация - это просто серия (старых) сообщений в блоге, а образец основан на V2 библиотеки (теперь она находится на V4).

  3. Странный дизайн, по частям. Например, ведение журнала является абстрактным, чтобы не зависеть от конкретной структуры ведения журнала. Справедливо. Однако, поскольку я использую log4net (а не NLog), мне понадобится собственный адаптер. Я думаю, это потребует от меня реализации IRxUIFullLogger, в которой есть метрическая масса методов (более 50). Я бы подумал, что гораздо лучшим подходом было бы определить очень простой интерфейс, а затем предоставить методы расширения в ReactiveUI для облегчения всех необходимых перегрузок. Вдобавок есть этот странный IWantsToRegisterStuff интерфейс, от которого зависит сборка NLog, от которого я не могу зависеть (потому что это внутренний интерфейс). Надеюсь, мне это не нужно ...

    Во всяком случае, меня беспокоит общий дизайн библиотеки. Кого-нибудь это укусило?

  4. Я уже активно использую MVVM Light. Я знаю, что Пол написал в блоге, где объясняет, что технически можно использовать и то, и другое, но меня больше беспокоит ремонтопригодность. Я подозреваю, что было бы ужасно сбивать с толку, если бы и то, и другое смешалось в одной кодовой базе.

Есть ли у кого-нибудь практический опыт использования Reactive UI в продакшене? Если да, можете ли вы развеять или решить любую из моих вышеупомянутых проблем?


person Kent Boogaart    schedule 21.01.2013    source источник
comment
Если все проблемы, которые вы публикуете, действительны (т.е. именно так выполняется Rx), то, просто прочитав сообщения, которые вы публикуете, я бы сказал: не используйте это для реального производственного кода. Или извлеките и реорганизуйте только те части, которые вам нужны.   -  person stijn    schedule 21.01.2013
comment
Я доволен этим, хотя я еще не выпустил код в производство. Я согласен с вашими опасениями по поводу 2), тем из нас, кто использует его, вероятно, нужно вмешаться. На 4 мы использовали Caliburn с RXUI, но с тех пор прекратили, но я не вижу ничего из MVVM Light, что я не предпочитаю или считаю приемлемым способ RXUI. Не думаю, что вам будет сложно использовать с ним MVVM Light.   -  person kenny    schedule 21.01.2013
comment
Производственное использование RXUI - это GitHub для Windows windows.github.com   -  person kenny    schedule 21.01.2013
comment
Заголовок кажется немного троллем ...   -  person Cameron MacFarland    schedule 22.01.2013
comment
@ Камерон: Какого черта? Как вы предлагаете мне задать этот законный вопрос? Ваш комментарий мне кажется более троллингом.   -  person Kent Boogaart    schedule 22.01.2013
comment
@KentBoogaart Я просто имел в виду, основываясь только на вопросе заголовка, у меня были бы проблемы с решением закрыть это как неконструктивное, потому что это вызовет споры, или слишком локализованное, поскольку это применимо только к текущей версии RxUI. Насчет троллинга не знаю. Такое ощущение, что ты пытаешься завязать спор с этим вопросом. Это кажется конфронтационным.   -  person Cameron MacFarland    schedule 22.01.2013
comment
google.com.au/ Можно предположить, что эта формулировка довольно стандартна.   -  person CAD bloke    schedule 14.02.2013
comment
Это было бы ДА от @KentBoogaart: github.com/reactiveui/ReactiveUI/commit?author = kentcb   -  person CAD bloke    schedule 11.01.2016


Ответы (3)


Давайте рассмотрим ваши проблемы по частям:

№1. «Невероятные названия и условности».

Теперь, когда ReactiveUI 4.1+ имеет CallerMemberName, вам вообще не нужно использовать соглашения (и даже тогда вы можете переопределить их с помощью RxApp.GetFieldNameForPropertyFunc). Просто напишите свойство как:

int iCanNameThisWhateverIWant;
public int SomeProperty {
    get { return iCanNameThisWhateverIWant; }
    set { this.RaiseAndSetIfChanged(ref iCanNameThisWhateverIWant, value); }
}

№2. Отсутствие документации / образцов

Это нормально, но вот еще несколько документов / примеров:

№3. «Я бы подумал, что гораздо лучшим подходом было бы определить очень простой интерфейс, а затем предоставить методы расширения в ReactiveUI для облегчения всех необходимых перегрузок»

Реализуйте вместо этого IRxUILogger, у него скудные два метода :) ReactiveUI заполнит все остальное. IRxUIFullLogger есть только в том случае, если он вам нужен.

«Вдобавок есть странный интерфейс IWantsToRegisterStuff»

Вам не нужно об этом знать :) Это только для того, чтобы иметь дело с инициализацией ReactiveUI, так что вам не нужно иметь шаблонный код.

  1. «Я подозреваю, что было бы ужасно сбивать с толку, если бы и то, и другое смешалось в одной кодовой базе».

Не совсем. Подумайте об этом как о «MVVM Light с суперсилами».

person Ana Betts    schedule 21.01.2013
comment
Спасибо, Пол - это очень помогает! И спасибо за ваши усилия с ReactiveUI. - person Kent Boogaart; 22.01.2013
comment
Потратив некоторое время на изучение образцов и дальнейшую оценку, я думаю, что основными камнями преткновения являются интеграция с моей существующей инфраструктурой (MVVM Light и MEF) и отсутствие документации. Что касается первого, меня беспокоит в основном потому, что будет несколько способов делать что-то (например, регистрировать, отправлять сообщения, разрешать службы). У меня уже есть службы и способ их разрешения (MEF), но теперь модели реактивного представления могут действовать по-другому. Это не конец света, но он оставляет кодовую базу более открытой для бифуркаций. - person Kent Boogaart; 22.01.2013
comment
Извините, еще одно: по какой причине не подписывать ваши собрания? Это создало для меня много трений. Я использовал ILMerge для подписи, но затем обнаружил зависимость от System.Threading.Tasks (которая, как я думал, устарела). Мне пришлось получить указанную сборку с github, чтобы подписаться с помощью ILMerge. Все это делается за очень жестким корпоративным брандмауэром, что приводит к потере времени. Я знаю, что корпоративная бюрократия - это не ваша проблема. Однако с библиотеками можно подписать их, чтобы другие подписанные сборки могли зависеть от них, поэтому я надеюсь, что смогу убедить вас ... группы Google также заблокированы здесь. - person Kent Boogaart; 22.01.2013
comment
Кроме того, в вашей сборке нет CLSCompliant (true), что вызывает проблемы для любого CLS-совместимого кода в зависимости от него. - person Kent Boogaart; 22.01.2013
comment
Извините, мы никогда не будем соответствовать требованиям CLS или подписывать сборки, это слишком большая трата времени для участников (особенно подписание). Подпись означает, что каждый, кто открывает Решение с нуля, обнаруживает ошибки сборки. - person Ana Betts; 22.01.2013
comment
Кроме того, если у вас есть какие-либо вопросы, которые длиннее, чем это поле для комментариев, обязательно напишите мне, [email protected] - person Ana Betts; 22.01.2013
comment
@ Пол Беттс, вы проделали потрясающую работу с ReactiveUI. Спасибо, что предоставили это сообществу. - person Contango; 19.12.2014

Я отвечаю как человек, который использовал ReactiveUI в нескольких производственных системах, имел проблемы с тем, как RxUI делает что-то, и отправил патчи, чтобы попытаться исправить проблемы, которые у меня были.

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

  1. Именование. Я тоже подумал, что это странно. В итоге это стало одной из тех функций, которыми я действительно не пользуюсь. Я использую PropertyChanged.Fody для включения уведомления об изменении с помощью АОП. В результате мои свойства выглядят как автоматические.

  2. Доко. Да, могло быть больше. Особенно с новыми частями, такими как маршрутизация. Возможно, это причина, по которой я не использую весь RxUI.

  3. Логирование. У меня были проблемы с этим в прошлом. См. запрос на вытягивание 69. В конце концов, я считаю RxUI очень самоуверенным фреймворком. Если вы не согласны с этим мнением, вы можете предложить изменения, но это все. Мнение не значит, что это плохо.

  4. Я использую RxUI с Caliburn Micro. CM обрабатывает расположение View-ViewModel и привязку, экран и проводники. Я не использую привязку к соглашению CM. RxUI обрабатывает команды и код ViewModel INPC и позволяет мне реагировать на изменения свойств, используя Reactive вместо традиционных подходов. Разделяя эти вещи, мне намного легче смешивать их вместе.

Связаны ли какие-либо из этих проблем с подготовкой к производству? Неа. ReactiveUI стабилен, имеет приличную базу пользователей, проблемы быстро решаются в группе Google и Пол восприимчив к обсуждению.

person Cameron MacFarland    schedule 22.01.2013
comment
Спасибо за ваш вклад (+1). Однако я категорически не согласен с тем, что это не имеет ничего общего с производственной пригодностью. Продукт, над которым я работаю, однажды будет обслуживаться, поэтому я обязан рассмотреть возможность сопровождения этого кода. Я (как подрядчик) не буду поддерживать код, поэтому еще труднее оправдать включение плохо документированного фреймворка или вносящего несоответствия в базу кода. - person Kent Boogaart; 22.01.2013
comment
@KentBoogaart Я понимаю вашу точку зрения. Моим контраргументом было бы то, что те же вещи (стабильность, активная база пользователей и т. Д.) Также помогут любым будущим сопровождающим. Кроме того, почему вы рассматриваете RxUI? Какие функции он дает вам, которые вы хотите? - person Cameron MacFarland; 22.01.2013
comment
Да, точно. Это компромисс, над которым я мучаюсь: потенциально более простой код, но за счет более сложной поверхности API и зависимостей с плохой документацией. Я думаю, что основные функции, которые я буду использовать (по крайней мере, на данный момент), связаны с фильтрацией живых коллекций и реагированием на изменения внешних данных. В настоящее время я просто пытаюсь включить RxUI в свою базу кода, чтобы попробовать его с одной моделью представления. Однако это оказывается трудным, что с неподписанными сборками и без атрибута CLSCompliant. - person Kent Boogaart; 22.01.2013
comment
@KentBoogaart Это был комментарий о неподписанных сборках и отсутствии соответствия CLSC, направленный на RxUI? - person Cameron MacFarland; 22.01.2013
comment
Ага. Моя база кода подписана и соответствует требованиям CLS, использует анализ кода и так далее. Так что отсутствие этих вещей в RxUI вызывает головную боль. - person Kent Boogaart; 22.01.2013

Я использую его в продакшене, и до сих пор RxUI был совершенно стабильным. У приложения были проблемы со стабильностью, одни из которых связаны с EMS, другие с обработчиком UnhandledException, который вызывал больше проблем, чем решал, но у меня не было никаких проблем с частью приложения ReactiveUI. Однако у меня были проблемы с тем, что ObservableForProperty вообще не запускался, что я мог использовать неправильно и работал последовательно (неправильно) в моем тестовом коде, а также в пользовательском интерфейсе во время выполнения.

-1. Пол объясняет, что _Upper связано с использованием отражения для доступа к частному полю в вашем классе. Вы можете использовать блок, как показано ниже, для работы с сообщениями StyleCop и Resharper, которые легко сгенерировать (из Resharper SmartTag)

    /// <summary>The xxx view model.</summary>
    public class XXXViewModel : ReactiveObject
    {
    #pragma warning disable 0649
    // ReSharper disable InconsistentNaming

    [SuppressMessage("StyleCop.CSharp.NamingRules", 
      "SA1306:FieldNamesMustBeginWithLowerCaseLetter",
      Justification = "Reviewed. ReactiveUI field.")]
    private readonly bool _IsRunning;

    [SuppressMessage("StyleCop.CSharp.NamingRules", 
      "SA1306:FieldNamesMustBeginWithLowerCaseLetter",
      Justification = "Reviewed. ReactiveUI field.")]
    private string _Name;
    ....

или измените свои свойства из полной

    /// <summary>Gets or sets a value indicating whether is selected.</summary>
    public bool IsSelected
    {
        get { return _IsSelected; }
        set { this.RaiseAndSetIfChanged(x => x.IsSelected, value); }
    }

к его составным частям, таким как

    /// <summary>Gets or sets a value indicating whether is selected.</summary>
    public bool IsSelected
    {
        get { return _isSelected; }
        set 
        { 
            if (_isSelected != value)
            {
                this.RaisePropertyChanging(x => x.IsSelected); 
                _isSelected = value;
                this.RaisPropertyChanged(x=>x.IsSelected);
            }
        }
    }

Этот шаблон также полезен, когда вы фактически не предоставляете «простой» метод доступа к свойству, но может потребоваться более производный вариант, в котором установка одного значения влияет на несколько других.

-2. Да, документация не идеальна, но я обнаружил, что после Rx выбор образцов RxUI был довольно простым. Я также отмечаю, что переходы от 2 до 4, похоже, все связаны с изменениями для поддержки Windows 8 / Windows 8 Phone, и, выбрав ReactiveUI для приложения Windows Store, поддержка DotNet 4.5 отличная. т.е. использование [CallerName] теперь означает, что вам просто this.RaiseAndSetIFChanged (value) не нужно выражение.

-3. У меня нет отзывов о журнале, так как я не решил его использовать.

-4. Я тоже не смешивал и не сравнивал с другими фреймворками.

Также есть список других участников ReactiveUI 4.2 по адресу http://blog.paulbetts.org/index.php/2012/12/16/reactiveui-4-2-is-released/, включая Фила Хаака.

person AlSki    schedule 21.01.2013