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

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

03.06.2020, 16:34. Показов 17720. Ответов 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
Заблокирован
10.06.2020, 09:51  [ТС]
Студворк — интернет-сервис помощи студентам
Мда,
"Теория, мой друг, суха,
Но зеленеет жизни древо"
Или
"Практика - критерий истинности"
То есть, все паттерны (всех уровней) не более, чем руководство к действию, но каким будем само действие решает величайшее, таинственнейшее и могущественнейшее существо во вселенной - человек. Решает на основе собственного опыта и уровня своих знаний и умений. Аминь.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
10.06.2020, 10:58
Цитата Сообщение от Usaga Посмотреть сообщение
Это успешно можно было реализовать анемичной моделью и группой отдельных сервисов, которые выполняют над ней действия и валидацию. Но это уже явные действия, которые ещё надо не забыть выполнить, да ещё и в нужном порядке.
Ну смотрите, ведь это можно сделать и с соблюдением SRP и не делать год обжект.
Для этого ваш rich объект может выставлять наружу сложный интерфейс, но внутри дергать только приватные сервисы, вызывая их в нужной последовательности.
Тогда и разделение классов по обязанностям останется, и удобный внешний интерфейс класса сохранится.

Some like this
C#
1
2
3
4
5
6
7
8
9
class MyValueObject
{
    public void MakeSomething()
    {
        MyPrivateValidatorService.MakeValidation(this);
        MyPrivateActionService.MakeSomething(this);
        MyPrivateNotificationService.Notificate(this);
    }
}
Конечно SRP здесь не поолностью выполняется, поскольку класс имеет слишком много причин для изменений. Но все же это намного лучше год-обжекта.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,739
10.06.2020, 11:06
Storm23, я понимаю что вы хотите сказать. В случаях, что я обрисовал модель не стала God Object'ом. Количество бизнес-логики в ней не было зашкаливающим, а сама логика не выходила за рамки манипуляции содержимым самой модели.

Цитата Сообщение от Storm23 Посмотреть сообщение
Some like this
На самом деле это уже ближе к сервису-обёртке над вложенной в него анемичной моделью. Я не говорю, что это плохо. Такое имеет смысл делать только, когда модель совсем уж сложная получается и в ней явно могут завестись избыточные вещи. Ну а обращения к каким-нибудь хелперам из модели... само собой разумеющееся)
0
Заблокирован
10.06.2020, 12:06  [ТС]
Я вижу, тут в теме неплохая команда собралась. Может выскажетесь и по 2-м частным вопросам в других темах? А то там тишь, что-то... Буду благодарен. А то меня эти вопросы сдерживают в текущем творческом порыве. Не совсем понятно как далее двигаться в своём проектике.
Многомерная оптимизация и ООП
https://www.cyberforum.ru/math... 64875.html
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
10.06.2020, 12:27
Цитата Сообщение от Usaga Посмотреть сообщение
Номер телефона, ZipCode (почтовый индекс), даже возраст.
Это частный случай абстрактного типа данных, где из всех методов есть только toString и fromString (toInt и fromInt для возраста). Причём, нет большой разницы, будут эти методы статическими или нет. В C# чаще всего это будет геттер и сеттер соответствующего свойства, хотя некоторые предпочитают использовать операторы неявного приведения (или явного для сеттера, так как возможно исключение).
В функциональных языках создание типа данных - это одна строка, поэтому (утрирую) на каждый чих создаётся новый тип. Очень полезно. В ОО языках принято каждый класс писать в отдельном файле, поэтому обычно ленятся создавать такие классы.

Пример в функциональном стиле:
F#
1
2
3
4
5
6
type Email = private | Email of string
with
    member this.Address = let (Email addr) = this in addr
    static member TryParse(address : string) =
        if isValidEmail address then Some(Email address)
        else None
Пример в ОО стиле:
F#
1
2
3
4
5
type Email private (address : string) =
    member __.Address = address
    static member TryParse(address : string) =
        if isValidEmail address then Some(Email address)
        else None
Большой разницы нет. В обоих случаях вместо TryParse, возвращающего Option, можно использовать, например, Create, кидающий исключение - это кому как нравится.

Цитата Сообщение от Usaga Посмотреть сообщение
В виде полноценной модели могу привести агрегат из той же системы сбора статистики. Это большая модель с набором методов для внесения в неё данных.
По сути это тоже абстрактный тип данных. Точно так же, как какой-нибудь список или дерево. Нет большой разницы между "add item myList" и "myList.add(item)".


Замечу, что ни в первом, ни во втором случае ООП не используется. У нас есть некая структура и набор методов для работы с ней (которые гарантируют сохранение инвариантов). Нам не нужен полиморфизм подтипов. Например, в Си это можно сделать с помощью перегрузки функций. А в C# можно, например, сделать все методы статическими.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,739
10.06.2020, 13:41
Цитата Сообщение от Shamil1 Посмотреть сообщение
где из всех методов есть только toString и fromString (toInt и fromInt для возраста). Причём, нет большой разницы, будут эти методы статическими или нет. В C# чаще всего это будет геттер и сеттер соответствующего свойства
Не совсем. Геттеры и сеттеры тут неуместны. Подразумевается, что внутреннее представление возраста не определено, а представление в виде текста есть конвертирование, значит метод, а не геттер. Ну и помимо методов toString в таких типах используется перегрузка методов\операторов сравнения. Это самый минимум, ради которого имеет смысл заводить такой тип.

Цитата Сообщение от Shamil1 Посмотреть сообщение
По сути это тоже абстрактный тип данных. Точно так же, как какой-нибудь список или дерево. Нет большой разницы между "add item myList" и "myList.add(item)".
Вот это я не понял, что имелось в виду.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Замечу, что ни в первом, ни во втором случае ООП не используется. У нас есть некая структура и набор методов для работы с ней (которые гарантируют сохранение инвариантов). Нам не нужен полиморфизм подтипов. Например, в Си это можно сделать с помощью перегрузки функций. А в C# можно, например, сделать все методы статическими.
Причём тут полиморфизм? Он тут вообще не упоминался. У нас не просто структура, у нас модель с приватными сеттерами или вообще без доступа к некоторым внутренним данным. А единственный способ что-то в ней изменить - обращаться к ней же. Т.е. мы не можем извне "расшатать" эту штуку. Причём модель выражает из себя некоторую концепцию из предметной области, а не просто случайно накиданные и не связанные друг с другом данные.

Т.е. у нас: инкапсуляция данных и бизнес-правил внутри некоторого объекта отражающего некоторый аспект предметной области. Всё же, такой подход красивее и правильнее ложится на предметную область. Согласитесь, что "Телефонный Номер" и "Сравниватель телефонных номеров" как-то не особо укладывается в представления о работе с номерами. Это я про разделение на анемичные модели (структуры) и сервисы (статические функции-хелперы).

То, что это распространённый подход (разделение на структуры и сервисы) я не отрицаю, ибо сам так часто делаю по привычке. Это простой и понятный подход. Но он не единственный. И не самый лучший, когда хочется больше выразительности и, в некотором смысле, порядка.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
10.06.2020, 14:15
Цитата Сообщение от Usaga Посмотреть сообщение
Причём тут полиморфизм? Он тут вообще не упоминался. У нас не просто структура, у нас модель с приватными сеттерами или вообще без доступа к некоторым внутренним данным. А единственный способ что-то в ней изменить - обращаться к ней же. Т.е. мы не можем извне "расшатать" эту штуку. Причём модель выражает из себя некоторую концепцию из предметной области, а не просто случайно накиданные и не связанные друг с другом данные.

Т.е. у нас: инкапсуляция данных и бизнес-правил внутри некоторого объекта отражающего некоторый аспект предметной области. Всё же, такой подход красивее и правильнее ложится на предметную область. Согласитесь, что "Телефонный Номер" и "Сравниватель телефонных номеров" как-то не особо укладывается в представления о работе с номерами. Это я про разделение на анемичные модели (структуры) и сервисы (статические функции-хелперы).
Это называется «абстрактный тип данных» и отношения к ООП не имеет.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,739
10.06.2020, 14:24
korvin_, т.е. модель инкапсулирующая какие-то своим данные объектом не является?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
10.06.2020, 14:38
Цитата Сообщение от Usaga Посмотреть сообщение
т.е. модель инкапсулирующая какие-то своим данные объектом не является?
Использование описанных тобой моделей не является объектно-ориентированным программированием. Не подменяй понятия.

Что же до вопроса является ли такая модель объектом — это зависит от того, что ты понимаешь под объектом и в каком контексте.

В моём понимании в контексте ООП — нет, не является.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,739
10.06.2020, 14:49
Цитата Сообщение от korvin_ Посмотреть сообщение
В моём понимании в контексте ООП — нет, не является.
Поделитесь своим видением, пожалуйста.
0
Заблокирован
10.06.2020, 16:35  [ТС]
В общем, благодарю всех. Выходит, я изначально тяготею к стилю rich, просто не знал об этом)
Попутно понял самый высокий уровень абстракции в программировании - это позвать знающего чувака и сказать ему: "Братела, вот тебе бабки, "нужно чтобы было", ты понял? А я пока пиво попью." И всё. А он организует написание ТЗ для программистов, подберет команду и всё сделает) Это какой стиль?)
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
10.06.2020, 16:50
Цитата Сообщение от Usaga Посмотреть сообщение
Вот это я не понял, что имелось в виду.
Вы могли бы сделать все методы статическими.

То есть, вместо
C#
1
myModel.SomeOperation(someValue);
будет
C#
1
SomeOperation(myModel, someValue);
То есть, к ООП Ваша модель не имеет отношения. Её можно оформить в коде в виде класса, а можно в виде модуля. Обычно оформление зависит от выбранного языка программирования. На C# принято создавать класс. На Haskell принято делать модуль. На Си принято делать библиотеку. И так далее.
0
Заблокирован
10.06.2020, 16:58  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
будет
C#
SomeOperation(myModel, someValue);
Поскольку я говорил о 8 параметрах, то someValue это зубчатый массив, который содержит, соответственно, восемь массивов с их значениями?
А myModel описывает целевую функцию?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
10.06.2020, 17:06
Цитата Сообщение от Usaga Посмотреть сообщение
Подразумевается, что внутреннее представление возраста не определено, а представление в виде текста есть конвертирование, значит метод, а не геттер. Ну и помимо методов toString в таких типах используется перегрузка методов\операторов сравнения. Это самый минимум, ради которого имеет смысл заводить такой тип.
Это не принципиально. По сути, все операторы - это статические функции. В некоторых языках вообще операторов нет. В некоторых можно перегружать имеющиеся. В некоторых можно добавлять новые операторы. Это влияет на синтаксис, но суть такая же:

Абстрактный тип данных - это набор функций (независимых от конкретной реализации типа) для оперирования его значениями. Формально АТД включает также инварианты, но в большинстве языков инварианты подразумеваются и не могут быть заданы явно.

з.ы. Реализация функций, очевидно, будет зависеть от реализации типа.
0
Заблокирован
10.06.2020, 17:06  [ТС]

Shamil1, я темы перепутал))) Но вроде в масть - мне в пользу)
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
10.06.2020, 17:10
Цитата Сообщение от titan4ik Посмотреть сообщение
Поскольку я говорил о 8 параметрах, то someValue это зубчатый массив, который содержит, соответственно, восемь массивов с их значениями?
А myModel описывает целевую функцию?
Я лишь привёл пример. Может быть:
C#
1
SomeOperation(myModel, someValue1, someValue2, someValue3);
А в Вашем примере даже не АТД, а функция. Вы можете сделать ей любое количество параметров, включая произвольное (если синтаксис языка позволяет).
1
Заблокирован
10.06.2020, 17:22  [ТС]
В общем, я для себя из этих трех тем что-то в клюве вынес (не всё конечно, что принесли, а то, что смог ухватить )
Всем спасибо!
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
10.06.2020, 18:11
Цитата Сообщение от Shamil1 Посмотреть сообщение
Нет большой разницы между "add item myList" и "myList.add(item)".
Цитата Сообщение от Shamil1 Посмотреть сообщение
Её можно оформить в коде в виде класса, а можно в виде модуля.
Разница все же есть. Эта разница в инкапсуляции.

Если у вас есть просто некая статическая функция SomeOperation(myModel, someValue), принимающая на вход объект и выполняющая над ним действия - фактически означает, что все поля этого объекта торчат наружу. И вы можете писать свои произвольные функции, делающие с объектом что угодно. Соответственно право выстрелить себе в ногу тоже есть.

Вариант же myModel.SomeOperation(someValue) означает, что у объекта есть строго определенный набор функций, который предусмотрел автор класса, и никаких других действий с объектом вы сделать не сможете. К тому-же, у объекта может быть приватный набор состояний, который вы тоже просто так не сможете изменить.
В этом же и смысл инкапсуляции.
1
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
10.06.2020, 18:26
Цитата Сообщение от Storm23 Посмотреть сообщение
Если у вас есть просто некая статическая функция SomeOperation(myModel, someValue), принимающая на вход объект и выполняющая над ним действия - фактически означает, что все поля этого объекта торчат наружу.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Main()
{
    A a = new A();
    A.SetStr(a, "asdf");
    Console.WriteLine($"{A.GetStr(a)}");
}
 
public class A
{
    private string Str;
    
    public static void SetStr(A a, string s) => a.Str = s;
    public static string GetStr(A a) => a.Str;
    
}
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
11.06.2020, 13:39
На мой взгляд инкапсуляция это выделение АДТ или просто данных в отдельный файл, модуль. Причем эти данные объявляются в глобальной области видимости (для файла). Функции объявляются и определяются также в отдельных файлах (в них данных не должно быть). Функции работают с данными через global. Если будете реально что-то делать, то это станет понятным. Функции-процедуры отдельно, определения и объвления данных отдельно. Функции группируются по разным критериям модульности. Данные также группируются по соответствию некоему критерию близости.
В итоге получили инкапсуляцию данных по данным, функций по функциям (которые вызывают другие функции и т.д.). Код получается кристалльно чистым и понятным. Не запутанным.
Объект это АДТ, который имеет состояние. Сущность, которая состояния не имеет не является объектом. Читайте Буча.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2020, 13:39

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru