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

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

03.06.2020, 16:34. Показов 18491. Ответов 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
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
11.06.2020, 17:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CoderHuligan Посмотреть сообщение
инкапсуляция это выделение АДТ или просто данных в отдельный файл, модуль.
AДТ или данных? Потому что АДТ - это набор функций. А данные - это ссылка неизвестно на что (например void*).

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

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

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


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

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

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

Цитата Сообщение от Usaga Посмотреть сообщение
А класс с конкретным содержимым (возможно приватным).
Конкретное приватное содержимое — деталь реализации. «Пользователи» объекта взаимодействуют с ним через публичный интерфейс, так же, как и в случае АТД.
0
Заблокирован
15.06.2020, 12:24  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Конкретное приватное содержимое — деталь реализации. «Пользователи» объекта взаимодействуют с ним через публичный интерфейс, так же, как и в случае АТД.
На мой непросвещенный взгляд это "не совсем то". В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса). Это очень природоподобная идея. А природу "не пальцем делали". Такая автономизация весьма удобна по комплексу аспектов. Я это уже успел осознать практически. Всё локализуется, включая ошибки и неправильное поведение. Это удобно. Это очень удобно.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
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
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
15.06.2020, 12:42
Цитата Сообщение от titan4ik Посмотреть сообщение
В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса).
В чём разница между классом и модулем? Чем инкапсуляция "на уровне класса" лучше инкапсуляции "на уровне модуля"?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
15.06.2020, 12:45
Цитата Сообщение от titan4ik Посмотреть сообщение
На мой непросвещенный взгляд это "не совсем то". В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса). Это очень природоподобная идея. А природу "не пальцем делали". Такая автономизация весьма удобна по комплексу аспектов. Я это уже успел осознать практически. Всё локализуется, включая ошибки и неправильное поведение. Это удобно. Это очень удобно.
Во-первых, природу как раз-таки «пальцем делали».
Во-вторых, в природе любой объект можно «разкапсулировать» на различном уровне различными инструментами.
В-третьих, чем это, по-твоему, отличается от АТД?
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
15.06.2020, 13:25
Цитата Сообщение от titan4ik Посмотреть сообщение
Это очень природоподобная идея.
Ага. Класс Вода с методами "нагреть" и "вскипятить". Очень природоподобная идея.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
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,782
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
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru