пн, 14 дек. 2020 г., 10:46 Александр Коновалов a.v.konovalov87_AT_mail.ru < refal@botik.ru>:
Доброе утро всем! > 1. Выворачивание скобок наизнанку, для организации прохода по выражению. К представлению объектных выражений этот приём (антиприём) не имеет отношение. Не согласен! Ещё как имеет. Нельзя не думать об эффективности, выбирая шаблоны программирования, особенно когда речь не о коэффициенте, а об уменьшении сложности, скажем с квадратичной до линейной. Он, скорее, характерен для базисного Рефала (Рефала-2), в котором нет ничего подобного let-конструкциям (условия, перестройки, действия). По-моему, это здесь ни при чём. Это вопрос заведения/отсутствия вспомогательных функций, что есть другой паттерн, который, кстати, не влияет на сложность, а только на небольшой коэффициент, зависящий от реализации. А как влияет на читабельность - это ещё вопрос. Некоторым нравятся явно выраженные вспомогательные функции. У меня в Рефале-5λ копирование выражений дорогое, но я копировать их по умолчанию не боюсь. Потому что потом я нахожу узкие места, изучая профиль программы, и устраняю лишние копирования уже в них. Заниматься перепимыванием читабельной программы на нечитабельную - это, по-моему, как раз пример "антипаттерна". Так нарушается maitanability, сопровождаемость, развиваемость программы, что есть первое требование к хорошему программированию. Остальные требования, паттерны/антипаттерны вытекают из него. А нет ли в Рефале Плюс другой боязни — боязни конкатенации? Нет. Не буду вдаваться в подробности, но это вопрос мы обсасывали и изменяли на нескольких массивных реализациях, и получали оптимистические результаты. Отгадка в управлении доступом к памяти в современных процессорах, поддерживающем малую пространственную и временнУю локальность и, более того, наличии эффективной команды переписи память-память. Enum { e.Expr = <DoEnum e.Expr 1> : e.Expr^ s.Num = e.Expr; } IMHO, это есть пример антипаттерна: повторное использование имени для нового значения. Я бы здесь обязательно написал е.Expr1. А то легко не понять при чтении и ошибиться при рефакторинге. Также избегаю повторения имени в популярных функ языках типа ML с let, ну, кроме совсем легко читаемых шаблонных случаев: ... let x = x+1 in ... Как только выражение в правой части достаточно громоздко, чтобы не заметить, что переопределяется та же переменная, ввожу новое имя, хотя бы x1. А в целом по паттернам/антипаттернам скажу, что использование шаблонов программирования всегда хорошо, будь они "позитивные" или "анти". Это повышает читабельность. А как классифицировать - сильно зависит от контекста, конкретного случая программирования. В общие правила, что хорошо, а что плохо, не верю. Надо руководствоваться целевым критерием - изменяемостью, сопровождаемость программы. Хорошая программа та, которую легко менять, не ошибаясь. И всё. Андрей