Всегда ли простота улучшает читабельность?
Я бы сказал, может быть, с небольшим количеством противоречий, абсолютно нет .
Вы можете передать мне класс с 200 функциями-членами в его общедоступном интерфейсе, и это может быть самый понятный общедоступный интерфейс. Это может быть радостью, просто случайно прочитав такой код и его документацию. Однако я бы не назвал это «простым», потому что, несмотря на читабельность, мне пришлось бы задуматься о том, как все эти функции взаимодействуют друг с другом, и потенциально остерегаться хитрых крайних случаев, возникающих в результате неправильного использования.
Я бы предпочел класс с 20 функциями-членами, которые было не так легко прочитать до 200, потому что «читаемость» не является для меня главным приоритетом в плане предотвращения человеческих ошибок и повышения удобства сопровождения кода (легкость, с которой мы можем изменить это, т.е.
Тем не менее, все это будет зависеть от нашего личного определения «простоты». «Читаемость» , как правило , не меняется , что дико среди нас, если кто - то приобрел так много опыта и беглость , что они считают регулярное выражение очень «читаемым», например, забывая остальное нас простых смертных.
Простота
Давным-давно было время, когда я думал, что «простота» означает «как можно проще читать». Поэтому я написал бы код на языке C с множеством вспомогательных функций, пытаясь улучшить синтаксис и сделать вещи максимально удобными для чтения и записи.
В результате я разработал очень большие, богатые высокоуровневые библиотеки, пытаясь смоделировать функцию для каждой естественной человеческой мысли: помощники на помощниках на помощниках, и все, чтобы придать клиентскому коду более читаемый синтаксис. Код, который я написал тогда, возможно, был самым «читаемым», но также он был самым «не поддерживаемым» и «сложным».
шепелявость
Тем не менее, у меня была небольшая страсть к LISP в середине 90-х (опоздавший). Это изменило всю мою идею "простоты".
LISP не самый читаемый язык. Надеюсь, никто не думает, что извлечение CDR и CAR при вызове рекурсивной функции с множеством вложенных скобок очень «читабельно».
Тем не менее, изо всех сил пытаясь обернуть мой мозг вокруг странного синтаксиса языка и полностью рекурсивных способов выполнения вещей, это навсегда изменило мое представление о простоте.
Что я обнаружил в коде, который я написал в LISP, так это в том, что я больше не совершал тонких ошибок, даже несмотря на то, что из-за сложного мышления я совершал более вопиющие ошибки (но их легко обнаружить и исправить). Я не ошибаюсь в понимании того, что делает функция, и упускаю тонкий, неожиданный побочный эффект. Мне просто было легче вообще вносить изменения и писать правильные программы.
После LISP для меня стала простотой минимализм, симметрия, гибкость, меньше побочных эффектов, меньше, но более гибких функций, которые объединяются в бесконечном разнообразии способов.
Я пришел к выводу, что самый надежный код из всех - это код, который не существует. Хотя это только грубая метрика, я склонен видеть потенциал ненадежности кода в зависимости от его количества. Стремление к максимальному синтаксическому удобству и удобочитаемости приводит к значительному увеличению этого количества.
Минимализм
Со встроенным в меня мышлением LISP я стал предпочитать минималистские API. Я бы предпочел библиотеку с меньшим количеством, но более надежных, гибких функций, которые менее удобны, а потенциальность сложнее для чтения, чем библиотека, которая предлагает множество «удобных» помощников и таких, которые могут сделать код легким для «чтения», но потенциально могут сработать больше проблем с ненадежностью и неожиданностями, которые возникают из-за неправильного понимания того, что делает одна из этих тысяч функций.
безопасности
Еще одна вещь о LISP была безопасность. Это способствовало минимальным побочным эффектам и чистым функциям, и именно здесь я больше не видел, как я делаю тонкие ошибки, даже несмотря на то, что трудности чтения и письма на языке увеличивали более явные ошибки, которые я мог заметить через 10 секунд.
Чистые функции и неизменяемые состояния стали для меня предпочтительнее, когда я мог себе это позволить, даже если синтаксис:
sword = sharpen(sword)
... немного менее прямолинеен и оторван от человеческого мышления, чем:
sharpen(sword)
Читаемость VS. Простота
И снова LISP - не самый читаемый язык. Он может упаковать много логики в небольшой фрагмент кода (возможно, более одной человеческой мысли в строке). В идеале я склонен отдавать предпочтение одной человеческой мысли на строку для «читабельности», но это не обязательно для «простоты».
При таком определении «простой» иногда «простой» может фактически конкурировать с «читабельным». Это рассматривает вещи больше с точки зрения дизайна интерфейса.
Простой интерфейс означает, что вам нужно изучить гораздо меньше вещей, чтобы использовать его, и потенциально он имеет большую надежность и меньше ошибок в результате его минимализма. Полная документация по этому вопросу может подходить для буклета, а не для большого количества книг. Тем не менее, это может потребовать некоторой дополнительной работы и дать менее читаемый код.
«Простой» для меня улучшает нашу способность понимать функциональность нашей системы на широком уровне. «Читаемый» для меня улучшает нашу способность связывать каждую строчку кода с естественным языком и мышлением и может ускорить наше понимание того, что делает одна строчка кода, особенно если мы не владеем языком.
Regex является примером того, что я считаю «чрезвычайно простым». Это "слишком просто и слишком нечитаемо" на мой личный вкус. Для меня существует баланс между этими крайностями, но у regex действительно есть такое простое LISP-качество, как я его определяю: минимализм, симметрия, невероятная гибкость, надежность и т. Д. Проблема для меня в том, что это настолько просто, что это стало настолько нечитаемым до такой степени, что я не думаю, что когда-либо стану свободно владеть этим (мой мозг просто так не работает, и я завидую людям, которые могут свободно писать код регулярных выражений).
Так или иначе, это мое определение «простоты», и оно полностью не зависит от «читабельности» и может иногда даже мешать другим, приводя к балансирующему действию между более «синтаксически удобной» и читаемой, но большей библиотекой или «синтаксически» неудобно ", менее читаемая, но меньшая библиотека. Я всегда находил истинные «удобство понимания» и истинные приоритеты «ремонтопригодности» в соответствии с последним, с сильным предпочтением минимализму даже при некоторой стоимости читабельности и более естественного человеческого синтаксиса (но не до точки регулярного выражения) , YMMV.