추상화 및 구성

스모크 아트 큐브 스모크 — MattysFlicks — (CC BY 2.0)
참고 :이 글은 JavaScript ES6 +의 기능 프로그래밍 및 컴포지션 소프트웨어 기술을 처음부터 배우는“소프트웨어 구성”시리즈 (현재 책!)의 일부입니다. 계속 지켜봐 주시기 바랍니다. 앞으로 더 많은 것들이 있습니다!
<이전 | << 1 부에서 다시 시작 | 다음>

소프트웨어 개발이 성숙할수록 기초를 더 중요하게 생각합니다. 초보자 일 때 사소한 것처럼 보였지만 이제는 경험의 이점으로 중대한 의미를 갖습니다.

"가라테의 무술에서 […] 블랙 벨트에 대한 자존심의 상징은 초보 상태로 돌아가는 것을 상징하기 위해 염료가 흰색으로 희미 해 지도록 충분히 길게 착용하는 것입니다."~ John Maeda,“단순함의 법칙 : 디자인, 기술, 비즈니스, 생활”

구글 사전에 따르면, 추상화는“연관, 속성 또는 구체적인 반주와 독립적으로 무언가를 고려하는 과정”입니다.

추상화라는 단어는 라틴어 동사의 절대 어에서 유래합니다. 나는이 통찰을 좋아한다. 추상화는 물건을 제거하는 것에 관한 것입니다. 그러나 우리는 무엇을 제거하고 있습니까?

때로는 단어를 다른 언어로 번역 한 다음 영어로 다시 번역하여 일반적으로 영어로 생각하지 않는 다른 연관 관계를 파악하려고합니다. “추상화”를 이디시어로 번역하면 결과는“결코”입니다. 나도 이것을 좋아한다. 결근 한 사람이 자동 조종 장치를 사용하고 있는데, 현재하고있는 일에 대해 적극적으로 생각하지 않고 그냥하는 것입니다.

추상화를 통해 자동 조종 장치를 안전하게 실행할 수 있습니다. 모든 소프트웨어는 자동화입니다. 충분한 시간이 주어지면 컴퓨터에서 무엇을하든 종이, 잉크 및 캐리어 비둘기로 할 수 있습니다. 소프트웨어는 수동으로하기에는 너무 많은 시간이 걸리는 작은 세부 사항 만 처리합니다.

모든 소프트웨어는 추상화이며, 우리가 혜택을 누리면서 모든 노력과 마음이없는 세부 사항을 숨 깁니다.

많은 소프트웨어 프로세스가 반복해서 반복됩니다. 문제 분해 단계에서 반복되는 항목을 반복해서 다시 구현하기로 결정한 경우 많은 불필요한 작업이 필요합니다. 적어도 어리석은 일입니다. 많은 경우 비현실적입니다.

대신, 우리는 어떤 종류의 컴포넌트 (함수, 모듈, 클래스 등)를 작성하고 이름 (정체성)을 부여하고 원하는만큼 재사용함으로써 중복을 제거합니다.

분해 과정은 추상화 과정입니다. 성공적인 추상화는 결과가 독립적으로 유용하고 재구성 가능한 구성 요소의 집합임을 나타냅니다. 이것으로부터 우리는 소프트웨어 아키텍처의 중요한 원칙을 얻습니다.

내부 솔루션 구현 세부 사항을 변경하지 않고도 소프트웨어 솔루션을 구성 요소로 분해하고 새로운 솔루션으로 재구성 할 수 있어야합니다.

추상화는 단순화의 행위입니다

"단순함은 명백 함을 빼고 의미를 더하는 것입니다."~ John Maeda, "단순함의 법칙 : 디자인, 기술, 비즈니스, 생활"

추상화 과정에는 두 가지 주요 구성 요소가 있습니다.

  • 일반화는 반복되는 패턴에서 유사점 (명확한)을 찾고 추상화 뒤에 유사성을 숨기는 과정입니다.
  • 전문화는 추상화를 사용하는 프로세스로, 각 사용 사례마다 다른 (의미있는) 것만 제공합니다.

추상화는 개념의 기본 본질을 추출하는 프로세스입니다. 서로 다른 도메인의 서로 다른 문제들 사이의 공통점을 탐색함으로써 헤드 스페이스 밖으로 잠시 나가서 다른 관점에서 문제를 보는 방법을 배웁니다. 문제의 본질을 보면 좋은 해결책이 다른 많은 문제에 적용될 수 있음을 알게됩니다. 솔루션을 제대로 코딩하면 애플리케이션의 복잡성을 크게 줄일 수 있습니다.

"심각한 인식으로 한 가지를 만지면 모든 것을 만집니다."~ Thich Nhat Hanh

이 원칙은 응용 프로그램을 작성하는 데 필요한 코드를 크게 줄이는 데 사용할 수 있습니다.

소프트웨어 추상화

소프트웨어 추상화는 여러 형태를 취합니다.

  • 알고리즘
  • 데이터 구조
  • 모듈
  • 수업
  • 프레임 워크

그리고 내 개인적인 마음에 드는 것 :

