스택큐힙리스트

일반적인 기능적 원칙을 사용하여 이것을 리팩토링 할 수 있습니까? 본문

카테고리 없음

일반적인 기능적 원칙을 사용하여 이것을 리팩토링 할 수 있습니까?

스택큐힙리스트 2024. 1. 5. 11:37
반응형

비교 함수 ascending은 두 인자인 ab를 받습니다. 이 두 값을 비교하여 정수를 반환해야 합니다.


저는 이름으로 리스트를 정렬하고 싶어서 다음과 같은 함수를 작성했습니다.


byName이 결과 함수를 구성하는 책임을 가지는 대신에 이 두 함수를 결합할 수 있는 함수형 관용구가 있는지 궁금합니다.


const ascending = (a, b) => a.localeCompare(b);
const byName = (i) => i.get('name');
const useTogether = (...fns) => ...; // 이와 같은 관용적인 함수가 있는지 궁금합니다.
// 사용 예시
items.sort(useTogether(byName(ascending)));

답변 1



const Eq =
0
const Lt =
-1
const Gt =
1
const Ord =
{ empty: Eq
, concat: (a,b) =>
a === Eq ? b : a
}
const compare = (a, b) =>
a < b ? Lt
: a > b ? Gt
: Eq
const Comparison = (f = compare) =>
({ compare: f
, contramap : g =>
Comparison ((a, b) => f (g (a), g (b)))
, concat : m =>
Comparison ((a, b) =>
Ord.concat (f (a, b), m.compare (a, b)))
, sort : xs =>
xs.sort (f)
})

const data =
[ { name: 'Alicia', age: 10 }
, { name: 'Alice', age: 15 }
, { name: 'Alice', age: 10 }
, { name: 'Alice', age: 16 }
]
const sortByName =
Comparison ()
.contramap (x => x.name)

const sortByAge =
Comparison ()
.contramap (x => x.age)
sortByName
.concat (sortByAge)
.sort (data)

console.log ('sorted by (name,age)', data)
// Alice 10
// Alice 15
// Alice 16
// Alicia 10
sortByAge
.concat (sortByName)
.sort (data)
console.log ('sorted by (age,name)', data)
// Alice 10
// Alicia 10
// Alice 15
// Alice 16



위의 코드는 HTML의 p 태그를 한국어로 번역한 것이 아니라 자바스크립트 코드입니다. 번역을 도와드릴 거리가 있다면 알려주세요.

더 유용한 정보와 transducers의 소개를 위해 링크된 기사를 읽으세요.

답변 2

제목: 일반적인 함수형 원칙을 활용한 리팩토링: 가능한가?
서론:
요즘 효율적이고 유지보수가 쉬운 코드 작성을 위해 프로그래밍 업계에서는 함수형 프로그래밍의 인기가 높아지고 있습니다. 이러한 개념을 사용하면 코드를 더 간결하고 읽기 쉽게 만들 수 있으며, 재사용 가능한 독립적인 모듈을 만드는 데 도움이 됩니다. 따라서 이번에는 기존 코드가 함수형 원칙을 활용하여 리팩토링될 수 있는지 알아보고자 합니다.
본론:
기존 코드를 분석해보면, 다소 지나친 길이의 함수, 코드 중복, 서로 다른 기능을 수행하는 하나의 함수 등의 문제점이 있습니다. 이러한 문제들은 유지보수가 어렵고 코드를 이해하기 어렵게 만듭니다. 이를 개선하기 위해 함수형 프로그래밍의 일반적인 원칙을 적용하여 코드를 리팩토링할 수 있습니다.
첫째로, 기능을 작은 독립적인 함수로 분리합니다. 각 함수는 입력과 출력만으로 동작하며, 외부 상태에 의존하지 않는 수준으로 만듭니다. 이를 통해 각 함수는 단일 목적을 가지고 있으며, 재사용성이 높아집니다. 이는 향후 유지보수나 확장 시에 유리합니다.
둘째로, 고차 함수와 익명 함수를 사용하여 코드를 더욱 간결하게 만듭니다. 고차 함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수로, 코드의 흐름을 추상화하여 보다 유연한 구조를 가질 수 있습니다. 이를 통해 반복적인 코드를 최소화하고, 코드 중복을 줄입니다.
셋째로, 불변성을 유지하도록 상태를 관리합니다. 이는 부작용(side effect)을 최소화하여 코드의 예측 가능성을 높이는데 도움을 줍니다. 불변 객체를 사용하고, 기존 상태를 변경하는 대신 새로운 객체를 생성하는 방식으로 코드를 작성합니다. 이로써 코드의 품질과 안정성이 향상됩니다.
마지막으로, 재귀 함수를 사용하여 반복적인 로직을 대체합니다. 재귀는 문제의 분할 정복(divide and conquer) 방법에 자연스럽게 부합하며, 코드를 구성하기에 유용합니다. 재귀를 사용하면 복잡한 문제를 단순한 구조로 변환할 수 있습니다.
결론:
함수형 프로그래밍의 일반적인 원칙을 따르며 코드를 리팩토링하면, 코드의 가독성, 재사용성, 유지보수 용이성 등 여러 가지 이점을 얻을 수 있습니다. 작은 독립적인 함수, 고차 함수와 익명 함수, 불변성 유지, 재귀 함수 등의 개념을 적절히 활용하여 함수형 원칙에 따라 코드를 작성하면 더욱 효율적인 개발을 할 수 있을 것입니다. 따라서 함수형 프로그래밍의 원칙을 적용하여 기존 코드를 리팩토링하는 것이 권장됩니다. 이를 통해 더 나은 코드를 작성하고, 유지보수에 용이한 개발 환경을 조성할 수 있습니다.
(SEO: 리팩토링, 함수형 프로그래밍, 일반적인 원칙, 코드, 기능 분리, 고차 함수, 익명 함수, 불변성, 재귀 함수)

반응형
Comments