Я старший розвідник, кодуючи 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;
}
Тепер, щоб бути більш перевіреним, я взяв усі ці дані, якщо заяви, і зробив їх окремими, окремими функціями, а потім переглядаю їх.
Тепер тестування - це одне, але це читається, і мені цікаво, чи я роблю тут речі менш читаними.
// 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
}
Ось моя турбота. Для мене дно більш організоване. Сам код розбитий на менші шматки, які можна перевірити ізольовано. Але я думаю: Якби мені довелося прочитати це, як молодший розробник, невикористаний для таких понять, як використання функцій Identity Functors, currying або потрійні заяви, я міг би навіть зрозуміти, що робить останнє рішення? Чи краще іноді робити речі "неправильним, легшим" способом?
Babel ES6