Англійська для розробників F#

Словник для розробників, що працюють у F# — дискриміновані союзи, оператор трубки, провайдери типів і функціональний перший словник, який команди.NET потребують при переході за межі C#.

F# працює на тому ж середовищі виконання, що і C#, але обговорюється з іншим словником, тому що вона функціональна, а не об’єктно-орієнтована. Команди, що переміщуються між двома мовами, часто за замовчуванням використовують терміни C#, які не відображаються чисто, і саме тут починається більшість неточностей у F#.

Ключовий словник

** Дискримінований союз (DU) ** — тип суми F#, що представляє значення, яке є точно одним з декількох іменованих випадків, кожен з яких може нести свої власні дані, використовується для того, щоб неправильні стани були неможливою для представлення, а не залежати від спадкових ієрархій або нульових полів. “Модельювати результат платежу як дискриміноване об’єднання з Success і Failure випадками замість класу з нульовим полем помилки — тепер компілятор змушує кожного викликача обробляти обидва випадки явно, немає можливості забути про гілочку невдачі.”

** Pipe operator ( |> ) ** — оператор F# forward- pipe, який передає результат виразу як останній аргумент наступній функції, дозволяючи послідовності перетворень читати згори вниз у порядку, в якому вони дійсно відбуваються, а не вкладені зсередини назовні.

  • “Переписати це як конвеєр з оператором конвеєра — data |> filterValid |> sortByDate |> take 10 читає у точному порядку, у якому відбуваються ці перетворення, замість вкладання трьох викликів функцій, які вам слід читати зсередини назовні.” *

** ProviderType** — специфічний для F# механізм під час компіляції, який автоматично створює типи з зовнішнього джерела даних, наприклад, схеми бази даних, зразка JSON або файла CSV, надаючи вам під час компіляції перевірений доступ до цієї зовнішньої форми без написання класів моделі вручну. “Ми не писали ці тридцять класів моделей вручну — провайдер типів створив їх під час компіляції безпосередньо зі схеми JSON, тому якщо форма API змінюється, сама збірка зазнає невдачі замість помилки десеріалізації під час виконання.”

** Вичерпне збігнення шаблонів ** — Компілятор F# перевіряє, чи вираз match покриває кожен випадок дискримінованого об’ єднання, випускає попередження (часто розглядається як помилка), коли відсутній випадок, статично ловить клас помилок, які багато мов ловлять тільки під час виконання, якщо взагалі. “Додати новий Refunded випадок до цього дискримінованого об’єднання, і кожен вираз збігу в кодовому обробнику OrderStatus тепер буде попереджати як неповний, поки він не буде оновлений - це вичерпне збіг шаблонів, що робить саме свою роботу.”

** Обчислювальний вираз ** — синтаксис F# для створення нетипових блоків потоку керування (наприклад, async { } або option { } ), які розділяють цукор на ланцюгові виклики функцій, використовуються для того, щоб монадний або ефективний код читався в імперативному, лінійному стилі. “Цей блок async { } не є спеціальним синтаксисом мови, прикріпленим до асинхронного процесу — це обчислювальний вираз, і той же самий механізм доступний для створення вашого власного потоку керування, як блок result { } для обробки помилок, орієнтованих на залізницю.”

Звичайні фрази

  • Чи це моделюється як дискримінований союз, чи ми відстежуємо стан з класом і деякими необмеженими полями?»
  • Чи буде це читатися більш чітко, як трубопровід, що використовує оператор труби?
  • «Цей тип походить від постачальника типів, або він написаний від руки і може відхилятися від фактичної схеми?»
  • «Чи є цей вираз збігу вичерпним, чи є випадки, коли замінний символ проковтує щось, що ми повинні обробляти явно?»
  • Чи є це обчислювальний вираз, або простий вкладений виклик функції?»

Приклади речення

Пояснення рішення щодо проекту, що переглядається: “Я сформував відповідь API як дискримінований союз з Ok, NotFound, і ServerError випадками замість коду стану плюс нульового тіла — тепер компілятор не дозволить викликаючим забути обробляти випадки помилок.”

Перевірка коду на читабельність:

  • “Це працює, але вкладення п’ яти викликів функцій ускладнює читання згори вниз. Переписати його з оператором трубки так, щоб кожен крок перетворення читався в порядку, в якому він фактично виконується.”*

Пояснення переваги безпеки під час компіляції: “Ми використовуємо провайдер типів проти фактичної схеми виробництва, тому коли колонка була перейменована в останньому спринті, це негайно зазнало невдачі під час компіляції — замість того, щоб зазнавати невдачі беззвучно в написаній від руки моделі, яку ніхто не пам’ятав оновити.”

Професійні поради

  • Досягти ** розрізненого об’єднання ** коли значення може бути справді лише однією з декількох різних форм — це ідіоматична альтернатива F# до успадкування або моделювання нульових полів, і рецензенти очікують цього для моделювання домену.
  • Використовуйте оператор ** pipe ** для визначення будь- якого багатокрокового перетворення — це не просто стилістична річ; конвеєр читає у порядку виконання, що значно скорочує час перегляду у порівнянні з глибоко вкладеними викликами.
  • Віддавати перевагу ** надавателю типів ** перед моделями, написаними від руки, якщо доступна стабільна зовнішня схема — це перетворює дрейф схеми на помилку під час компіляції замість несподіваного результату під час виконання.
  • Ніколи не придушувати попередження про ** вичерпне відповідання шаблону ** за допомогою шаблону, якщо відсутні випадки не слід ігнорувати без мовчання — це рішення, яке варто прийняти і переглянути, а не типове.
  • Досягнення ** обчислювального виразу **, коли ви неодноразово вручну перевертаєте той самий ефективний шаблон потоку керування — це інструмент F# для того, щоб зробити цей шаблон повторюваним і читабельним, а не тільки для асинхронного коду.

Практичні вправи

  1. Пояснити, чому моделювання стану як дискримінованого об’єднання може запобігти помилки недійсного стану.
  2. Описує, яким чином оператор трубки змінює здатність читання багатокрокового перетворення.
  3. Напишіть речення, у якому пояснюється, що робить надавач типів і чому він перехоплює дрейф схеми під час збирання.

На практиці: Навігація нюансів — понад літературний переклад

Для людей, для яких англійська не є рідною мовою, вивчаючи термінологію професійного розвитку, легко застрягти в буквальних перекладах. Основна проблема полягає не просто в розумінні окремих слів; це в розумінні прийнятого значення, тонких очікувань, вбудованих у фрази, що використовуються досвідченими розробниками і менеджерами проектів. Розгляньте поширений запит: «Це потребує переробки». Для не- рідного мовця це може здатися довільною критикою. Однак, на практиці, «рефакторинг» означає більше, ніж просто очищення коду - це говорить про виявлення можливостей для поліпшення дизайну, оптимізації продуктивності або дотримання встановлених стандартів кодування. Це стосується розширення існуючої системи, а не просто виправлення помилок. Аналогічно, такі фрази як «зменшити когнітивне навантаження» часто використовуються для виправдання змін, які можуть здатися незначними на поверхні, але насправді вирішують більшу архітектурну проблему.

Ключова область нерозуміння часто виникає під час перегляду коду. Отримати коментар на кшталт: “Це могло б бути більш коротким”, може здатися неясним і потенційно жорстким. Важливо розуміти, що це не обов’язково судження про * коректність * коду, а скоріше запрошення розглянути альтернативи - можливо, використовуючи більш виразну функцію, або розбиваючи складну операцію на менші, більш керовані кроки. Метою завжди є поліпшення читабельності і підтримки для команди в цілому. Крім того, використання таких термінів, як «надійний» або «стійкий» при обговоренні обробки помилок може бути особливо викликом. Ці слова мають значну вагу в передачі очікувань, що код повинен грациозно обробляти неочікувані ситуації без аварій або пошкодження даних - концепція часто виражена через більш чіткі вимоги, ніж може передбачати прямий переклад.

Ефективне спілкування сильно залежить від контексту і спільного розуміння в команді. Запитання про пояснення * завжди * заохочуються, особливо при зустрічі незнайомої термінології. Не вагайтеся ввічливо запитати пояснення того, що хтось має на увазі під «оптимізація для одночасності» або «розв’ язання технічного боргу». Краще визнати відсутність розуміння, ніж робити припущення, які можуть призвести до помилок або переробки пізніше. Пам’ ятайте, що мета — не просто * писати * код, а ефективно співпрацювати і створювати системи, які зрозумілі і підтримуються іншими.

Ось приклад того, як ці поняття можуть використовуватися під час розмови у Slack, де обговорюється PR:

// This function calculates the Fibonacci sequence recursively.
let rec fibonacci n =
    match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fibonacci (n - 1) + fibonacci (n - 2)

Рецензент може відповісти: «Відчувається добре, але чи можемо ми дослідити використання мемоізації для поліпшення продуктивності для більших значень n? Це в даний час досить неефективне через повторювані обчислення.” Це не просто критика стилю - це пропозиція звернутися до конкретного вузла продуктивності.

Поширені запитання

Про що ця стаття "Англійська для розробників F#"?

Словник для розробників, що працюють у F# — дискриміновані союзи, оператор трубки, провайдери типів і функціональний перший словник, який команди.NET потребують при переході за межі C#.

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "Англійська для розробників F#"?

Приблизно 8 min.