Застосування принципів чистого коду до функціональних мов


16

Я зараз читаю чистий код Роберта Мартіна . Я думаю, що це здорово, і при написанні коду OO я приймаю його уроки по душі. Зокрема, я вважаю, що його порада використовувати невеликі функції зі значущими іменами змушує мій код протікати більш плавно. Найкраще підсумувати цю цитату:

[W] хочемо мати можливість читати програму так, ніби вона є набором пунктів TO, кожен з яких описує поточний рівень абстрагування та посилається на наступні пункти TO на наступному рівні вниз.

( Чистий код , стор. 37: "Абзац" - це абзац, який починається з речення, озвученого в інфінітиві. "Щоб зробити X, ми виконуємо кроки Y і Z". "To Y, we ..." і т.д. ) Наприклад:

ДЛЯ RenderPageWithSetupsAndTeardowns ми перевіряємо, чи є сторінка тестовою сторінкою, і якщо так, то ми включаємо установки та терени. У будь-якому випадку ми візуалізуємо сторінку в HTML

Я також пишу функціональний код для своєї роботи. Приклади Мартіна в книзі, безумовно, читають так, ніби вони є набором абзаців, і вони дуже чіткі - але я не настільки впевнений, що "читання як набір абзаців" є бажаною якістю для функціонального коду. .

Приклад із стандартної бібліотеки Haskell :

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

Це приблизно настільки далеко, наскільки ви можете отримати поради Мартина, але це лаконічний ідіоматичний Хаскелл. На відміну від прикладів Java у його книзі, я не уявляю жодного способу перетворити це на щось, що має вигляд каденції. Я підозрюю, що Хаскелл, написаний до стандарту Чистого кодексу , вийшов би таким, як невдоволений і неприродний.

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


1
Функціональні програмісти прагнуть писати занадто короткий код, це правда. Я б не віддалено вважав це найкращою практикою, навіть у тому середовищі.
Теластин

Пробачте за незнання, але що таке пункт TO?
Шашанк Гупта

4
Як згадувалося в іншому питанні нещодавно, Дайкстра писав про дурість "програмування на природній мові", і я схильний погодитися з ним, що код, який читається як проза, - це трудна мрія. Я думаю, що це особливо вірно в Haskell, який, будучи чистим, символічно виражає рівності між значеннями, а не послідовності кроків для отримання ефектів. Я думаю, що важливим є те, що кодований код є ідіоматичним. Наприклад xs, це неправильне ім'я, але воно є настільки ж поширеним у функціональних мовах, як і iдля змінних циклу.
Doval

@ShashankGupta Я редагував питання із посиланням на конкретну сторінку книги, а також моє власне розуміння того, що написав дядько Боб.

@ShashankGupta Він наводить кілька прикладів, але ідея полягає в тому, що він повинен читатись як проза. "Щоб знайти максимум списку, ви перевіряєте кожен елемент ..."
Патрік Коллінз

Відповіді:


11

Clean Code - це перш за все посібник зі стилів. Стрункі та білі не застосовуються, коли ви пишете в клінгоні. Ідея полягає в тому, що ви хочете зрозуміти програмістам, які, ймовірно, прочитають ваш код. Ви хочете мати модульний модуль і простий для реструктуризації код. Існують способи зробити це в Haskell так само, як є способи зробити це будь-якою іншою мовою, але точні відомості будуть різними.

Як сказано, для Haskell існує ряд рекомендацій щодо стилю . Переповнення стека також має досить вичерпне керівництво . Зберігання логіки кодування простою та короткою здається досить постійною. Підкреслюється також узагальнення функцій, оскільки це призводить до модульності. DRY-код також підкреслюється, як і у Clean Code.

Зрештою, "Чистий код" та інструкції щодо кодування Хаскелла прагнуть того ж самого, але закінчуються своїми дорогами, щоб дістатися туди.


1
Мені здається, що ця відповідь знижує принципи, які викладає Clean Code, які дуже застосовні для різних мов, і це суттєво для заданого питання. Я бачу, чому люди вважають « Чистий код» посібником зі стилів, і я думаю, що це частково правда, але недостатньо правдиво, щоб відхилити всю книгу як одну.
Аллан

Я не вважаю книгу "Чистий код Мартіна" як посібник зі стилю. Я відчуваю, що вчення книги насправді вписується десь між посібником зі стилів та моделями дизайну.
Майкл R

15

Я не впевнений, що я слідую, що ви маєте на увазі своїм прикладом. Абзаци, як він їх описує, не вимагають довготривалості. Він не означає, що код повинен читатись як англійська. Важливою частиною є групування функціональних можливостей на одному рівні абстракції, в логічному прогресуванні. Це теоретична структурна концепція, яка виходить за рамки парадигм програмування.

Висловлений у форматі "Абзац" для Боб Мартіна, я читаю ваш приклад як:

  • Для обчислення maximumByпотрібні функція впорядкування та список, а результат є елементом цього списку.
  • Обчислення maximumByпорожнього списку та будь-якої функції впорядкування є помилкою.
  • Щоб обчислити maximumByсписок xs, ви складете цей список за допомогою maxByфункції.
  • Для обчислення maxByдвох елементів списку ви порівнюєте їх за допомогою заданої функції впорядкування. Якщо перший елемент більший, виберіть його. В іншому випадку виберіть другий.

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

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

Існують способи їх здійснення, які не відповідають вказівкам "ЗО". Якщо відмовитись від явного підпису типу, це опустить речення "огляд" вищого рівня. Ви можете використовувати вираз if для обробки помилок замість відповідності шаблону, що б заплутувало це недоречно з іншим рівнем абстракції. Ви можете вбудувати maxByанонімну функцію замість того, щоб давати їй ім'я, яке може бути описано пізніше більш детально.

Насправді, я думаю, такі конструкції, як whereнасправді, краще підходять для формату абзацу, тому що ви можете використовувати їх, щоб дати ім’я більш глибокій деталі таким чином, який близький тому, як ми виражаємо це англійською мовою, і аналогічно обмежуйте сферу його застосування в чіткий шлях до контексту "абзацу".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.