Заблокирован

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

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

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

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

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


Цитата Сообщение от Usaga Посмотреть сообщение
Не возможность применения наследования для переопределения поведения.
Да. А зачем нужно наследование в описанных случаях (АТД)?
0
Эксперт .NET
 Аватар для Usaga
14741 / 9515 / 1364
Регистрация: 21.01.2016
Сообщений: 35,907
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
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,909
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,909
15.06.2020, 12:42
Цитата Сообщение от titan4ik Посмотреть сообщение
В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса).
В чём разница между классом и модулем? Чем инкапсуляция "на уровне класса" лучше инкапсуляции "на уровне модуля"?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
15.06.2020, 12:45
Цитата Сообщение от titan4ik Посмотреть сообщение
На мой непросвещенный взгляд это "не совсем то". В ООП же инкапсуляция реализуется на уровне каждого объекта (Класса). Это очень природоподобная идея. А природу "не пальцем делали". Такая автономизация весьма удобна по комплексу аспектов. Я это уже успел осознать практически. Всё локализуется, включая ошибки и неправильное поведение. Это удобно. Это очень удобно.
Во-первых, природу как раз-таки «пальцем делали».
Во-вторых, в природе любой объект можно «разкапсулировать» на различном уровне различными инструментами.
В-третьих, чем это, по-твоему, отличается от АТД?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,909
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru