Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Якобинец
310 / 20 / 2
Регистрация: 26.01.2013
Сообщений: 365

Антипаттерн Умная модель

08.05.2019, 15:33. Показов 2239. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Один сеньёр (developer) сказал, что я часто использую в своём коде антипаттерн Умная модель. Чтобы понять и усовеститься, гуглил эти слова, но не смог найти. Кто-нибудь может подсказать, что это за антипаттерн и где можно почитать о нём подробнее.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2019, 15:33
Ответы с готовыми решениями:

Паттерн или антипаттерн
Хелоу. Из списка антипаттернов на википедии: Возникает ассоциация с шаблоном Посредник(Proxy). В чём соль, товарищи?

Синглтон как антипаттерн
Доброе утро, данный паттерн называют часто анти-паттерном, но не называют "валидную" ему замену - как она? Как по мне...

Умная* печать
Доброго времени суток. Стоит задача внедрения модуля печати в готовую программу те необходимы дополнительные функции. Например добавление...

8
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
08.05.2019, 15:46
Может, что-то типа актив рекорд?
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
09.05.2019, 16:15
Разве AR - антипаттерн?
Лучше всего конечно спросить у самого идальго, что он имел в виду.

Мне кажется имеется в виду "умная блондинка" - красивый интерфейс и недочеты в реализации - ну к примеру антипаттерн "Ненужная сложность" (Accidental complexity)
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
09.05.2019, 18:09
Цитата Сообщение от vantfiles Посмотреть сообщение
Разве AR - антипаттерн?
Да. Хотя когда-то он был очень популярен.
0
 Аватар для Якобинец
310 / 20 / 2
Регистрация: 26.01.2013
Сообщений: 365
13.05.2019, 11:16  [ТС]
(спросить у синьора не могу, ибо он уже нас покинул)
Контекст, предполагаю, был следующий:
Я часто пишу классы, которые изменяют своё состояние в зависимости от свойств.
Например, я создаю шкаф управления и в параметрах конструктора передаю зависимые системы. Он по этим данным рассчитывает все свойства и инициализирует их. Затем я просто запрашиваю свойство (вместо вызова функции GetSmth() и перебора связанных данных) и использую полученные данные во внешних расчётах.

Либо (иногда) делаю свойство с функцией в сеттере, которая изменяет состояние (пересчитывает данные и переменные, которые используются далее в расчётах).

С одной стороны, конструкторы и свойства для этого и сделаны. С другой - предполагаю, что могут быть проблемы при дальнейшем расширении класса: новая логика пересчёта переменных состояния теоретически может вступить в конфликт со старой и выдавать неверные результаты.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
13.05.2019, 12:43
По такому описанию сложно понять. Возможно, имеется ввиду антипаттерн "Божественный объект".
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
13.05.2019, 12:55
Наверное имеется в виду, что это пользователи модели должны дёргать её за интерфейс и когда им надо узнавать о её состоянии, а не наоборот.
Иначе получается, что модель будет знаь детали того, что и зачем ею пользуется и зависеть от этих деталей.
В результате, если мы захотим передать модель, например на отрисовку в какое нибудь новое, не используемое ранее представление, нам не получится использовать её как готовый кирпичик, а надо будет дописывать в код модели какие-то детали, говорящие, о появлении нового представления. Получается кирпичик кода, зависимый от того, кто и зачем его использует, т.е. это не простой кирпичик уже.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
13.05.2019, 15:13
Цитата Сообщение от Якобинец Посмотреть сообщение
Например, я создаю шкаф управления и в параметрах конструктора передаю зависимые системы.
Если их слишком много, то это может быть Iceberg class.

Цитата Сообщение от Якобинец Посмотреть сообщение
Он по этим данным рассчитывает все свойства и инициализирует их. Затем я просто запрашиваю свойство (вместо вызова функции GetSmth() и перебора связанных данных)
Это зависит от роли объекта. Если это «полноценный», «живой» объект, то он не должен вычислять всё в конструкторе, а должен делать что-то при вызове методов, конструктор нужен только для задания связей. Иначе, если в связанных подсистемах что-то поменяется, объект сам по себе об этом не узнает и все сохранённые расчёты придётся обновлять.

С другой стороны, если объект представляет просто структуру данных с результатами вычислений некоторых исходных данных от других объектов, то это нормально — вычислять всё в конструкторе. Другое дело, что для представления таких результатов лучше использовать не объекты, а простые структуры, если язык позволяет.

