Javascript — массив функций — это плохая практика

#javascript #arrays #function

#javascript #массивы #функция

Вопрос:

Могу ли я сделать что-то подобное, или это будет плохая практика?

file1.js

 export func1(param) {
 if (valid(param)) return 'valid';
 else return 'invalid'
}

export func2(param) {
 if (valid(param)) return 'valid';
 else return 'invalid'
}
 

file2.js

 import { func1, func2 } from 'file1'

const list = [func1, func2]

function test(value){
    list.forEach((listValue) => {console.log(listValue(value));
 });
} 
 

у меня много входных данных в моем проекте, и я пытаюсь сократить количество кода для их проверки

текущая реализация выглядит так

file1.js

 export validate(type, param){
 switch(type){
   case TYPE1:
     if (valid){
      return 'valid';
     } else {
      return 'invalid';
     }
   case TYPE2:
     if (valid(param.rule)){
      return 'valid';
     } else {
      return 'invalid';
     }
   default:
     break;
}
 

file2.js

 import validate from 'file1.js'

const object = {value: '', types: [
  {type: TYPE1, rule: SOME_RULE}
  {type: TYPE2, rule: SOME_OTHER_RULE}
]}

function validateObject(object) {
  object.types.forEach((type) => 
   {console.log(validate(type.type, {
             value: object.value,
             rule: type.rule}
   ));}
}
 

Комментарии:

1. Я не вижу в этом какой-либо особой проблемы, предполагая, что все функции принимают одинаковое количество параметров и их тип совместим.

2. я вроде как новичок, поэтому мне интересно, могу ли я это сделать. как я предполагаю, параметры могут быть объектами типа {value: «, rule1: «, rule2: » }

Ответ №1:

В JavaScript функция — это гражданин первого класса, особый вид объекта, если быть точным, поэтому иметь массив функций — отличная практика.

Ответ №2:

Лично я не думаю, что это плохая практика. Давайте подумаем о том, чтобы приготовить суп, и у вас есть несколько горшков, которые нужно заполнить.

 var steps = [ addWater, addPotatoes, addSalt, stirContents, cook ];
var pots = [ small_pot, medium_pot, large_pot ];

// if you use a method list here: 
for(pot in pots)
    for(step in steps)
       steps[step].call(this, pots[pot]);

// if you don't use a method list:
for(pot in pots)
{
   addWater(pots[pot]);
   addPotatoes(pots[pot]);
   addSalt(pots[pot]);
   stirContents(pots[pot]);
   cook(pots[pot]);
}
 

если у вас одинаковые входные данные для каждого шага, имеет ли это значение? вы можете добавить еще один шаг к обоим методам.