Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/74: Рейтинг темы: голосов - 74, средняя оценка - 4.64
Заблокирован

ООП - парадигмы, паттерны, подходы - кратко и доходчиво

03.06.2020, 16:34. Показов 17692. Ответов 153
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не проф программист и никогда им не буду (старый уже). Потихоньку что-то читал и делал на c# WPF. Получалось, работало, но это были относительно простые штуковины и собственно ОПП там особо не использовалось. Но ту взялся сделать (для себя) более сложную штуковину и увидел, что не сделал ещё и малой части, а уже приходится неоднократно переписывать почти всё заново. Чё-то не очень получается делать ладные "кирпичики", из которых будут строиться блоки программы, а из блоков постепенно усложняться большое здание программы. Постоянно что-то "подпиливаю" в кирпичиках и даже их заменяю. Если так и дальше пойдет, то я эту штуку никогда не сделаю. Оказалось, что это очень не просто правильно сделать модель предметной области, правильно определиться со способами реализациями идей, правильно разбить программу на какие-то правильно взаимодействующие части. К тому же, c# имеет богатый функционал средств. Одно и то же можно сделать по разному. Постоянно встает проблема выбора - и так можно и эдак... Код поначалу всё терпит)
В итоге оказалось, что "что-то не так" - очевидно не хватает каких-то системных знаний.
Сама задача достаточно стандартная - анализ исторических данных биржевых курсов акций, выработка и реализация торговых стратегий и т.д. Это интересно, но чувствую, что что-то идёт не так)
Забавно, что в рамках процедурного программирования достаточно быстро "слепил" один небольшой кусочек программы и частично оттестировал микроидею. Усложнять далее в рамках процедурного подхода было уже не рационально. Поэтому стал переписывать в рамках подхода ООП. Это заняло гораздо больше времени и никак не закончу). Постоянно что-то переделываю. Честно говоря, не ожидал, что возникнут такие принципиальные трудности. Одного здравого смысла и соображалки явно не достаточно. И шо же делать?)
Изучить все парадигмы, подходы, паттерны программирования, чтобы потом легко выбирать нужные? Это конечно правильный, но очень долгий путь.
Что подскажут профессионалы? Может есть какой-то не оч объемный (страниц 100 - 200) "тот самый" фолиант, или статья, или блог, или ещё что, который мне тут может помочь? Как-то подтолкнёт в нужном направлении. А далее уже методом проб и ошибок - путём набора опыта.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.06.2020, 16:34
Ответы с готовыми решениями:

Парадигмы: императивная vs ООП
Здравствуйте, форумчане. Меня мучает проблема, можно так сказать, эстетически-идеологического характера. Суть заключается в следующем: ...

Насколько распространены такие подходы ("паттерны")
Всем привет. Встретил некоторые паттерны (конечно, таковыми их можно назвать с натяжкой). Хочу узнать, в реальных (а не учебных...

Подходы к разработке ПО и их связь с ООП
Fulcrum_013, ну, если бы вы для каждой подобной задачи в своем движке городили иерархии абстрактных менеджеров адаптеров стратегий фабрик,...

153
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
11.06.2020, 17:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CoderHuligan Посмотреть сообщение
инкапсуляция это выделение АДТ или просто данных в отдельный файл, модуль.
AДТ или данных? Потому что АДТ - это набор функций. А данные - это ссылка неизвестно на что (например void*).

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Функции работают с данными через global.
Что за global? Звучит ужасно.
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.06.2020, 09:30
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы могли бы сделать все методы статическими.
Нет. Тогда мы возвращаемся к анемичным моделям и stateless-сервисам. И как выше было подмечено, теряем возможность инкапсуляции каких-то собственных данных модели.
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 10:34
Цитата Сообщение от Usaga Посмотреть сообщение
Нет. Тогда мы возвращаемся к анемичным моделям и stateless-сервисам. И как выше было подмечено, теряем возможность инкапсуляции каких-то собственных данных модели.
Не понял. Можете показать на небольшом примере, что нельзя сделать статическими методами?
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.06.2020, 10:36
Shamil1, речь не о "нельзя", а о том, что собственные методы класса могут работать с приватными полями, а статические - нет. Придётся делать поля публичными. А это нарушает инкапсуляцию.
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 10:42
Цитата Сообщение от Usaga Посмотреть сообщение
собственные методы класса могут работать с приватными полями, а статические - нет
Не верно. Опровергающий пример я уже постил.
ООП - парадигмы, паттерны, подходы - кратко и доходчиво
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.06.2020, 10:45
Shamil1, Вы правда считаете, что набор статических методов, которым ссылку на объект нужно передавать явно лучше, чем методы экземпляра, которые через this могут нормально обращаться к полям?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 10:57
Цитата Сообщение от Usaga Посмотреть сообщение
Вы правда считаете, что набор статических методов, которым ссылку на объект нужно передавать явно лучше, чем методы экземпляра, которые через this могут нормально обращаться к полям?
Не вижу разницы. Различия только в синтаксисе.
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.06.2020, 11:08
Shamil1, а я вижу: лишнее телодвижение, с явным обращением к имени класса, с передачей в метод ссылки. Не возможность применения наследования для переопределения поведения. Ну и в коде вам нужно знать не только ссылку на объект, у которого можно было просто дёрнуть метод, но ещё и класс, где этот метод можно найти. Усложнения на пустом месте, без какого-либо профита.

Добавлено через 58 секунд
Для меня это выглядит как переход к процедурному подходу.
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 11:34
Цитата Сообщение от Usaga Посмотреть сообщение
лишнее телодвижение, с явным обращением к имени класса, с передачей в метод ссылки
Нужно или не нужно писать имя класса - зависит от синтаксиса конкретного языка программирования. Например, в Си писать не нужно, в C# можно не писать (если использовать using).

В С# cсылка на объект в метод передаётся неявно, но имя объекта всё-равно требуется. Вам больше нравится писать имя объекта перед именем функции, кому-то больше нравится писать имя объекта справа от имени функции. Я не вижу принципиальной разницы - дело вкуса (и синтаксис языка).


Цитата Сообщение от Usaga Посмотреть сообщение
Не возможность применения наследования для переопределения поведения.
Да. А зачем нужно наследование в описанных случаях (АТД)?
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.06.2020, 11:45
Цитата Сообщение от Shamil1 Посмотреть сообщение
Нужно или не нужно писать имя класса - зависит от синтаксиса конкретного языка программирования. Например, в Си писать не нужно, в C# можно не писать (если использовать using).
Так в Си вообще классов нет и у нас так и получится - отдельно полностью открытая структура, отдельно набор статических методов. А использование using не отменит необходимости обращаться к имени типа через точку. Только взамен имени типа будет алиас. Разница-то в чём? Опять же лишняя сущность, без которой можно обойтись.

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

Цитата Сообщение от Shamil1 Посмотреть сообщение
Да. А зачем нужно наследование в описанных случаях (АТД)?
Но описанный случай разве про АТД? У нас не коллекция неизвестно чего. А класс с конкретным содержимым (возможно приватным).
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
15.06.2020, 12:16
Цитата Сообщение от Usaga Посмотреть сообщение
отдельно полностью открытая структура, отдельно набор статических методов.
1) структуру можно сделать закрытой.
2) определение структуры и методов можно разместить рядом, в одном файле.

Цитата Сообщение от Usaga Посмотреть сообщение
А класс с конкретным содержимым (возможно приватным).
Конкретное приватное содержимое — деталь реализации. «Пользователи» объекта взаимодействуют с ним через публичный интерфейс, так же, как и в случае АТД.
0
Заблокирован
15.06.2020, 12:24  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Конкретное приватное содержимое — деталь реализации. «Пользователи» объекта взаимодействуют с ним через публичный интерфейс, так же, как и в случае АТД.
На мой непросвещенный взгляд это "не совсем то". В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса). Это очень природоподобная идея. А природу "не пальцем делали". Такая автономизация весьма удобна по комплексу аспектов. Я это уже успел осознать практически. Всё локализуется, включая ошибки и неправильное поведение. Это удобно. Это очень удобно.
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 12:35
Цитата Сообщение от Usaga Посмотреть сообщение
А использование using не отменит необходимости обращаться к имени типа через точку.
C#
1
2
3
4
using static System.Math;
...
var s = PI * Pow(r, 2);
...
Повторюсь - это синтаксис конкретного языка программирования. В других языках будет по-другому. И я не понимаю, чем имя функции "Math.Pow" хуже имени "Pow". ИМХО это не дополнительная сущность, просто так получилось, что в C# нельзя объявить функцию вне класса (в С++, например, можно).


