该功能是否被视为副作用,从而导致FP设计不良?

时间:2018-08-28 09:28:04

标签: scala http functional-programming

  private def retrieveSongId(songName: String): Option[JsValue] = {
    val geniusStringResponse = Http("https://api.genius.com/search?q=" + formattedSongName)
      .param("access_token", apiKey)
      .asString
      .body

    //Extra processing with geniusStringResponse   
    }
  }

由于HTTP请求,上述功能是否会被视为副作用?如果是这样,这样的Scala代码是否合适?

1 个答案:

答案 0 :(得分:3)

是的,调用此函数具有发出HTTP请求的副作用。调用此函数可能会影响另一个函数(例如 //app.filter.ts //from here data is getting from components.ts file and returning data to same ts file and the data i am sending to html file and there i am rendering data to display import{ Pipe, PipeTransform} from '@angular/core'; @Pipe({ name:"filter" }) export class FilterPipe implements PipeTransform{ newVal : any=[] filterdata=[]; transform(value:any, search){ // console.log(value) if(search===undefined){ return value; } else{ this.filterdata=[]; for(let k of value){ // console.log(k) if(k.city.toLowerCase().indexOf(search)==search.indexOf(search)){ // console.log(search) this.filterdata.push(k); } } }return this.filterdata; } } //component.ts file //here entire logic goes here and data keep here with some data key name and the logic is build by the data getting from filter data import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-autocomplte-pagination', templateUrl: './autocomplte-pagination.component.html', styleUrls: ['./autocomplte-pagination.component.css'] }) export class AutocompltePaginationComponent implements OnInit { constructor( ) { } public search: any; public data : any =[]; public noOfItemsToShowInitially: number = 5; public itemsToLoad: number = 1; public isFullListDisplayed: boolean = false; public itemsToShow; public countries: any = [ { 'city': 'abbeville', 'state': 'Louisiana' }, { 'city': 'Aberdeen', 'state': 'Maryland' }, { 'city': 'Aberdeen', 'state': 'Mississippi' }, { 'city': 'Aberdeen', 'state': 'South Dakota' }, { 'city': 'Aberdeen', 'state': 'Washington' }, { 'city': 'Abilene', 'state': 'Texas' }, { 'city': 'Abilene', 'state': 'Kansas' }, { 'city': 'Abingdon', 'state': 'Virginia' }, { 'city': 'Abington', 'state': 'Massachusetts' }, { 'city': 'Abington', 'state': 'Massachusetts' }, { 'city': 'Absecon', 'state': 'New Jersey' }, { 'city': 'Accokeek', 'state': 'Maryland' }, { 'city': 'Acton', 'state': 'Massachusetts' }, { 'city': 'Acushnet', 'state': 'Massachusetts' }, { 'city': 'Acworth', 'state': 'Georgia' }, { 'city': 'Ada', 'state': 'Oklahoma' }, { 'city': 'Adams', 'state': 'Massachusetts' }, { 'city': 'Addison', 'state': 'Illinois' }, { 'city': 'Addison', 'state': 'Texas' }, { 'city': 'Adelanto', 'state': 'California' }, { 'city': 'Adelphi', 'state': 'Maryland' }, { 'city': 'Adrian', 'state': 'Michigan' }, { 'city': 'Affton', 'state': 'Missouri' }, { 'city': 'Agawam', 'state': 'Massachusetts' }, { 'city': 'Agoura Hills', 'state': 'California' }, { 'city': 'Ahuimanu', 'state': 'Hawaii' }, { 'city': 'Aiea', 'state': 'Hawaii' }, { 'city': 'Aiken', 'state': 'South Carolina' }, { 'city': 'Air Force Academy', 'state': 'Colorado' }, { 'city': 'Airmont', 'state': 'New York' }, { 'city': 'Akron', 'state': 'Ohio' }, { 'city': 'Alabaster', 'state': 'Alabama' }, { 'city': 'Alachua', 'state': 'Florida' }, { 'city': 'Alameda', 'state': 'California' }, { 'city': 'Alamo', 'state': 'California' }, { 'city': 'Alamo', 'state': 'Texas' }, { 'city': 'Alamo Heights', 'state': 'Texas' }, { 'city': 'Alamogordo', 'state': 'New Mexico' }, { 'city': 'Alamosa', 'state': 'Colorado' }, { 'city': 'Albany', 'state': 'Georgia' }, { 'city': 'Albany', 'state': 'California' }, { 'city': 'Albany', 'state': 'New York' }, { 'city': 'Albany', 'state': 'Oregon' }, { 'city': 'Albemarle', 'state': 'North Carolina' }, { 'city': 'Albert Lea', 'state': 'Minnesota' }, { 'city': 'Albertville', 'state': 'Alabama' }, { 'city': 'Albion', 'state': 'Michigan' }, { 'city': 'Albion', 'state': 'New York' }, { 'city': 'Albion', 'state': 'New York' }, { 'city': 'Albuquerque', 'state': 'New Mexico' }, { 'city': 'Alcoa', 'state': 'Tennessee' }, { 'city': 'Alden', 'state': 'New York' }, { 'city': 'Alderwood Manor', 'state': 'Washington' }, { 'city': 'Aldine', 'state': 'Texas' }, { 'city': 'Alexander City', 'state': 'Alabama' }, { 'city': 'Alexandria', 'state': 'Indiana' }, { 'city': 'Alexandria', 'state': 'Minnesota' }, { 'city': 'Alexandria', 'state': 'Kentucky' }, { 'city': 'Alexandria', 'state': 'Louisiana' }, { 'city': 'Alexandria', 'state': 'Virginia' }, { 'city': 'Algonquin', 'state': 'Illinois' }, { 'city': 'Alhambra', 'state': 'California' }, { 'city': 'Alice', 'state': 'Texas' }, { 'city': 'Aliquippa', 'state': 'Pennsylvania' }, { 'city': 'Aliso Viejo', 'state': 'California' }, { 'city': 'Allegany', 'state': 'New York' }, { 'city': 'Allen', 'state': 'Texas' }, { 'city': 'Allen Park', 'state': 'Michigan' }, { 'city': 'Allendale', 'state': 'Michigan' }, { 'city': 'Allendale', 'state': 'New Jersey' }, { 'city': 'Allentown', 'state': 'Pennsylvania' }, { 'city': 'Alliance', 'state': 'Ohio' }, { 'city': 'Alliance', 'state': 'Nebraska' }, { 'city': 'Allouez', 'state': 'Wisconsin' }, { 'city': 'Alma', 'state': 'Michigan' }, { 'city': 'Aloha', 'state': 'Oregon' }, { 'city': 'Alondra Park', 'state': 'California' }, { 'city': 'Alpena', 'state': 'Michigan' }, { 'city': 'Alpharetta', 'state': 'Georgia' }, { 'city': 'Alpine', 'state': 'California' }, { 'city': 'Alpine', 'state': 'Utah' }, { 'city': 'Alsip', 'state': 'Illinois' }, { 'city': 'Alta Sierra', 'state': 'California' }, { 'city': 'Altadena', 'state': 'California' }, { 'city': 'Altamont', 'state': 'Oregon' }, { 'city': 'Altamont', 'state': 'New York' }, { 'city': 'Altamonte Springs', 'state': 'Florida' }, { 'city': 'Alton', 'state': 'Illinois' }, { 'city': 'Altoona', 'state': 'Iowa' }, { 'city': 'Altoona', 'state': 'Pennsylvania' }, { 'city': 'Altoona', 'state': 'Wisconsin' }, { 'city': 'Altus', 'state': 'Oklahoma' }, { 'city': 'Alum Rock', 'state': 'California' }, { 'city': 'Alvin', 'state': 'Texas' }, { 'city': 'Amarillo', 'state': 'Texas' }, { 'city': 'Ambler', 'state': 'Pennsylvania' }, { 'city': 'Ambridge', 'state': 'Pennsylvania' }, { 'city': 'American Canyon', 'state': 'California' }, { 'city': 'American Fork', 'state': 'Utah' }, { 'city': 'Americus', 'state': 'Georgia' }, { 'city': 'Ames', 'state': 'Iowa' }, { 'city': 'Amesbury', 'state': 'Massachusetts' }, { 'city': 'Amesbury', 'state': 'Massachusetts' }, { 'city': 'Amherst', 'state': 'New Hampshire' }, { 'city': 'Amherst', 'state': 'Massachusetts' }, { 'city': 'Amherst', 'state': 'Ohio' },] ngOnInit() { this.itemsToShow = this.countries.slice(0, this.noOfItemsToShowInitially); } loadmore(select) { if (this.noOfItemsToShowInitially <= this.countries.length) { // Update ending position to select more items from the array this.noOfItemsToShowInitially += this.itemsToLoad; this.itemsToShow = this.countries.slice(0, this.noOfItemsToShowInitially); } else { this.isFullListDisplayed = true; } } } //app.module.ts file //this is entire module.ts file and importing each and every file to get the out if anything miss out please do add any imports to need to run import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule} from '@angular/forms'; import { RouterModule, Routes} from '@angular/router'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ScrollEventModule } from 'ngx-scroll-event'; import { AppComponent } from './app.component'; import { LoginComponent } from './login/login.component'; import { AutocompltePaginationComponent } from './autocomplte-pagination/autocomplte-pagination.component'; import{ FilterPipe} from './app.filter'; import {NgAutoCompleteModule} from "ng-auto-complete"; const routes : Routes = ([ { path : 'login', component : LoginComponent}, {path : 'autocomplte-pagination', component : AutocompltePaginationComponent} ]) @NgModule({ declarations: [ AppComponent, LoginComponent, AutocompltePaginationComponent, FilterPipe ], imports: [ BrowserModule, FormsModule, RouterModule.forRoot(routes), InfiniteScrollModule, ScrollEventModule, NgAutoCompleteModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { })的结果,并且在输入值相同的情况下(例如,服务器始终不可用),该函数可能会返回不同的结果。

但这并不意味着它不合适。任何可用的Scala程序都将产生副作用,但诀窍是使它们尽可能地受到约束。一个编写良好的Scala程序将具有一组丰富的副作用免费类和函数,以及调用它们的相对较轻的非功能代码层。

例如,在这种情况下,您应该具有一个执行HTTP请求的简单函数和一个处理结果的第二个函数。结果处理功能可以是纯功能代码,并且可以使用模拟数据进行有效测试。