FP에서 클래스를 함수로 어떻게 변환합니까?
4129 단어 advicediscussfunctionalquestion
소개
모두 안녕.
저는 최근에 객체 지향 프로그래밍(OOP)과 기능 프로그래밍(FP)에 대해 많이 읽었습니다. 질문이 있고 대화를 진행하기 위해 공유할 몇 가지 아이디어가 있습니다.
각 접근 방식의 이점과 일반적인 코드를 알고 있습니다. 더 많은 FP로 이동하여 코드를 더 모듈화하고 테스트 및 디버그하기 쉽게 만들고 싶습니다. 방법에 대한 조언이 필요합니다.
의문
내가 당신에게 가지고있는 질문은 메소드가있는 클래스로 가지고있는 코드를 어떻게 함수로 다시 작성합니까? 현재 프로젝트와 OOP를 사용하고 싶지만 FP를 사용하기로 선택한 모든 새 프로젝트의 경우.
클래스 없이 모든 기능을 사용하여 코드를 설정하는 방법 - 기술적으로 좋아 보이지만 대규모 프로젝트에 적용할 때를 포함하여 자연스럽고 매끄럽고 DRY한 느낌을 주는 방법입니다.
내 프로젝트 중 하나에는 초기화 시 일부 변수를 사용하는 클래스가 있고 개체의 초기 값을 사용하고 때로는 더 많은 인수를 사용하여 무언가를 반환하는 일부 메서드가 있습니다.
내 아이디어
다음은 인스턴스를 설정하기 위해 OOP에서 호출을 수행한 다음 클래스의 값에 주어진 양을 추가하는 메서드를 호출하는 방법입니다.
foo = 1
bar = 2
myObj = new MyClass(foo, bar)
myObj.add(100)
myObj.foo
// 101
많은 함수 인수
init/constructor 메소드에서 인수를 가져와서 각 함수의 첫 번째 인수로 만들어야 합니까? 이에 대해 내가 본 주장은 코드가 장황해진다는 것입니다. 특히 여러 호출로 인수를 전달하려는 경우 최상위 함수가 모든 것을 가져와야 하는 경우에 그렇습니다.
foo = 1
bar = 2
add(foo, bar, 100)
// Returns [1, 2]
키-값 쌍 전달
FP 접근 방식에서 함수의 첫 번째 인수가 사전/해시/연관 배열과 같은 객체인 또 다른 아이디어가 있었습니다. 따라서 각 함수에 동일한 인수 묶음을 전달하는 대신 해당 값으로 객체를 만든 다음 단일 매개변수로 함수에 전달합니다.
예를 들어
x = {foo: 1, bar: 2}
add(x, 100)
// Returns {foo: 101, bar: 102}
유형을 사용하십시오
TypeScript에서는 인터페이스를 사용할 수도 있으므로 예상되는 키-값 쌍이 있으면 컴파일러가 실행되기만 하면 들어오는 개체가 연관 배열인지 클래스 인스턴스인지는 중요하지 않습니다. 다른 언어 Haskell의 유형이나 구조체에 대해 비슷한 내용을 읽었습니다. 여기서 전달하는 개체에 필요한 키가 있다는 것을 컴파일 시간에 보장합니다.
예를 들어
interface myType = {
foo: Integer,
bar; Integer
}
그러면 함수
add
는 인터페이스x
의 구조와 일치하는 경우에만 인수myType
를 수락합니다. 아니면 오히려 유형입니다.나쁜 생각
나는 피해야 할 몇 가지 접근 방식을 생각했습니다.
함수에서 마술처럼 호출되는 전역 변수를 사용합니다.
또는 함수를 사용하여 내부 함수를 정의합니다(JavaScript에서 일반적입니다. 아마도
class
키워드가 JS에 매우 늦게 왔기 때문일 수 있습니다). 외부 함수를 먼저 호출하지 않고 내부 함수를 사용할 수 없기 때문에 이 스타일이 싫습니다. 그래서 클래스와 메서드와 비슷하지만 상태 및 단위 테스트에 더 혼란스럽습니다.결론
당신의 생각을 저에게 말 해주세요. 참고로 제 배경은 Python과 JavaScript입니다.
감사.
학점
Unsplash의 @hishahadat 표지 이미지.
Reference
이 문제에 관하여(FP에서 클래스를 함수로 어떻게 변환합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/michaelcurrin/how-do-you-convert-an-class-to-functions-3ndj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)