Pull to refresh

Comments 16

Забавно, надо запомнить и при случае попробовать применить.
Чем-то напоминает связку паттернов билдер + делегат + наблюдатель. Имхо решение конечно интересное получается, но вот код уж больно режет глаз да

и как на счет быстроты изменени кода я и поиска багов?

Вычислительные затраты минимальны по сравнению, скажем, с выполнением запроса к базе данных или парсингом XML. Вряд ли можно говорить о хоть каком-то влиянии на производительность.
Это дело называется (functional) reactive programming. Или, в более простом случае, dataflow programming.
Спасибо — запомню
Советую вот эту статейку:
lamp.epfl.ch/~imaier/pub/DeprecatingObserversTR2010.pdf

Там они описывают как строят подобное на scala. В частности разобраны сложности реализации — плюсы/минусы push/pop-моделей, как быть с динамически меняющимися связями и всякое такое. Это все нетривиально.
это библиотека для Java а не для Scala
Неважно. Там очень хорошо расписаны тонкости, связанные с реализацией FRP. А тонкостей там много.
Хм, отличная тулза, например, для смены локализации во всем приложении без перезагрузки приложения не через жопу.
Что такое локализация с точки зрения общего случая:

это набор значений которые зависят от одного переключателя. Необязательно это язык. Например это могут быть настройки режимов видимости полей/кнопок
— Продвинутый — видно всё
— Для начинающих — видно только основное а остальное в меню

Для таких вещей в библиотеке есть класс Fit

Пример
public static void main(String[] a) {
System.out.println("\nFit\n");
Fit‹String› g = new Fit‹String›()
.item("English", "w1", "First")
.item("English", "w2", "Second")
.item("English", "w3", "Third")
.item("Spain", "w1", "Primero")
.item("Spain", "w2", "Segundo")
.item("Spain", "w3", "Tercera");
Note s1 = new Note().bind(g.find("w1"));
Note s2 = new Note().bind(g.find("w2"));
Note s3 = new Note().bind(g.find("w3"));
Note s4 = new Note().bind(g.find("w4"));
System.out.println("/set English");
g.selector().value("English");
System.out.println(s1.value() + ", " + s2.value() + ", " + s3.value() + ", " + s4.value());
System.out.println("/set Spain");
g.selector().value("Spain");
System.out.println(s1.value() + ", " + s2.value() + ", " + s3.value() + ", " + s4.value());
}


Результат
Fit

/set English
First, Second, Third, null
/set Spain
Primero, Segundo, Tercera, null

Да. Просто проще «связать» текстовые метки для локализации, и обновлять одним методом, нежели писать метод, который будет пробегать по всем контролам = )
Просто замечательная реализация! Ещё бы добавить сюда:
— комментарии в код
— юнитесты( c удовольствием посоучавствую)
— maven-изация ( c удовольствием посоучавствую).
и я уже обоими руками ваш поклонник!


Мне нужно как раз сейчас нечно подобное для описания взаимодействия комплексных обьектов, и Tee-binding очень близок по духу, и как раз для явы. Супер!

Есть какие нибудь «теоретические основы» для «Тее»? Неужто всё из головы?! В коде не нашёл ни единого упоминания о «как должно быть»…

… при указании таковых метод может претендовать на самостоятельный проблемно-ориетнированный язык программирования!

… да, и ещё — не нашёл возможности указать на баг в гугло-коде. Trunk от сегодняшнего числа «обругал»:



-do-compile:
[javac] Compiling 13 source files to D:\1\build\classes
[javac] D:\1\src\tee\swingtest\TestFrame.java:12: method does not override or implement a method from a supertype
[javac] @Override public void job() {
[javac] ^
[javac] D:\1\src\tee\swingtest\TestFrame.java:39: method does not override or implement a method from a supertype
[javac] @Override
[javac] ^
[javac] D:\1\src\tee\swingtest\TestFrame.java:67: method does not override or implement a method from a supertype
[javac] @Override public void job() {
[javac] ^
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 3 errors

BUILD FAILED
D:\1\nbproject\build-impl.xml:603: The following error occurred while executing this line:
D:\1\nbproject\build-impl.xml:245: Compile failed; see the compiler error output for details.

Total time: 2 seconds

Пришлось ревертиться к rev. 22.
по поводу ошибки неясно. Я продолжаю что-то дописывать (например не хватает SQL-подобных выражений, чтоб уж окончательно закрыть все потребности).

Проверил только что — всё компилится и работает.

По поводу основ — что-то похожее будет в JavaFX. Я им долго занимался (см. мой сайт на javafx.me. К сожалению с участниками проекта JavaFX у меня как-то не заладилось, у них собственная реализация. На мой взгляд у них хуже.

А можно пример обратного преобразования в случае использования условий if-else?

    Numeric n = new Numeric().value(-10);
    Note r = new Note().bind(new Fork‹String›()
            .condition(new Toggle().less(n, -5))
            .then("Frost")
            .otherwise(new Fork‹String›()
                .condition(new Toggle().less(n, +15))
                .then("Cold")
                .otherwise(new Fork‹String›()
                    .condition(new Toggle().less(n, +30))
                    .then("Warm")
                    .otherwise("Hot")
                    )));
r.value("Hot");
System.out.println(n.value()); // Что будет выведено?
Предположим что нужно иметь разный текст SQL-команды в зависимости от диалекта. Примерно так

        System.out.println("\nbidirectional Fork\n");
        Note dialect = new Note().value("MS SQL");
        Note forMSSQL = new Note().value("select top 10 * from table1");
        Note forPostgreSQL = new Note().value("select * from table1 limit 10");
        System.out.println("forMSSQL: "+forMSSQL.value());
        System.out.println("forPostgreSQL: "+forPostgreSQL.value());
        Note command = new Note();
        command.bind(Note
                .iF(dialect.similar("MS SQL"))
                .then(forMSSQL)
                .otherwise(forPostgreSQL));
        System.out.println("dialect: " + dialect.value() + ", command: " + command.value());
        System.out.println("/let dialect isn't MS SQL");
        dialect.value("PostgreSQL");
        System.out.println("dialect: " + dialect.value() + ", command: " + command.value());
        System.out.println("/let command = select field1,filed2 from table1 limit 10");
        command.value("select field1,filed2 from table1 limit 10");
        System.out.println("command: " + command.value());
        System.out.println("forMSSQL: " + forMSSQL.value());
        System.out.println("forPostgreSQL: " + forPostgreSQL.value());


результат:

forMSSQL: select top 10 * from table1
forPostgreSQL: select * from table1 limit 10
dialect: MS SQL, command: select top 10 * from table1
/let dialect isn't MS SQL
dialect: PostgreSQL, command: select * from table1 limit 10
/let command = select field1,filed2 from table1 limit 10
command: select field1,filed2 from table1 limit 10
forMSSQL: select top 10 * from table1
forPostgreSQL: select field1,filed2 from table1 limit 10


— видно что при изменении command также меняется и связанная с ней по условию переменная

ЗЫ
Note.iF это тоже самое что и new Fork() только короче
Sign up to leave a comment.

Articles

Change theme settings