Цитата Сообщение от Usaga Посмотреть сообщение
Но описанный случай разве про АТД?
Да. У нас есть некий объект (чёрный ящик) и набор функций для работы с ним (начиная с инициализации и заканчивая освобождением ресурсов, если требуется).
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 12:42
Цитата Сообщение от titan4ik Посмотреть сообщение
В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса).
В чём разница между классом и модулем? Чем инкапсуляция "на уровне класса" лучше инкапсуляции "на уровне модуля"?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
15.06.2020, 12:45
Цитата Сообщение от titan4ik Посмотреть сообщение
На мой непросвещенный взгляд это "не совсем то". В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса). Это очень природоподобная идея. А природу "не пальцем делали". Такая автономизация весьма удобна по комплексу аспектов. Я это уже успел осознать практически. Всё локализуется, включая ошибки и неправильное поведение. Это удобно. Это очень удобно.
Во-первых, природу как раз-таки «пальцем делали».
Во-вторых, в природе любой объект можно «разкапсулировать» на различном уровне различными инструментами.
В-третьих, чем это, по-твоему, отличается от АТД?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
15.06.2020, 13:25
Цитата Сообщение от titan4ik Посмотреть сообщение
Это очень природоподобная идея.
Ага. Класс Вода с методами "нагреть" и "вскипятить". Очень природоподобная идея.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
15.06.2020, 13:49
Вопрос к знатокам ООП, как правильно спроектировать классы и методы для написания текста:

Objective-C
1
[pen write:something on:paper]
или
Objective-C
1
[something writeOn:paper using:pen]
или
Objective-C
1
[paper write:something using:pen]
?
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
15.06.2020, 14:53
[Forth]
pen paper write
[/Forth]
0
Заблокирован
15.06.2020, 16:50  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Во-первых, природу как раз-таки «пальцем делали».
я не в курсе таких подробностей.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Ага. Класс Вода с методами "нагреть" и "вскипятить". Очень природоподобная идея.
Наличие принципов природоподобия в ООП не означает, что ваша реализация данных принципов автоматически будет тоже природоподобна, ибо реализация делается "другим пальцем", нежели сама природа была сделана. Но в таком случае претензии можно предъявлять только самому себе и своему "пальцу".

Добавлено через 4 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
Во-вторых, в природе любой объект можно «разкапсулировать» на различном уровне различными инструментами.
Не в каждой человеческой цивилизации это позволялось. Но в итоге победила именно та, которая тотально все раскапсулировала и в дикой природе и в самом человеке. В итоге имеем цивилизационный тупик. Плюс один - при таком варварском подходе к природе человечество пробежало свой путь до этого тупика в рекордные сроки) Но это лучше в другом месте обсуждать)


Добавлено через 4 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
В чём разница между классом и модулем? Чем инкапсуляция "на уровне класса" лучше инкапсуляции "на уровне модуля"?
Чисто практически, представляется, что класс существенно меньше модуля. Класс - кирпичик. Модуль может состоять из большого числа кирпичиков. Разные модули может могут содержать одинаковые кирпичики. Но поскольку в программировании бардак с терминами, то каждый может представлять себе что хочет.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
15.06.2020, 17:38
Цитата Сообщение от titan4ik Посмотреть сообщение
я не в курсе таких подробностей.
Эволюция и естественный отбор.

Цитата Сообщение от titan4ik Посмотреть сообщение
Чисто практически, представляется, что класс существенно меньше модуля.
Это не обязательно, и по большому счёту language-dependent.

Цитата Сообщение от titan4ik Посмотреть сообщение
Модуль может состоять из большого числа кирпичиков.
Как и объект может состоять из большого числа других объектов.

Цитата Сообщение от titan4ik Посмотреть сообщение
Разные модули может могут содержать одинаковые кирпичики.
Как и разные классы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2020, 17:38

Паттерны vs ООП
Как ни странно, но одно .. конфликтует с другим. Поясню на примере, задача: Создать обобщенное хранение файлов с описаниями...

Принципы и паттерны ООП
Используя принципы и паттерны ООП разработать программу на объектно-ориентированном языке. Предусмотреть исключающие ситуацию: ...

Основы Java освоены, понятия, парадигмы, ООП. Читать код могу, понятия есть, но все бы ничего, что дальше?
Доброго времени суток товарищи Столкнулся с такой ситуацией: куда двигаться дальше? Основы Java освоены, понятия, парадигмы, ООП....

Доходчиво разъясните...
1. Я до сих пор не понимаю работу комманды LEA. Главное я не понимаю практическиое использование. Так как меня всегда волнует win32 asm...

Объясните доходчиво Exit и Halt
Ребят, я немного недопонимаю, в чем различия между Exit и Halt, если они оба завершают программу?


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru