|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
|
Правильное ООП и модульность18.02.2014, 17:46. Показов 1792. Ответов 18
Метки нет (Все метки)
Нужны советы опытных программистов.
Решил сделать рефакторинг проекта. Общие правила я знаю и стараюсь следовать им (понятные имена методов, избегание дублирование кода и т.д.). Но хотелось бы разъяснить несколько вопросов. Функции должны быть отделёны от интерфейса. Но стоит ли выносить их все в отдельный модуль? Сейчас, например, они все описаны в юните главной формы в классе формы, а сам модуль поделён на две части: в первой половине описываются события интерфейса, а во второй части методы функциональные. И отсюда второй вопрос: стоит ли выделять отдельный класс для этих методов? Заминка в том, что многие написанные методы работают с определёнными элементами на форме. То есть отдельный модуль уже будет узкоспециализированный. А если переписать их, добавив параметры, то это существенно снизит удобность. Вместо DoSmth придётся каждый раз писать DoSmth(AVar1, Avar2, Avar3).
0
|
|
| 18.02.2014, 17:46 | |
|
Ответы с готовыми решениями:
18
Правильное ООП построение класса Aeroflot Модульность и интегрированность Подключение файла к проекту, модульность |
| 18.02.2014, 17:49 | |
|
Не по теме:
0
|
|
|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
|
| 18.02.2014, 18:10 [ТС] | |
|
Не скажу, что прям уж совсем не по теме)
Идея понятна — в погоне за красотой кода есть риск чрезмерно усложнить архитектуру программы, не говоря уже о потраченном времени. Но всё же какой вариант предпочтительней (понятно, что первый потребует больше времени, но и ошибки при таком подходе быстрее находятся)? Или истина как всегда посередине?
0
|
|
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
|
| 18.02.2014, 20:25 | |
|
1
|
|
|
|
||||||
| 19.02.2014, 08:44 | ||||||
|
Только, наверное, не функции, а отдельный класс - без привязки к gui. Если вам действительно "придётся каждый раз писать" - храните это в классе. Главное - чтобы в классе не было ничего лишнего. Лишнее в классе в вашем случае - это всё, что относится к gui.
1
|
||||||
|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
||
| 19.02.2014, 22:44 [ТС] | ||
|
Спасибо за советы.
0
|
||
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
||
| 20.02.2014, 01:43 | ||
|
(с) М.Жванецкий P.S. Если бы речь шла о написании учебника по основам ООП или о сферическом коне в вакууме (что почти одно и то же) я бы согласился с таким категоричным заявлением.
0
|
||
|
|
||||||
| 20.02.2014, 08:05 | ||||||
|
Добавлено через 56 минут Ну и возникает вопрос - если вы так хорошо разбираетесь в этом, зачем задаёте вопросы? Или вы хотите получить от публики оправдание вашему говнокоду - "Да, классы действительно не нужны", чтобы на душе приятнее было?
0
|
||||||
|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
||
| 20.02.2014, 11:40 [ТС] | ||
|
0
|
||
|
|
|
| 20.02.2014, 12:02 | |
|
Окончательного учебника не дам, даже не знаю, есть ли таковой.
В качестве дополнения к посту 5 могу только посоветовать написать ваш класс так, чтобы им можно было пользоваться в консольном приложении.
0
|
|
|
Житель Земли
|
|||
| 20.02.2014, 15:01 | |||
|
в данном вопросе нет черного и белого. не стоит категорично заяалять
0
|
|||
|
|
|||
| 20.02.2014, 15:15 | |||
Как будто он изредка возникает, внезапно. А я буду категорично заявлять, уж извините. Потому что знаю, как устроена нормальная программа. Это айсберг, в котором большая, подводная часть - это именно без-гуишный функционал. И таки да, передавать туда gui-шные элементы - это тоже говнокод.
1
|
|||
|
Житель Земли
|
|||
| 20.02.2014, 16:13 | |||
|
0
|
|||
|
|
||
| 20.02.2014, 16:27 | ||
|
Смотрим со стороны gui. Не-гуишный код назовём ядром (просто чтобы как-то назвать). 1. Ничего в ядро не передаём, только получаем. Кстати, самая простая и частая ситуация. 2. Когда в gui не можем отследить момент, что в ядре что-то произошло, а отобразить надо - из gui подписываемся на события ядра. Разумеется, сами события должны быть запрограммированы. Ну и 3. Передавать контол в ядро тоже можно, в некоторых случаях это бывает хорошо, НО! обязательно при этом абстрагируем контрол, чтобы ядро не как конкретный контрол его рассматривало, а как нечто более абстрактное. По хорошему - интерфейс (не в смысле gui, а в смысле IInterface). Имеет смысл, когда класс в ядре только затем и делается, чтобы его рисовать. Добавлено через 1 минуту DenNik, предвижу сарказм про ненужное усложнение. Ну что ж, такова селяви.
0
|
||
|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
|
| 20.02.2014, 21:23 [ТС] | |
|
Распишу более конкретно.
В программе динамически создаются вкладки на Page Control. За это отвечает процедура NewTab без параметров (так как Page Control существует в единственном экземпляре и сразу ясно, где создавать). Согласно вышесказанному, стоит переписать эту процедуру NewTab, передавая ей в качестве параметра нужный Page Control? И аналогично со всеми другими процедурами? И вопрос по поводу свойств. Свойства нужны для работы с полями. Но только ли через них работать? На примере: есть поле типа динамического массива, в котором хранятся ссылки на создаваемые табы. В данном случае я работаю не используя свойства, просто напрямую обращаясь к нужной вкладке: FTabList[I].Key.Name := 'Smth'; В данном случае то мне кажется удобным, при том что само поле описано в секции Private. Или же я просто не понял смысл свойств?
0
|
|
|
|
|||||||
| 21.02.2014, 08:09 | |||||||
|
В TList<T> (Generics.Collections) Ваши данные объединяете в класс, внутри класса список ваших объектов TList<T>. У него уже готово событие OnNotify, на него подписываетесь. В этой процедуре делаете обработку - если появился новый итем, исходя из него уже делаете NewPage.
2
|
|||||||
|
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 54
|
|
| 21.02.2014, 09:17 [ТС] | |
|
Спасибо за идею, попробую реализовать.
0
|
|
|
480 / 253 / 51
Регистрация: 30.06.2010
Сообщений: 651
|
||
| 22.02.2014, 23:55 | ||
|
Долго слежу за темкой.
Во всём согласен с dondublon. Могу добавить ещё такую мысль. Для работы с гуёвыми контролами с целью наполнения данными неких сущностей, можно использовать разные подходы, начиная от обычного MVC и заканчивая Bindings , для чего существуют всякие библиотеки. Для тренировки навыка работы в ООП стоит заморочиться такими вещами. Конечно, в реальных проектах так бывает усложнять некогда и незачем. Но также и бывает, что при необходимости каких-то переделок и доводок могут быть сложности с жёстким кодом, что увеличит время разработки. Гибкость, конфигурируемость и модифицируемость сильно облегчают жизнь, и ооп в этом неслабо помогает. Более того, свойства часть используются для ограничения области видимости и возможностей доступа - например только на чтение. Внутри одного модуля, элементы разных классов конечно видят всю подноготную других классов (кроме случая с модификатором strict), поэтому разделение на модули даст ещё большее повышение надёжности классов - Вы будете уверены что никакой другой код не имеет доступа к внутренностям, а может работать только через публичные методы и свойства только разрешённым образом. Есть ещё одна интересная особенность свойств. Вы можете не иметь под них даже данных (полей), а вычислять значение на лету, в функции, для внешнего же пользователя данного класса, это будет выглядеть как обращение к "переменной", что упрощает понимание. И ещё много всяких тонкостей и особенностей есть. Советую почитать http://delphikingdom.ru/asp/vi... logid=1186
1
|
||
| 22.02.2014, 23:55 | |
|
Помогаю со студенческими работами здесь
19
Модульность в java, объясните пожалуйста новичку Модульность. Программа, ссылающаяся на другую (как реализовать?) Правильное swprintf, правильное wprintf ? Изучаю Python, сейчас учу основы ООП, где можно найти задачи по ООП Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|