【问题标题】:Breaking referentially transparent打破参照透明
【发布时间】:2016-12-28 08:24:29
【问题描述】:

我有以下功能:

_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 值时,我都会得到相同的结果,但我不确定。

【问题讨论】:

    标签: javascript functional-programming rxjs rxjs5


    【解决方案1】:

    我不会用 JS 编程,但“函数范式”实际上定义了 两个关于(pure) functions 的属性:

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

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

    此外,如果使用日期/时间的函数完全可以引用透明,则它是 controversial topic,尤其是在它不属于参数列表的情况下。

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 2011-03-11
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2014-04-21
      相关资源
      最近更新 更多