Я старший разработчик, кодирую в Babel ES6. Часть нашего приложения выполняет вызов API, и в зависимости от модели данных, которую мы получаем от вызова API, необходимо заполнить определенные формы.
Эти формы хранятся в двусвязном списке (если серверная часть говорит, что некоторые данные недействительны, мы можем быстро вернуть пользователя на одну страницу, которую они испортили, а затем вернуть их на целевую страницу, просто изменив список.)
Во всяком случае, есть несколько функций, используемых для добавления страниц, и мне интересно, если я слишком умный. Это просто базовый обзор - фактический алгоритм намного сложнее, с множеством разных страниц и типов страниц, но это даст вам пример.
Вот как, я думаю, начинающий программист справится с этим.
export const addPages = (apiData) => {
let pagesList = new PagesList();
if(apiData.pages.foo){
pagesList.add('foo', apiData.pages.foo){
}
if (apiData.pages.arrayOfBars){
let bars = apiData.pages.arrayOfBars;
bars.forEach((bar) => {
pagesList.add(bar.name, bar.data);
})
}
if (apiData.pages.customBazes) {
let bazes = apiData.pages.customBazes;
bazes.forEach((baz) => {
pagesList.add(customBazParser(baz));
})
}
return pagesList;
}
Теперь, чтобы быть более тестируемым, я взял все эти операторы if и разделил их, отдельные функции, а затем сопоставил их.
Теперь, тестируемый - это одно, но он читабелен, и мне интересно, я делаю вещи менее читабельными здесь.
// file: '../util/functor.js'
export const Identity = (x) => ({
value: x,
map: (f) => Identity(f(x)),
})
// file 'addPages.js'
import { Identity } from '../util/functor';
export const parseFoo = (data) => (list) => {
list.add('foo', data);
}
export const parseBar = (data) => (list) => {
data.forEach((bar) => {
list.add(bar.name, bar.data)
});
return list;
}
export const parseBaz = (data) => (list) => {
data.forEach((baz) => {
list.add(customBazParser(baz));
})
return list;
}
export const addPages = (apiData) => {
let pagesList = new PagesList();
let { foo, arrayOfBars: bars, customBazes: bazes } = apiData.pages;
let pages = Identity(pagesList);
return pages.map(foo ? parseFoo(foo) : x => x)
.map(bars ? parseBar(bars) : x => x)
.map(bazes ? parseBaz(bazes) : x => x)
.value
}
Вот моя забота. Для меня дно более организовано. Сам код разбит на более мелкие куски, которые можно тестировать изолированно. НО я думаю: если бы мне пришлось читать это как начинающий разработчик, не привыкший к таким понятиям, как использование функторов идентификации, карри или троичных выражений, смог бы я понять, что делает последнее решение? Лучше ли иногда делать вещи «неправильно, проще»?
Babel ES6