打破引用透明

时间:2016-12-28 08:24:29

标签: javascript functional-programming rxjs rxjs5

我有以下功能:

_processSelectedPlantWcOb: function (oSelectOb, oSetNewDates, oWpServiceOb, fnQueryDatesPlantWcOb) {
  let self = this;

  return oSelectOb
    .map(function (oEvent) {
      return oEvent.getSource();
    })
    .switchMap(function (oSelect) {
      return oSetNewDates.mapTo(oSelect);
    })
    .map(function (oSelect) {
      let oItem = oSelect.getSelectedItem();
      let aKeys = oItem.getKey().split("/");
      return {sPlant: aKeys[0], sWc: aKeys[1]};
    })
    .switchMap(function (oSelected) {
      return fnQueryDatesPlantWcOb(oWpServiceOb, oSelected.sPlant, oSelected.sWc);
    });
},

正如您所看到的,最后一个参数是期望一个函数,而函数fnQueryDatesPlantWcOb的实现如下所示:

_processQueryDatesPlantWcOb: function (oWpServiceOb, sPlant, sWc) {

  return oWpServiceOb
    .switchMap(function (oModel) {
      let oPlantFilter = new sap.ui.model.Filter("Plant", sap.ui.model.FilterOperator.EQ, sPlant);
      let oWcFilter = new sap.ui.model.Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, sWc);

      return Rx.Observable.create(function (subscriber) {
        oModel.read("/CostCenterCalendarSet", {
          success: function (oData, oResponse) {
            subscriber.next(oResponse);
          },
          error: function (oError) {
            subscriber.error(oError);
          },
          filters: [oPlantFilter, oWcFilter]
        });
      });
    })
    .filter(function (oData) {
      return oData.data.results.length > 0
    })
    .mergeMap(function (oData) {
      return Rx.Observable.from(oData.data.results);
    })
    .map(function (oData) {
      let oDate = oData.InspectionDate;
      return new Date(oDate.getFullYear(), oDate.getMonth(), oDate.getDate());
    })
    .filter(function (oDate) {
      let oToday = new Date();
      return oDate.getTime() > oToday.getTime();
    })
    .map(function (oDate) {
      return oDate.getTime();
    });
},

如您所见,参数sPlantsWc将在switchMap函数中使用。

我想知道的是,我是否打破了功能范式? 在我看来,我没有打破它,因为每次当我传递相同的sPlantsWc值时,我都会得到相同的结果,但我不确定。

1 个答案:

答案 0 :(得分:0)

我没有用JS编程,但“功能范例”实际上定义了关于(pure) functions两个属性:

  
      
  • 如果给出相同的参数,它总是返回相同的结果。这称为参照透明度,您可以将其添加到$ 5编程术语列表中。
  •   
  • 不会引起任何副作用。也就是说,该函数不能在函数本身之外进行任何可观察的更改 - 例如,通过更改外部可访问的可变对象或写入文件。
  •   

由于oModel.read("/CostCenterCalendarSet", ...)似乎做了I / O,所以它不是纯函数(请查看this question以了解为什么阅读也是副作用。)

此外,如果使用日期/时间的函数可以完全透明,则它是controversial topic - 特别是如果它不是参数列表的一部分。