函数式编程和局部函数状态分配
Functional programming and local function state assignments
我最近将一段代码转换为我认为至少部分是函数式javascript。这是一个web表单验证过程。在过程的每一步,函数执行自己的验证层,并在将数据传递给下一个函数之前修改数据。
我的第一个问题是……下面的代码可以被认为至少是"部分"功能吗?你会注意到在requiredFields中我创建了两个赋值…州。它们是函数的局部,函数没有外部副作用....
2)在函数式编程范式的背景下,这种局部分配是不好的实践吗?这被认为是"局部副作用"吗?
模型如下:
function linkmodel() {
return {
title: {
content: undefined,
validation: {
type: "string",
required: true,
minLength: 1,
maxLength: 3,
validationErrorMessage: "Your title must be a valid string between 1 and 35 characters"
}
},
email: {
content: undefined,
validation: {
type: "email",
required: true,
minLength: 1,
maxLength: 60,
validationErrorMessage: "Your email must be between 1 and 50 characters"
}
},
link: {
content: undefined,
validation: {
type: "url",
required: true,
minLength: 1,
maxLength: 500,
validationErrorMessage: "Your link name must be a valid email between 1 and 50 characters"
}
},
description: {
content: undefined
}
}
}
export default linkmodel
验证系统如下:
app.post( "/", function( req, res ) {
let form = new forms.IncomingForm()
form.parse( req, function( err, fields, files ) {
// Lodash launching the function flow
let errorMessageBag = _.flow( objectWithFieldsToValidate,
requiredFields,
stringLengthValidationCheck,
emailValidation )
let result = errorMessageBag(fields, linkmodel()) // That's the end result
console.log( "result", result )
})
// Return object containing all fields to validate and their criterias
function objectWithFieldsToValidate( fields, model ) {
// Remove all model fields that have no validation criteria in model. Description is one of those.
let modelFieldsToValidate = _.pickBy( model, function( value, key ) { return value.validation !== undefined })
// Remove from form field any entry that doesn't have a corresponding key in model
let formFieldsToValidate = _.pick( fields, Object.keys( modelFieldsToValidate ) )
_.forOwn( modelFieldsToValidate, function( value1, key1 ) {
_.forOwn( formFieldsToValidate, function( value, key ) {
if ( key1 === key ) {
modelFieldsToValidate[ key ].content = value
}
})
})
return modelFieldsToValidate
}
// Take care of required fields
function requiredFields( objectWithFieldsToValidate ) {
let okField = {}
let errors = {}
// error: field required but empty: add it to errors literal object
_.forOwn( objectWithFieldsToValidate, function( value, key ) {
if ( objectWithFieldsToValidate[ key ].validation.required === true && objectWithFieldsToValidate[ key ].content === "" ) {
errors[ key ] = objectWithFieldsToValidate[ key ].validation.validationErrorMessage
} else {
// no error: add field to litteral okField
okField[ key ] = value
}
})
return ( { "okField": okField, "errors": errors })
}
function stringLengthValidationCheck( requiredFields ) {
let validatedFields = requiredFields
_.forOwn( validatedFields.okField, function( value, key ) {
// Error: field length is not valid
if ( !validator.isLength( value[ "content" ],
{ min: value[ "validation" ].minLength, max: value[ "validation" ].maxLength }
) ) {
// Add error message to errors errors literal object
validatedFields[ "errors" ][ key ] = value[ "validation" ].validationErrorMessage
// Remove problematic field from okFields
delete validatedFields[ "okField" ][ key ]
}
})
return validatedFields
}
function emailValidation( stringLengthValidationCheck ) {
let validatedFields = stringLengthValidationCheck
_.forOwn( validatedFields.okField, function( value, key ) {
// Error
if ( value["validation"]["type"] === "email" && !validator.isEmail( value[ "content" ])) {
// Add error message to errors
validatedFields[ "errors" ][ key ] = value[ "validation" ].validationErrorMessage
// Remove problematic field from okFields
delete validatedFields[ "okField" ][ key ]
}
})
return validatedFields
}
正如上面的评论所建议的那样,特定的代码审查可能不是SO的主题,但要回答您问题的一般部分:是的,在更广泛的意义上,没有外部可见副作用的函数可以被认为是"功能性的"——比如,"行为功能性的"——即使它内部使用赋值。
一个可能的问题可能是如何验证副作用确实只是内部的,而不是从外部可见。
另一个理论上有趣的事实是,存在一些具有行为功能的函数,但只能通过(内部)赋值来实现。请参阅论文了解更多详细信息(如果您无法访问ACM数字图书馆中的论文,请尝试在网上搜索论文的标题和/或作者)。
相关文章:
- 如何在渲染函数中检查 react 中子组件的状态
- 从外部函数渲染后更改ReactJS类的状态
- 成功ajax:如果是200状态代码,则运行函数else另一个函数
- 运行函数ifsuccess($.ajax)有200个状态代码
- 在 Redux 状态下存储具有原型函数的对象
- 在异步函数中维护变量的状态
- 限制 .live() 函数在 JavaScript 中变为活动状态的次数
- 我将如何在jQuery中切换setInterval函数的状态
- 为什么javascript slidetoggle函数没有保持打开状态
- 从回调函数获取xhr状态
- 将函数的返回传递到另一个状态
- Javascript:onclick函数工作一次,页面就会恢复到原来的状态
- 获得readyState为4和状态200加上状态文本“0”;OK”;而成功函数仍然没有;我没有接到电话
- 如何在jQuery函数执行's处于活动状态
- 表示改变状态的函数的Redux字
- 当道具函数改变状态时,我该如何使用redux
- 如何跟踪我的状态持续调用函数的次数
- 在AngularJS中切换编辑状态并更改项目'单击另一个函数
- 如何在回调函数中获取 AngularJS 中 $scope 变量的当前状态
- 函数式编程和局部函数状态分配