2016-12-28 60 views
2

我有以下功能:打破引用透明

_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值,我會得到相同的結果,但我不確定。

回答

0

我不計劃在JS,但「功能範式」實際上定義關於(pure) functions性質:

  • 如果有相同的參數總是返回相同的結果。這稱爲參考透明度,您可以將其添加到您的$ 5編程術語列表中。
  • 它不會導致任何副作用。也就是說,函數不能在函數本身之外進行任何可觀察的更改 - 例如,通過更改可從外部訪問的可變對象或寫入文件。

由於oModel.read("/CostCenterCalendarSet", ...)似乎做I/O,它不是一個純粹的功能(看看this question明白爲什麼閱讀是一個副作用,太)。

此外,如果使用日期/時間的函數完全可以引用透明,那麼這是一個controversial topic - 尤其是如果它不是參數列表的一部分。