|
Заблокирован
|
|
ООП - парадигмы, паттерны, подходы - кратко и доходчиво03.06.2020, 16:34. Показов 18487. Ответов 153
Метки нет (Все метки)
Я не проф программист и никогда им не буду (старый уже). Потихоньку что-то читал и делал на c# WPF. Получалось, работало, но это были относительно простые штуковины и собственно ОПП там особо не использовалось. Но ту взялся сделать (для себя) более сложную штуковину и увидел, что не сделал ещё и малой части, а уже приходится неоднократно переписывать почти всё заново. Чё-то не очень получается делать ладные "кирпичики", из которых будут строиться блоки программы, а из блоков постепенно усложняться большое здание программы. Постоянно что-то "подпиливаю" в кирпичиках и даже их заменяю. Если так и дальше пойдет, то я эту штуку никогда не сделаю. Оказалось, что это очень не просто правильно сделать модель предметной области, правильно определиться со способами реализациями идей, правильно разбить программу на какие-то правильно взаимодействующие части. К тому же, c# имеет богатый функционал средств. Одно и то же можно сделать по разному. Постоянно встает проблема выбора - и так можно и эдак... Код поначалу всё терпит)
В итоге оказалось, что "что-то не так" - очевидно не хватает каких-то системных знаний. Сама задача достаточно стандартная - анализ исторических данных биржевых курсов акций, выработка и реализация торговых стратегий и т.д. Это интересно, но чувствую, что что-то идёт не так) Забавно, что в рамках процедурного программирования достаточно быстро "слепил" один небольшой кусочек программы и частично оттестировал микроидею. Усложнять далее в рамках процедурного подхода было уже не рационально. Поэтому стал переписывать в рамках подхода ООП. Это заняло гораздо больше времени и никак не закончу). Постоянно что-то переделываю. Честно говоря, не ожидал, что возникнут такие принципиальные трудности. Одного здравого смысла и соображалки явно не достаточно. И шо же делать?) Изучить все парадигмы, подходы, паттерны программирования, чтобы потом легко выбирать нужные? Это конечно правильный, но очень долгий путь. Что подскажут профессионалы? Может есть какой-то не оч объемный (страниц 100 - 200) "тот самый" фолиант, или статья, или блог, или ещё что, который мне тут может помочь? Как-то подтолкнёт в нужном направлении. А далее уже методом проб и ошибок - путём набора опыта.
0
|
|
| 03.06.2020, 16:34 | |
|
Ответы с готовыми решениями:
153
Парадигмы: императивная vs ООП
Подходы к разработке ПО и их связь с ООП |
|
Заблокирован
|
|||
| 15.06.2020, 18:11 [ТС] | |||
|
Это я о личной яхте длиной в футбольное поле (и стоимостью в миллион добрых дел) подумал. Тут явно чей-то указующий перст просматривается, который корректирует естественные процессы. Добавлено через 50 секунд
0
|
|||
|
Модератор
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
|
|||
| 15.06.2020, 18:11 | |||
|
0
|
|||
|
|
||
| 15.06.2020, 19:01 | ||
|
Shamil1, Вы приводите пример, где статические методы внутри класса модели. А Usaga имеет ввиду анемичную модель, где модель - это один класс, а сервис - это другой класс (со статическими методами). И в такой модели все поля должны торчать наружу и быть публичными, что бы сервисы могли с ними работать. И именно тут нарушается инкапсуляция. В анемичной модели получается что все о всех все знают.
Ну а кроме того, статика не поддерживает наследования. Получается анемичная модель нарушает два из трех принципов ООП, и по сути ООП не является. Но тем не менее: все три варианта допустимы. Выбор зависит от утилитарных требований и общей архитектуры. Если большинство кейсов таковы, что мне удобно вызывать методы у paper - я сделаю метод у paper. Если мне удобно, что бы текст сам по себе записывался в абстрактный paper - я сделаю метод у something и т.д. Еще в других случаях - я сделаю отдельный сервис, не привязанный к этим классам. А однозначного "правильного" проектирования в ООП нет.
0
|
||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
|||||||||||
| 15.06.2020, 19:36 | |||||||||||
Добавлено через 4 минуты
0
|
|||||||||||
|
|
|||||||||
| 15.06.2020, 19:56 | |||||||||
Ну а то что есть споры и разногласия - не понимаю почему вас это смущает? Да, задачи можно решать разными способами. Разве в других парадигмах не точно также? Разве в структурном программировании есть единый и правильный способ решения задач? Если вам не нравится ООП, ну не используйте его. Я не собираюсь быть адвокатом ООП. Могу лишь заметить, что лично мне ООП (плюс весь набор паттернов, построенных поверх него) позволяет успешно решать мои задачи. Что еще нужно? Ну не нужно, так не используйте. Мы вообще-то про то и говорим, что иногда есть смысл в анемичных моделях, иногда - в rich.
0
|
|||||||||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
|||||||
| 15.06.2020, 20:15 | |||||||
|
Даже в предложенном мной примере с тремя объектами, вместо того, чтобы предположить, что тут может подойти другой подход (или хотя бы не классическое ООП), ты всё равно попытался использовать привычный инструмент. =) Добавлено через 1 минуту
0
|
|||||||
| 16.06.2020, 00:30 | |
|
Не по теме:
0
|
|
|
Модератор
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
|
|||
| 16.06.2020, 01:03 | |||
|
В первом случае (АТД) инкапсуляция не нарушается (всё собрано в одном модуле или классе). И в этом случае одинаково удобны и анемичные, и рич модели... и можно вообще без классов обойтись, так как АТД не имеют никакого отношения к ООП. Во втором случае (анемичная модель и служба) инкапсуляция не нужна. Бизнес-логика скрыта в "классах служб", а с данными работают все кому не лень - включая автомапперы, сериализаторы, (декларативные) "автовалидаторы", ORM и так далее.
0
|
|||
|
Заблокирован
|
||
| 16.06.2020, 01:15 [ТС] | ||
|
Да, Может. И некий узел машины может состоять из одной детали. Но, как правило, это не так. Модуль - это блок, который определяется именно функционалом. А структурная сложность модуля может быть любой. Если я правильно понимаю смысл понятия "модуль" с точки зрения русского языка в коннотации науки и техники. Хотя, может быть, у айтишников всё иначе. Кто вас знает). У вас много терминов переводных калькированных убогими переводчиками-филологами - всё так и прижилось - "не по-русски" написанным.
0
|
||
|
|
||||||||||||
| 16.06.2020, 12:36 | ||||||||||||
|
Более современный взгляд на модуль: функции + структуры + интерфейсы. Уже три компонента. Раньше был один: функции, и сейчас пришли к трем.. Вопрос в том, правильная ли эволюция развития понятия "модуль", "класс".. Вопрос, также в способах ухода от сложности и прихода к неэффективности. Что понятней и эффективней?:
В первом случае необходимо еще создать перечисление имен для функции "приготовить" (не показано). К тому же при каждом вызове приходится тратить время на переключение для поиска подходящего варианта. примерно то же самое происходит в ООП незаметно от глаза программистов. Во втором случае мы вызываем необходимую функцию сразу, и не тратим время на выбор вариантов в функции, а просто делаем необходимую нам работу. Enum не нужен. Вот это то, что я называю компонентом. Компонент делает только одно дело. И за этим надо следить. Эти компоненты пользуются услугами других компонентов общих для всех остальных.
0
|
||||||||||||
|
Модератор
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
|
||
| 16.06.2020, 13:04 | ||
|
0
|
||
|
Заблокирован
|
|
| 16.06.2020, 13:19 [ТС] | |
|
Господа айтишники, после чтения ваших сообщений (не только в этой теме) встаёт закономерный вопрос. Скажите пожалуйста, а нет ли такого букваря (глоссария, словаря) в котором все термины программирования трактуются однозначно и он признан "скрижалью" сообществом программистов?
Это должна быть книга по теории программирования без привязки к ЯП. А то у вас наблюдается настоящее вавилонское столпотворение. Вам для того, даже чтобы просто понять друг друга, нужно сначала определяться в терминах какой области программирования вы общаетесь. Иначе - бардак. Такое бывает, когда практика шагает семимильными шагами (в разные стороны) впереди теории. P.S. Я уж не говорю о сленге, который в общем-то, как правило, объединяет специалистов и позволяет им быстрее понять друг друга. Тут же... Хуже всего когда сленг используют люди, которые слабо себе представляют что стоит за этими терминами. И которые нормальных терминов (не сленговых) не знают.
0
|
|
|
Модератор
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
|
|
| 16.06.2020, 14:09 | |
|
Авторы книг по разным языкам используют разную терминологию. Так исторически сложилось.
Добавлено через 4 минуты Можете попробовать почитать "Concepts, Techniques, and Models of Computer Programming" (можно найти и на русском). Хотя, возможно, она покажется Вам скучной.
1
|
|
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||||||||
| 16.06.2020, 14:34 | ||||||||||
1
|
||||||||||
|
|
||
| 16.06.2020, 15:12 | ||
|
0
|
||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||||
| 16.06.2020, 15:33 | ||||||
|
Мой совет: изучай «снизу», конкретные техники и концепции, а не «сверху», от «парадигм». На примере того же ООП: 1) изучение «сверху»: – читаешь описание (хотя бы на той же википедии), про «инкапсуляцию», «наследование», «полиморфизм» – начинаешь углубляться, натыкаешься на кучу холиваров и мнений как по каждому из этих трёх слов, так и по их отношению к ООП и значимости – узнаёшь, что не во всех языках, поддерживающих ООП, инкапсуляция строгая, и её можно обойти, есть разные модификаторы доступа (private/protected/public) и в разных языках присутствуют разные их комбинации, нет никакой «каноничной» инкапсуляции – узнаёшь, что есть «определение ООП от Алана Кея» и что по мнению мистера Кея C++ — не ООП-язык, хотя многие будут говорить иначе – находишь Design Patterns, изучаешь, вроде круто. А потом читаешь кучу критики паттернов – узнаёшь, что наследование, оказывается, бывает разное (одиночное/множественное, разделение на «наследование реализации» и «реализация интерфейса») – узнаёшь, что полиморфизм бывает разный с совершенно разными свойствами – читаешь про SOLID, какие это правильные принципы, а потом, возможно, находишь критику SOLID, как отдельных его компонентов, так и всего в принципе – может быть, если совсем не повезёт, где-то в этом процессе читаешь Гради Буча, про UML и всё такое, потом обнаруживаешь, что на практике UML почти никто не использует – может, узнаёшь, что ООП бывает и без классов (так называемое prototype-based ООП) – и т.д. и т.п. – ?????? – тонешь в этом океане понятий, принципов, подходов и их толкований разными людьми и реализаций в разных языках. 2) изучение «снизу»: – читаешь, например, SICP – узнаёшь про data directed programming: понимаешь, как (примерно) сделан «ООП-шный полиморфизм» через vmt (virtual method table), как работает и для чего нужен. Теперь ты знаешь, для каких задач и как его применять (и даже реализовать самому, если нужно), независимо от языка, можешь задавать конкретные вопросы и находить конкретные, полезные ответы – узнаёшь про message passing: понимаешь, чем это отличается от vmt, чем ООП Алана Кея отличается от ООП C++. Понимаешь, чем отличаются class-based и prototype-based ООП. На этом этапе уже способен сам реализовать свою простую ООП-систему – в процессе узнаёшь про области видимости, окружения и замыкания, в результате понимаешь, что такое инкапсуляция в принципе, в отрыве от языка, и как это связано с ООП – про наследование там ничего нет, но ты уже понимаешь, что оно не столько определяюще свойство ООП, а лишь удобный инструмент. Легко можешь имитировать простое наследование (точнее это будет делегирование) в своей простой ООП-системе если ООП интересно глубже: – читаешь «A Theory of Objects» Cardelli & Abady — про «внутренню кухню» и формализацию. Вообще узнаёшь много нового. Книга не простая, но хотя бы с парой-другой первых глав ознакомиться стоит. Без привязки к языкам – читаешь «SmallTalk 80» (The Blue Book) — узнёшь, собственно, про объектно-ориентированное программирование, т.е., не про то, как устроены объекты внутри, а как ими пользоваться и с их помощью решать задачи. Хотя, там вроде и про внутреннюю реализацию, хотя и на примере SmallTalk, что, в общем-то не плохо – ????? – PROFIT: знаешь, что такое ООП, на каких конкретных техниках строится, для чего используется, без всяких терминологических споров и разношёрстных толкований Добавлено через 1 минуту 2) И что? Добавлено через 15 минут titan4ik, ещё порекомендую ознакомиться с «Types and Programming Languages» Pierce, книга не очень простая (а есть ещё «Advanced TAPL» =)), но толковая, даже беглое ознакомление будет весьма полезно.
1
|
||||||
|
|
|
| 16.06.2020, 16:27 | |
|
0
|
|
|
Модератор
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
|
|
| 16.06.2020, 17:01 | |
|
В моей подписи 4 книги (sicp, aima, ctm, tpl), которые я считаю классикой программирования. Желательно читать в указанном порядке.
Добавлено через 5 минут sicp - как писать программы aima - основные (ключевые) алгоритмы ctm - подробней о парадигмах tpl - подробней о типах
0
|
|
|
Заблокирован
|
|
| 16.06.2020, 17:31 [ТС] | |
|
0
|
|
| 16.06.2020, 17:31 | |
|
Паттерны vs ООП
Основы Java освоены, понятия, парадигмы, ООП. Читать код могу, понятия есть, но все бы ничего, что дальше? Доходчиво разъясните...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вступаем в новую фазу генерации 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 — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|