“때때로 우아한 구현은 단지 기능 일뿐입니다. 방법이 아닙니다. 수업이 아닙니다. 프레임 워크가 아닙니다. 그저 기능 일뿐입니다.”~ John Carmack (Id 소프트웨어, Oculus VR)

함수는 좋은 추상화에 필수적인 특성을 가지고 있기 때문에 위대한 추상화를 만듭니다.

  • 신원 — 이름을 지정하고 다른 상황에서 재사용 할 수있는 기능.
  • 구성 —보다 복잡한 기능을 형성하기 위해 간단한 기능을 구성하는 기능.

구성을 통한 추상화

소프트웨어 추상화에 가장 유용한 기능은 수학 기능과 모듈 특성을 공유하는 순수한 기능입니다. 수학에서 동일한 입력이 주어진 함수는 항상 동일한 출력을 반환합니다. 기능을 입력과 출력 간의 관계로 볼 수 있습니다. 일부 입력 A가 주어지면 함수 f는 B를 출력으로 생성합니다. f가 A와 B의 관계를 정의한다고 말할 수 있습니다.

f : A-> B

마찬가지로 B와 C의 관계를 정의하는 다른 함수 g를 정의 할 수 있습니다.

g : B-> C

이것은 A에서 C로 직접 관계를 정의하는 다른 함수 h를 의미합니다.

h : A-> C

이러한 관계는 문제점 공간의 구조를 형성하며 응용 프로그램에서 함수를 구성하는 방법은 응용 프로그램의 구조를 형성합니다.

좋은 추상화는 h를 사용하여 A-> B-> C를 A-> C로 줄이는 것과 같이 구조를 숨겨서 단순화합니다.

적은 코드로 더 많은 것을하는 방법

적은 코드로 더 많은 작업을 수행하려면 추상화가 핵심입니다. 예를 들어, 단순히 두 개의 숫자를 더하는 함수가 있다고 상상해보십시오.

const add = (a, b) => a + b;

그러나 자주 사용하여 증가 시키므로 해당 숫자 중 하나를 수정하는 것이 좋습니다.

const a = add (1, 1);
const b = add (a, 1);
const c = add (b, 1);
// ...

add 함수를 카레 할 수 있습니다 :

const add = a => b => a + b;

그런 다음 함수를 첫 번째 인수에 적용하고 다음 인수를 취하는 새 함수를 반환하는 부분 응용 프로그램을 만듭니다.

const inc = add (1);

이제 1 씩 증가해야 할 때 add 대신 inc를 사용할 수 있으므로 필요한 코드가 줄어 듭니다.

const a = inc (1);
const b = inc (a);
const c = inc (b);
// ...

이 경우 inc는 특별한 버전의 add입니다. 모든 카레 기능은 추상화입니다. 실제로 모든 고차 함수는 하나 이상의 인수를 전달하여 전문화 할 수있는 일반화입니다.

예를 들어 Array.prototype.map ()은 처리 된 값의 새 배열을 반환하기 위해 배열의 각 요소에 함수를 적용한다는 아이디어를 추상화하는 고차 함수입니다. 이를보다 분명하게하기 위해 맵을 카레 함수로 작성할 수 있습니다.

const map = f => arr => arr.map (f);

이 버전의 맵은 특수화 기능을 수행 한 다음 배열을 처리하는 특수화 된 버전의 자체를 리턴합니다.

const f = n => n * 2;
const doubleAll = 맵 (f);
const doubled = doubleAll ([1, 2, 3]);
// => [2, 4, 6]

doubleAll의 정의에는 사소한 양의 코드가 필요했습니다. map (f)-그게 전부입니다! 이것이 전체 정의입니다. 빌딩 블록으로 유용한 추상화로 시작하여 아주 작은 코드로 상당히 복잡한 동작을 구성 할 수 있습니다.

결론

소프트웨어 개발자는 추상화 나 구성에 대한 기본적인 이해없이 많은 부분을 추상화하고 작성하는 데 전체 경력을 씁니다.

추상화를 만들 때는 신중하게 고려해야하며 이미 유용한 유용한 추상화 (항상 유용한 맵, 필터링 및 축소)를 알고 있어야합니다. 좋은 추상화의 특성을 인식하는 법을 배우십시오.

  • 단순한
  • 간결한
  • 재사용 가능
  • 독립적
  • 분해 가능
  • 재구성 가능

EricElliottJS.com에서 자세히 알아보기

기능 프로그래밍에 대한 비디오 강의는 EricElliottJS.com 회원에게 제공됩니다. 회원이 아닌 경우 오늘 가입하십시오.

Eric Elliott는“Programming JavaScript Applications”(O'Reilly)의 저자이자 소프트웨어 멘토십 플랫폼 DevAnywhere.io의 공동 설립자입니다. 그는 Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC 및 Usher, Frank Ocean, Metallica 등을 포함한 최고의 레코딩 아티스트를위한 소프트웨어 경험에 기여했습니다.

그는 세계에서 가장 아름다운 여성과 어디에서나 원격으로 일합니다.