|
Заблокирован
|
|
ООП - парадигмы, паттерны, подходы - кратко и доходчиво03.06.2020, 16:34. Показов 17687. Ответов 153
Метки нет (Все метки)
Я не проф программист и никогда им не буду (старый уже). Потихоньку что-то читал и делал на c# WPF. Получалось, работало, но это были относительно простые штуковины и собственно ОПП там особо не использовалось. Но ту взялся сделать (для себя) более сложную штуковину и увидел, что не сделал ещё и малой части, а уже приходится неоднократно переписывать почти всё заново. Чё-то не очень получается делать ладные "кирпичики", из которых будут строиться блоки программы, а из блоков постепенно усложняться большое здание программы. Постоянно что-то "подпиливаю" в кирпичиках и даже их заменяю. Если так и дальше пойдет, то я эту штуку никогда не сделаю. Оказалось, что это очень не просто правильно сделать модель предметной области, правильно определиться со способами реализациями идей, правильно разбить программу на какие-то правильно взаимодействующие части. К тому же, c# имеет богатый функционал средств. Одно и то же можно сделать по разному. Постоянно встает проблема выбора - и так можно и эдак... Код поначалу всё терпит)
В итоге оказалось, что "что-то не так" - очевидно не хватает каких-то системных знаний. Сама задача достаточно стандартная - анализ исторических данных биржевых курсов акций, выработка и реализация торговых стратегий и т.д. Это интересно, но чувствую, что что-то идёт не так) Забавно, что в рамках процедурного программирования достаточно быстро "слепил" один небольшой кусочек программы и частично оттестировал микроидею. Усложнять далее в рамках процедурного подхода было уже не рационально. Поэтому стал переписывать в рамках подхода ООП. Это заняло гораздо больше времени и никак не закончу). Постоянно что-то переделываю. Честно говоря, не ожидал, что возникнут такие принципиальные трудности. Одного здравого смысла и соображалки явно не достаточно. И шо же делать?) Изучить все парадигмы, подходы, паттерны программирования, чтобы потом легко выбирать нужные? Это конечно правильный, но очень долгий путь. Что подскажут профессионалы? Может есть какой-то не оч объемный (страниц 100 - 200) "тот самый" фолиант, или статья, или блог, или ещё что, который мне тут может помочь? Как-то подтолкнёт в нужном направлении. А далее уже методом проб и ошибок - путём набора опыта.
0
|
|
| 03.06.2020, 16:34 | |
|
Ответы с готовыми решениями:
153
Парадигмы: императивная vs ООП
Подходы к разработке ПО и их связь с ООП |
|
Заблокирован
|
|||
| 15.06.2020, 18:11 [ТС] | |||
|
Это я о личной яхте длиной в футбольное поле (и стоимостью в миллион добрых дел) подумал. Тут явно чей-то указующий перст просматривается, который корректирует естественные процессы. Добавлено через 50 секунд
0
|
|||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||
| 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,781
|
|||||||||||
| 15.06.2020, 19:36 | |||||||||||
Добавлено через 4 минуты
0
|
|||||||||||
|
|
|||||||||
| 15.06.2020, 19:56 | |||||||||
Ну а то что есть споры и разногласия - не понимаю почему вас это смущает? Да, задачи можно решать разными способами. Разве в других парадигмах не точно также? Разве в структурном программировании есть единый и правильный способ решения задач? Если вам не нравится ООП, ну не используйте его. Я не собираюсь быть адвокатом ООП. Могу лишь заметить, что лично мне ООП (плюс весь набор паттернов, построенных поверх него) позволяет успешно решать мои задачи. Что еще нужно? Ну не нужно, так не используйте. Мы вообще-то про то и говорим, что иногда есть смысл в анемичных моделях, иногда - в rich.
0
|
|||||||||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
|
|||||||
| 15.06.2020, 20:15 | |||||||
|
Даже в предложенном мной примере с тремя объектами, вместо того, чтобы предположить, что тут может подойти другой подход (или хотя бы не классическое ООП), ты всё равно попытался использовать привычный инструмент. =) Добавлено через 1 минуту
0
|
|||||||
| 16.06.2020, 00:30 | |
|
Не по теме:
0
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||
| 16.06.2020, 01:03 | |||
|
В первом случае (АТД) инкапсуляция не нарушается (всё собрано в одном модуле или классе). И в этом случае одинаково удобны и анемичные, и рич модели... и можно вообще без классов обойтись, так как АТД не имеют никакого отношения к ООП. Во втором случае (анемичная модель и служба) инкапсуляция не нужна. Бизнес-логика скрыта в "классах служб", а с данными работают все кому не лень - включая автомапперы, сериализаторы, (декларативные) "автовалидаторы", ORM и так далее.
0
|
|||
|
Заблокирован
|
||
| 16.06.2020, 01:15 [ТС] | ||
|
Да, Может. И некий узел машины может состоять из одной детали. Но, как правило, это не так. Модуль - это блок, который определяется именно функционалом. А структурная сложность модуля может быть любой. Если я правильно понимаю смысл понятия "модуль" с точки зрения русского языка в коннотации науки и техники. Хотя, может быть, у айтишников всё иначе. Кто вас знает). У вас много терминов переводных калькированных убогими переводчиками-филологами - всё так и прижилось - "не по-русски" написанным.
0
|
||
|
|
||||||||||||
| 16.06.2020, 12:36 | ||||||||||||
|
Более современный взгляд на модуль: функции + структуры + интерфейсы. Уже три компонента. Раньше был один: функции, и сейчас пришли к трем.. Вопрос в том, правильная ли эволюция развития понятия "модуль", "класс".. Вопрос, также в способах ухода от сложности и прихода к неэффективности. Что понятней и эффективней?:
В первом случае необходимо еще создать перечисление имен для функции "приготовить" (не показано). К тому же при каждом вызове приходится тратить время на переключение для поиска подходящего варианта. примерно то же самое происходит в ООП незаметно от глаза программистов. Во втором случае мы вызываем необходимую функцию сразу, и не тратим время на выбор вариантов в функции, а просто делаем необходимую нам работу. Enum не нужен. Вот это то, что я называю компонентом. Компонент делает только одно дело. И за этим надо следить. Эти компоненты пользуются услугами других компонентов общих для всех остальных.
0
|
||||||||||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||
| 16.06.2020, 13:04 | ||
|
0
|
||
|
Заблокирован
|
|
| 16.06.2020, 13:19 [ТС] | |
|
Господа айтишники, после чтения ваших сообщений (не только в этой теме) встаёт закономерный вопрос. Скажите пожалуйста, а нет ли такого букваря (глоссария, словаря) в котором все термины программирования трактуются однозначно и он признан "скрижалью" сообществом программистов?
Это должна быть книга по теории программирования без привязки к ЯП. А то у вас наблюдается настоящее вавилонское столпотворение. Вам для того, даже чтобы просто понять друг друга, нужно сначала определяться в терминах какой области программирования вы общаетесь. Иначе - бардак. Такое бывает, когда практика шагает семимильными шагами (в разные стороны) впереди теории. P.S. Я уж не говорю о сленге, который в общем-то, как правило, объединяет специалистов и позволяет им быстрее понять друг друга. Тут же... Хуже всего когда сленг используют люди, которые слабо себе представляют что стоит за этими терминами. И которые нормальных терминов (не сленговых) не знают.
0
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|
| 16.06.2020, 14:09 | |
|
Авторы книг по разным языкам используют разную терминологию. Так исторически сложилось.
Добавлено через 4 минуты Можете попробовать почитать "Concepts, Techniques, and Models of Computer Programming" (можно найти и на русском). Хотя, возможно, она покажется Вам скучной.
1
|
|
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
|
||||||||||
| 16.06.2020, 14:34 | ||||||||||
1
|
||||||||||
|
|
||
| 16.06.2020, 15:12 | ||
|
0
|
||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
|
||||||
| 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
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|
| 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 освоены, понятия, парадигмы, ООП. Читать код могу, понятия есть, но все бы ничего, что дальше? Доходчиво разъясните...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 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), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|