>  기사  >  웹 프론트엔드  >  Javascript 함수형 프로그래밍의 GRASP

Javascript 함수형 프로그래밍의 GRASP

PHPz
PHPz원래의
2024-08-14 10:42:51393검색

GRASP in Javascript functional programming

소프트웨어 개발 세계에서 디자인 패턴은 오랜 세월에 걸쳐 검증된 일반적인 문제에 대한 솔루션 역할을 합니다.
덜 일반적으로 논의되지만 똑같이 중요한 디자인 패턴 세트 중 하나는 GRASP(General Responsibility Assignment Software Patterns)입니다. GRASP의 원칙은 종종 SOLID 원칙 및 기타 OOP 디자인 패턴과 관련이 있습니다.
GRASP(General Responsibility Assignment Software Patterns)는 객체 지향 설계에서 클래스와 객체에 책임을 할당하기 위한 지침 모음입니다. Javascript(Node.js) 개발에서 이러한 패턴을 어떻게 사용할 수 있습니까? 물론 Javascript는 기본적으로 프로토타입을 기반으로 구축된 클래스를 지원하므로 Java에서와 유사한 방식으로 GRASP를 적용할 수 있습니다.
하지만 제 생각에는 GRASP 패턴은 함수형 프로그래밍에도 적용될 수 있습니다.

그라스프란 무엇인가요?

9가지 GRASP 패턴은 다음과 같습니다.

  1. 정보전문가
  2. 크리에이터
  3. 컨트롤러
  4. 낮은 결합
  5. 높은 응집력
  6. 다형성
  7. 순수 가공
  8. 간접
  9. 보호된 변형

정보 전문가

작업을 수행하는 데 필요한 데이터나 지식을 갖춘 기능에 책임을 할당합니다. 함수형 프로그래밍에서는 작업을 수행하는 데 필요한 데이터나 컨텍스트가 있는 함수나 모듈에 책임을 할당하여 이 원칙을 적용할 수 있습니다.

// User management module
const createUser = (name, email) => ({ name, email });

const getUserEmail = (user) => user.email;

const updateUserEmail = (user, newEmail) => ({
  ...user,
  email: newEmail,
});

const user = createUser('John Doe', 'john@example.com');
console.log(getUserEmail(user));  // 'john@example.com'

const updatedUser = updateUserEmail(user, 'john.doe@example.com');
console.log(getUserEmail(updatedUser));  // 'john.doe@example.com'

창조자

팩토리 함수를 사용하여 복잡한 데이터 구조나 개체를 만듭니다. 함수형 프로그래밍에서는 객체지향 프로그래밍과 같은 방식으로 클래스를 다루지는 않지만 필요한 정보가 있는 함수나 모듈에 데이터 구조를 생성하거나 객체를 초기화하는 책임을 할당하여 생성자 원칙을 적용할 수 있습니다. 맥락.

const createUser = (name, email) => ({ name, email });

제어 장치

고차 함수를 사용하여 시스템 이벤트를 처리하고 작업을 위임합니다. 함수형 프로그래밍에서 컨트롤러는 시스템의 여러 부분 간의 데이터 및 작업 흐름을 조율하여 책임을 명확하게 분리하는 기능 형태를 취하는 경우가 많습니다.

// Example of express.js controller
const handleRequest = (req, res, userService) => {
  const user = userService.createUser(req.body.name, req.body.email);
  res.send(user);
};

낮은 결합

기능이 독립적이고 명시적인 입력에만 의존하는지 확인하세요. 함수형 프로그래밍에서는 다른 함수나 모듈의 내부 세부 사항에 대한 의존도를 최소화하면서 서로 독립적으로 작동하는 함수와 모듈을 설계함으로써 낮은 결합도를 달성합니다

const sendEmail = (emailService, email) => emailService.send(email);

높은 응집력

높은 응집력은 모듈이나 기능 내의 요소가 서로 속하는 정도를 나타냅니다. 함수형 프로그래밍에서 높은 응집력을 달성한다는 것은 잘 정의된 단일 작업 또는 밀접하게 관련된 작업 집합을 수행하도록 함수와 모듈을 설계하는 것을 의미합니다.

const createUser = (name, email) => ({ name, email });
const addUser = (users, user) => [...users, user];

const createAndAddUser = (users, name, email)=>{
  const user = createUser(name, email);
  return addUser(users, user)
}
// usage
const users = [
  { name: 'Alice', email: 'alice@example.com' },
  { name: 'Bob', email: 'bob@example.com' },
];

const newUsers = createAndAddUser(users, 'Charlie', 'charlie@example.com');

다형성

다형성을 달성하려면 고차 함수와 일급 함수를 사용하세요. 함수형 프로그래밍에서 다형성은 일반적으로 고차 함수, 일반 함수 및 Typescript와 같은 유형 시스템을 통해 달성됩니다

const processPayment = (paymentMethod) => paymentMethod.process();

순수 제작

도메인 개념에 직접적으로 대응하지는 않지만 적합한 도메인 함수나 클래스가 없을 때 필요한 기능을 제공하는 유틸리티 함수를 만듭니다.

const log = (message) => console.log(message);

우회

함수형 프로그래밍의 간접이란 중간 함수를 사용하여 시스템의 여러 부분 간의 상호 작용을 관리하는 것을 의미합니다. Node.js의 좋은 예는 미들웨어 패턴입니다.

const withNumberFilterMiddleware = (data) => data.filter(item => !isNaN(Number(item)));

보호된 변형

함수형 프로그래밍에서 변형 보호란 다양한 부분을 캡슐화하고 시스템의 나머지 부분을 이러한 변형으로부터 보호하여 변경에 탄력적인 디자인을 만드는 것을 의미합니다. 함수형 프로그래밍에서는 추상화, 불변성 및 캡슐화를 사용하여 이 원칙을 적용하여 변경에 덜 영향을 받는 강력하고 유지 관리 가능한 코드를 만들 수 있습니다.

const processCreditCardPayment = (amount) => {
  console.log(`Processing credit card payment of ${amount}`);
  // Credit card payment logic
};

const processPayPalPayment = (amount) => {
  console.log(`Processing PayPal payment of ${amount}`);
  // PayPal payment logic
};

const processPayment = (paymentMethod, amount) => {
  paymentMethod(amount);
};

// Use different payment methods without changing the processPayment function
processPayment(processCreditCardPayment, 100);
processPayment(processPayPalPayment, 200);

요약

보시다시피 GRASP 원칙은 SOLID 원칙뿐만 아니라 알려진 많은 디자인 패턴과 상관관계가 있습니다. 높은 응집력은 단일 책임 원칙 등과 거의 동일합니다.
이러한 원칙은 OOP 원칙일 뿐만 아니라 기능적 프로그래밍이든 OOP 프로그래밍이든 잘 설계된 깔끔한 코드를 프로그래밍하기 위한 일반적인 원칙입니다.

위 내용은 Javascript 함수형 프로그래밍의 GRASP의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.