Цитата Сообщение от Якобинец Посмотреть сообщение
Либо (иногда) делаю свойство с функцией в сеттере, которая изменяет состояние (пересчитывает данные и переменные, которые используются далее в расчётах).
В общем случае, сеттер не должен менять ничего, кроме значения связанного с ним свойства, т.к. иначе его название будет вводить в заблуждение. Если нужно изменить несколько полей состояния, то нужно определить соответствующий метод.

Например:

Java
1
2
3
4
5
6
7
8
9
10
class Point {
 
    private double x;
    private double y;
 
    public void setScale(double scale) {
        x *= scale;
        y *= scale;
    }
}
— плохо.

Java
1
2
3
4
5
6
7
8
9
10
class Point {
 
    private double x;
    private double y;
    private double scale;
 
    public void setScale(double scale) {
        this.scale = scale;
    }
}
— тоже так себе, не ООПшно, но лучше первого варианта.

Java
1
2
3
4
5
6
7
8
9
10
class Point {
 
    private double x;
    private double y;
 
    public void rescale(double factor) {
        x *= factor;
        y *= factor;
    }
}
— нормально.

Ну, как-то так.

Цитата Сообщение от Якобинец Посмотреть сообщение
Затем я просто запрашиваю свойство (вместо вызова функции GetSmth() и перебора связанных данных) и использую полученные данные во внешних расчётах.
Tell, don't ask.
1
 Аватар для Якобинец
310 / 20 / 2
Регистрация: 26.01.2013
Сообщений: 365
14.05.2019, 16:27  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    public class ChainShape : ComplexShape
    {
        private List<Shape> _childrenShapes { get; set; }
        private List<ConnectionSection> _connections = new List<ConnectionSection>();
 
        private double _itemsWidthSum;
 
 
        private double _forcedChainWidth = -1;
        public double ForsedChainWidth
        {
            get { return _forcedChainWidth; }
            set {
                _forcedChainWidth = value;
                CalcWidth = value; // ??? не the worst practice ли это ???
            }
 
        }
 
        public ChainShape(List<Shape> chainShapes)
        {
            _childrenShapes = chainShapes;
 
            double sumWidth = 0;
 
            foreach (Shape shape in chainShapes)
            {
                sumWidth += shape.CalcWidth;
 
                ConnectionSection connection = shape as ConnectionSection;
                if (connection != null)
                {
                    _connections.Add(connection);
                }
 
            }
        }
 
        protected override List<Shape> GetOptionalContent()
        {
            List<Shape> result = new List<Shape>();
 
            double currentX = 0;
            double currentY = 0;
 
            if (ForsedChainWidth > 0 && ForsedChainWidth != CalcWidth)
            {
                double sumConnectionWidth = ForsedChainWidth - _itemsWidthSum;
                double connectionWidth = sumConnectionWidth / _connections.Count;
 
                _connections.ForEach(c => c.SetWidth(connectionWidth));
            }
 
            foreach (Shape element in _childrenShapes)
            {
                element.BasePoint = new CPoint(currentX, currentY);
                result.Add(element);
                currentX += element.CalcWidth;
            }
 
            return result;
        }
    }
А что если такой квест: я рисую параллельно две цепочки элементов: верхнюю и нижнюю. Обе должны быть одинаковой длины. Цепочки состоят из элементов (постоянной длины) и связей элементов, которая по умолчанию 7, но я могу изменять её в большую сторону, чтобы выровнять цепочки. Для этого я использую свойство ForsedWidth (а CalcWidth - это свойство базового элемента, которое необходимо повсюду и оно очень важно).
Вопрос: я должен менять CalcWidth, если задаю ForsedWidth, или я должен перегрузить getter свойства CalcWidth, которое будет смотреть, задано ли ForcedWidth и в зависимости от этого возвращать его или рассчитанную длину?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2019, 16:27
Помогаю со студенческими работами здесь

Умная форма
Всем привет! Не силен в access Подскажите, пжл, делаю программу учета входящих звонков и запись. Никак не могу найти описание в...

Умная шара
Здравствуйте! Подскажите пожалуйста как в Windows XP ограничить доступ к расшаренной папке по IP адресам, средствами самой ОС, если ПК...

Умная многопоточность
Добрый день! У меня есть проект где используется многопоточность. Суть проекта - оптимизация изображений, каждое изображение в среднем...

Умная изба
Начало было на предыдущем форуме. Хочется собрать систему, которая бы выполняла следующие функции: 1) Охранно-пожарная сигнализация ...

Умная таблица
Подскажите, делаю автоматизацию для заполнения таблиц ecxel, но вот в чем вопрос, можно ли сделать так, чтобы при выборе определенного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru