2017-11-24 4 views
-1

어떻게하면이 함수를 순수 함수 (함수 프로그래밍)로 만들 수 있습니까?어떻게 함수형 프로그래밍 방식으로이 함수를 만들 수 있습니까?

fun validateOffer(offerValidateRequest: OfferValidateRequest, channelId: ChannelId, tenant: Tenant): OfferValidateRepresentation { 

    val errorsList = mutableListOf<OfferValidateErrorsRepresentation>() 
    val successList = mutableListOf<OfferValidateSuccessRepresentation>() 

    offerValidateRequest.offers.forEach { 
     val filterRequest = OfferGetRequest(it.id, it.type) 
     val catalogs = findCatalogsWithOffers(filterRequest, channelId, tenant) 
     val errorMessages = getOfferErrorMessages(it, catalogs, filterRequest) 

     if (errorMessages.isEmpty()) { 
      successList.add(OfferValidateSuccessRepresentation(it.id, it.type)) 
     } else { 
      errorsList.add(OfferValidateErrorsRepresentation(it.id, it.type, errorMessages)) 
     } 
    } 
    return OfferValidateRepresentation(errorsList, successList) 
} 

오류 및 성공 목록에서 이러한 반복을하는 데별로 기분이 들지 않습니다.

답변

1

실제로 귀하의 기능은 이미 순수합니다. 부작용이 없습니다.

그러나 map, partitionpair destructuring 선언을 사용하여 변경 가능한 목록을 피할 수 있습니다.

함수 작업으로 for 루프를 바꾸면 다중 맵, 필터, flatMaps를 사용하려고합니다. 이것에 대한 좋은 점은,이 작업들 사이에 유일하게 공유되는 데이터는 전달한 컬렉션입니다.

val (successList, errorsList) = offerValidateRequest.offers.map { 
    val filterRequest = OfferGetRequest(it.id, it.type) 
    val catalogs = findCatalogsWithOffers(filterRequest, channelId, tenant) 
    val errorMessages = getOfferErrorMessages(it, catalogs, filterRequest) 
    Pair(it, errorMessages) 
}.partition { 
    it.second.isEmpty() 
} 

return OfferValidateRepresentation(
    errorsList.map { OfferValidateErrorsRepresentation(it.first.id, it.first.type, it.second.errorMessages) }, 
    successList.map { OfferValidateSuccessRepresentation(it.first.id, it.first.type) } 
) 
관련 문제