Pull to refresh
5
0
Александр Офицеров @AlexanderOfitserov

User

Send message
Спасибо за ссылку. Честно скажу про JFace Data Binding ранее слышал только краем уха, прочитал подробнее. Да, это также реализация паттерна Observer, да сигналы и слоты то же самое. Но возможности сигналов и слотов гораздо шире и преимущество в лаконичности. Если какой либо объект в любой момент времени вдруг решает что у него что-то изменилось он просто емитит сигнал, например:
public class MegaShooter
private void hardWork() {
  // .....
  Connector.emit(this, "multipleChanges", 123, "123", 123.0123);
  // .....
  Connector.emit(this, "simpleFlagChanged", false);
 }
}

То есть во время работы приватного метода MegaShooter.hardWork() были эмитированы 2 сигнала с сигнатурами multipleChanges(int, String, double) и simpleFlagChanged(boolean), эти изменения в код класса можно внести в любой момент и на его работе они никак не отразятся, до тех пор пока они не будут связаны с подходящими слотами:
public class MainActivity extends Activity {
 private MegaShooter megaShooter = new MegaShooter();
 private AnyOtherObject anyObject = new AnyOtherObject();
 // ......
 @Override
   public void onCreate(Bundle savedInstanceState) {
    // .....
    Connector.connect(megaShooter, "SIGNAL(multipleChanges(int, String, double))",
                                         this, "SLOT(shoot1(int, String))");
    Connector.connect(megaShooter, "SIGNAL(multipleChanges(int, String, double))",
                                         anyObject, "SLOT(anyShoot(int))");
    Connector.connect(megaShooter, "SIGNAL(multipleChanges(int, String, double))",
                                         this, "SLOT(shoot2(int, String, double))");
    // ....
    Connector.connect(megaShooter, "SIGNAL(simpleFlagChanged(boolean))",
                                        this, "SLOT(setFlag(boolean))");
   }
  }
   public void shoot1(int rate, String message) {
   // .....
   }
   public void shoot2(int rate, String message, double d) {
   // .....
   }
   public void setFlag(boolean flag) {
   // ....
   }
}

И получаем тот же binding но малой кровью. Никаких лишних объявлений, никаких интерфейсов реализовывать принципиально не нужно. 4 binding'а, 3 объекта связаны, 4 метода(слота) вызываются.
Дельное замечание. Спасибо.
Хотя думаю если заменить MOC кодогенерацию на boost::signal отлаживать легче не станет.
То есть лисенеры в данном аспекте более прозрачны, и это я и имел ввиду.
Если Вы имеете ввиду Necessitas то он имеет массу ограничений, например тянет за собой довольно тяжеловесные Qt библиотеки, должен быть установлен отдельно, имеет ограничения по функционалу (не работал звук насколько я помню), и самое главное то что типичное Qt приложение имеет как правило свой UX, и на Android (look&feel) не похоже.
Моё решение адресовано именно Android API Java разработчикам, просто отдельно взятая технология, реализованная на другой платформе.

Information

Rating
Does not participate
Location
Украина
Date of birth
Registered
Activity