Абстракция и състав

Димни арт кубчета за пушене - MattysFlicks - (CC BY 2.0)
Забележка: Това е част от поредицата „Compose Software“ (сега книга!) За изучаване на функционални програми и техники за композиционен софтуер в JavaScript ES6 + от самото начало. Продължавайте да се настройвате. Има много повече от това, което предстои!
<Предишна | << Започнете отначало в част 1 | Напред>

Колкото повече зрея в разработката на софтуер, толкова повече ценя основите - прозрения, които изглеждаха тривиални, когато бях начинаещ, но сега имат дълбоко значение с ползата от опита.

„В бойното изкуство на карате […] символът на гордост за черен колан е да го носи достатъчно дълго, така че багрилото да избледнее до бяло, за да символизира връщането в състояние на начинаещи.“ ~ Джон Маеда, „Законите на простотата : Дизайн, технологии, бизнес, живот ”

Абстракцията е „процесът на разглеждане на нещо независимо от неговите асоциации, атрибути или конкретни съпътствания“, според речника на Google.

Думата абстракция идва от латинския глагол abstrahere, което означава „да се изтегля“. Харесва ми това прозрение. Абстракцията е за премахване на нещата - но какво премахваме и в каква цел?

Понякога обичам да превеждам думи на други езици и след това да ги превеждам обратно на английски, за да придобия представа за други асоциации, за които обикновено не мислим на английски. Когато преведа „абстракция“ на идиш и обратно, резултатът е „разсеян“. Това също ми харесва. Разсеяният човек работи с автопилот, не мисли активно какво прави ... просто го прави.

Абстракцията ни позволява да работим безопасно с автопилот. Целият софтуер е автоматизация. Като имате достатъчно време, всичко, което правите на компютър, бихте могли да направите с хартия, мастило и гълъби. Софтуерът просто се грижи за всички малки детайли, които биха отнели много време да се правят ръчно.

Целият софтуер е абстракция, крие всички упорита работа и безсмислени детайли, докато използваме предимствата.

Много софтуерни процеси се повтарят отново и отново. Ако по време на етапа на разлагане на проблема решихме да применяме отново и отново, това ще изисква много ненужна работа. Най-малко би било глупаво. В много случаи би било непрактично.

Вместо това премахваме дублирането, като пишем някакъв компонент (функция, модул, клас и т.н.), даваме му име (идентичност) и го използваме толкова пъти, колкото ни харесва.

Процесът на разлагане е процес на абстракция. Успешната абстракция предполага, че резултатът е набор от независимо полезни и рекомпонируеми компоненти. От това получаваме важен принцип на софтуерната архитектура:

Софтуерните решения трябва да бъдат разлагаеми в техните компоненти и да бъдат преизползвани в нови решения, без да променят детайлите за внедряване на вътрешните компоненти.

Абстракцията е актът на опростяване

"Простотата е за изваждане на очевидното и добавяне на смисленото." ~ Джон Майда, "Законите на простотата: дизайн, технологии, бизнес, живот"

Процесът на абстракция има два основни компонента:

  • Обобщаването е процесът на намиране на прилики (очевидното) в многократните модели и скриване на приликите зад абстракция.
  • Специализацията е процесът на използване на абстракцията, като се доставя само онова, което е различно (смисленото) за всеки случай на употреба.

Абстракцията е процесът на извличане на основната същност на едно понятие. Изследвайки общото между различните проблеми от различни домейни, ние се научаваме как да стъпим извън нашето пространство за миг и да видим проблем от различна гледна точка. Когато видим същността на даден проблем, откриваме, че доброто решение може да се прилага за много други проблеми. Ако кодираме добре решението, можем радикално да намалим сложността на нашето приложение.

„Ако докоснете едно нещо с дълбоко осъзнаване, докосвате всичко.“ ~ Thich Nhat Hanh

Този принцип може да се използва за радикално намаляване на кода, необходим за изграждане на приложение.

Абстракция в софтуера

Абстракцията в софтуера има много форми:

  • алгоритми
  • Структури на данни
  • модули
  • класове
  • Рамки

И моят личен фаворит:

„Понякога елегантното изпълнение е просто функция. Не е метод. Не клас. Не рамка. Просто функция. ”~ Джон Кармак (Id софтуер, Oculus VR)

Функциите правят големи абстракции, защото притежават качествата, които са от съществено значение за добрата абстракция:

  • Идентичност - Способността да му присвоите име и да го използвате повторно в различни контексти.
  • Състав - способността да се съставят прости функции за формиране на по-сложни функции.

Абстракция чрез композиция

Най-полезните функции за абстракция в софтуера са чисти функции, които споделят модулни характеристики с функции от математиката. При математиката функция, даваща едни и същи входове, винаги ще връща един и същ изход. Възможно е функциите да се разглеждат като отношения между входове и изходи. Като се има предвид някакъв вход A, функция f ще генерира B като изход. Може да се каже, че f определя връзка между А и Б:

f: A -> B

По същия начин бихме могли да дефинираме друга функция, g, която определя връзка между B и C:

g: B -> C

Това предполага друга функция h, която определя връзка директно от A до C:

h: A -> C

Тези взаимоотношения формират структурата на проблемното пространство и начинът, по който съставяте функции в приложението си, формира структурата на вашето приложение.

Добрите абстракции опростяват чрез скриване на структурата, по същия начин h намалява A -> B -> C до A -> C.

Как да направите повече с по-малко код

Абстракцията е ключът към постигането на повече неща с по-малко код. Например, представете си, че имате функция, която просто добавя две числа:

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

Но го използвате често за увеличаване, може да има смисъл да коригирате едно от тези числа:

const a = добавяне (1, 1);
const b = добавяне (a, 1);
const c = добавяне (b, 1);
// ...

Можем да изкривим функцията за добавяне:

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

След това създайте частично приложение, като приложите функцията към първия си аргумент и върнете нова функция, която приема следващия аргумент:

const inc = добавяне (1);

Сега можем да използваме inc, вместо да добавяме, когато трябва да увеличим с 1, което намалява необходимия код:

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 удвоено = doubleAll ([1, 2, 3]);
// => [2, 4, 6]

Обърнете внимание, че дефиницията на doubleAll изискваше тривиално количество код: map (f) - това е всичко! Това е цялото определение. Започвайки с полезните абстракции като нашите градивни елементи, можем да изградим доста сложно поведение с много малко нов код.

заключение

Софтуерните разработчици прекарват цялата си кариера в създаване и съставяне на абстракции - мнозина без добра фундаментална представа за абстракция или композиция.

Когато създавате абстракции, трябва да сте съзнателно за това и трябва да сте наясно с добрите абстракции, които вече са ви предоставени (като винаги полезната карта, филтриране и намаляване). Научете се да разпознавате характеристиките на добрите абстракции:

  • прост
  • сбит
  • за многократна употреба
  • независим
  • разградими
  • Recomposable

Научете повече на EricElliottJS.com

Видео уроци по функционално програмиране са достъпни за членове на EricElliottJS.com. Ако не сте член, регистрирайте се днес.

Ерик Елиът е автор на „Програмиране на JavaScript приложения“ (O’Reilly) и съосновател на платформата за наставничество на софтуер, DevAnywhere.io. Той е допринесъл за софтуерни преживявания за Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC и най-добрите звукозаписни артисти, включително Usher, Frank Ocean, Metallica и много други.

Той работи отдалечено отвсякъде с най-красивата жена в света.