пн, 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.

А в целом по паттернам/антипаттернам скажу, что использование шаблонов
программирования всегда хорошо, будь они "позитивные" или "анти". Это
повышает читабельность. А как классифицировать - сильно зависит от
контекста, конкретного случая программирования.

В общие правила, что хорошо, а что плохо, не верю. Надо руководствоваться
целевым критерием - изменяемостью, сопровождаемость программы. Хорошая
программа та, которую легко менять, не ошибаясь. И всё.

Андрей
  • Зап... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Sergei M. Abramov
      • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Andrei Klimov andrei_AT_klimov . net
          • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
        • ... Василий Стеллецкий swi_AT_cnshb . ru
          • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
            • ... Василий Стеллецкий swi_AT_cnshb . ru
              • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Василий Стеллецкий swi_AT_cnshb . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Василий Стеллецкий swi_AT_cnshb . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Arkady Klimov arkady . klimov_AT_gmail . com

Ответить