새로운 코딩 패러다임을 찾고 있습니다.
18453 단어 functionalcontrolflowcomposition
If there's anything out there similar to this idea, please let me know. I'd love to learn what's out there.
이를 설명하기 위한 몇 가지 방법은 다음과 같습니다.
몇 달 전에 모듈
profound
을 만들었는데 현재 고장났지만 demo code on repl.it 으로 놀 수 있습니다.import { placeholder, profound } from '@reggi/profound'
const alpha = profound({}, ({ }) => 'hello world I\'m a profound')
// console.log(alpha()) // hello world I\'m a profound
const beta = profound({ alpha }, ({ alpha }) => `I am using alpha as a dependency (${alpha})`)
// console.log(beta()) // I am using alpha as a dependency (hello world I'm a profound)
const gamma = profound({ alpha, beta }, ({ alpha, beta }) => `
Gamma needs alpha and beta to run.
Rather than being very redundant and running both in here. They are fetched for use.
If you pass alpha or beta into gamma, they are not run.
This function also takes any arguments that alpha, or beta need.
Profounds become async:
1. If their dependencies are async and are being run (input dependent)
2. If this callback is async
(${alpha} ${beta})
`)
const age = placeholder<number>()('age')
const delta = profound({ age, gamma }, ({ age, gamma }) => gamma.length + age)
console.log(delta({ age: 30 })) // 514
처음에는 여기에서 무슨 일이 일어나고 있는지 명확하지 않을 수 있으므로 안내해 드리겠습니다.
profound
의 결과는 함수입니다. profound
에는 두 개의 인수가 있습니다. 하나는 종속 함수 목록이고 다른 하나는 콜백입니다. 콜백 서명은 (args) => result
이며, 여기서 args는 종속성의 결과를 매핑하는 객체입니다. placeholder
는 함수에서 파생될 수 없고 사용자가 입력해야 하는 항목에 대한 스텁입니다. 간단히 말해서, deep은 키가 있는 개체를 사용하여 값을 저장하고 결과를 전달하는 확인자입니다. 종속성을 명시적으로 실행하는 대신 종속성을 "탭"합니다.
이를 통해 기능을 "구성"할 수 있습니다.
어떻게든 TypeScript와 함께 작동하는 이 접근 방식을 마술처럼 얻었으므로 출력된 함수에 대한 인수가 "컴파일"되고 "종속"함수 트리가 포함됩니다.
정말 긴 사슬을 만들고 어떤 일이 일어날지 보고 이것을 한계까지 밀어붙이려 했고, 고장났습니다. TypeScript 오류로 이어지는:
Type instantiation is excessively deep and possibly infinite.
이 오류가 발생하지 않도록 방지하는 방법을 찾기 위해 StackOverflow issue 작성했습니다.
import {profound} from './profound';
export const example0 = profound({}, () => 'anything');
export const example1 = profound({example0}, () => 'anything');
export const example2 = profound({example1}, () => 'anything');
export const example3 = profound({example2}, () => 'anything');
export const example4 = profound({example3}, () => 'anything');
export const example5 = profound({example4}, () => 'anything');
export const example6 = profound({example5}, () => 'anything');
export const example7 = profound({example6}, () => 'anything');
export const example8 = profound({example7}, () => 'anything');
export const example9 = profound({example8}, () => 'anything');
export const example10 = profound({example9}, () => 'anything');
export const example11 = profound({example10}, () => 'anything');
export const example12 = profound({example11}, () => 'anything');
export const example13 = profound({example12}, () => 'anything');
export const example14 = profound({example13}, () => 'anything');
export const example15 = profound({example14}, () => 'anything');
export const example16 = profound({example12, example13, example14, example15}, () => 'anything');
export const example17 = profound({example16, example13, example14, example15}, () => 'anything');
수많은 반복적인 코드가 아닌 빌딩 블록처럼 느껴지도록 하는 방식으로 코드를 작성할 수 있다는 느낌을 받고 싶습니다.
내가 방지하려는 것은 다음과 같은 코드입니다.
function alpha (a) {
return a
}
function beta (a, b) {
return alpha(a) + b
}
function gamma (a, b, c) {
return alpha(a) + beta(b) + c
}
어리석은 것처럼 보일 수 있지만 많이 발생하는 것 같습니다.
다음은 보다 실제적인 예입니다.
function validateEmail (email) {
return email
}
async getDomain (email) {
// ignore details
return 'gmail.com'
}
// what should the arguments to this be?
async sendMessageFromEmail (email) {
const domain = getDomain(email)
if (domain == 'gmail.com') return 'sentEmail'
return null
}
//or
async sendMessageFromEmailWithDomain (email, domain) {
if (domain == 'gmail.com') return 'sentEmail'
return null
}
// or a hybrid
async sendMessage (email, domain?) {
domain = domain ?? getDomain(email)
if (domain == 'gmail.com') return 'sentEmail'
return null
}
여기
sendMessage
에 몇 가지 순열이 있는 것을 볼 수 있습니다. 이것은 멍청한 예이지만 많은 코드에서 볼 수 있는 것을 발생시킵니다.결론적으로
이런 종류의 패턴과 위의 경우를 처리하는 다른 방법에 대한 생각을 듣고 싶습니다. 아래에 의견을 남기거나 트위터에 문의하세요. 읽어 주셔서 감사합니다!
Reference
이 문제에 관하여(새로운 코딩 패러다임을 찾고 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/reggi/i-m-looking-for-a-new-coding-paradigm-4lf9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)