|
Заблокирован
|
|||||||||||||
Сложность абстракции, полиморфизм, дублирование и другие25.11.2011, 23:57. Показов 5461. Ответов 58
Метки нет (Все метки)
Более того, крайне не рекомендую использовать двухмерные массивы. Одномерный массив намного проще для понимания, и гибче в управлении. Его легче трансформировать во всевозможные состояния. Если так сильно понадобились многомерные массивы - всегда можно инкапсулировать сложность абстракции внутри нового класса. Массивы массивов намного гибче и проще в плане всевозможных трансформаций/сортировок и тп. Не придётся голову ломать над глючной адресной арифметикой многомерных массивов. Всегда нужно стремится понижать сложность архитектуры. Для этого и существуют классы.
0
|
|||||||||||||
| 25.11.2011, 23:57 | |
|
Ответы с готовыми решениями:
58
Одновременное дублирование строк на другие листы по условию Как сделать дублирование изображения формы 2 на первую с компонентом Panel или другие варианты Как вычислять сложность алгоритма, или найти асимптотическую сложность любой программки? |
|
|
|
| 26.11.2011, 00:30 | |
Сообщение было отмечено как решение
Решение
Bers, если Вы так настоятельно рекомендуете, то за Вас уже давно постарались: есть std::vector, есть std::array. Смысла писать собственный костыль по имени Array2D я не вижу. То есть я настоятельно рекомендую пользоваться классами стандартной библиотеки! Чтобы избежать возникновения вероятных ошибок. Я повторяю, я настоятельно рекомендую!
3
|
|
|
Заблокирован
|
||
| 26.11.2011, 00:47 [ТС] | ||
|
Очень важно знать как это можно сделать. И знать, когда это нужно применять. А вот что именно вы там используете в основе новой абстракции - вектор векторов, или собственный велосипед - это уже личное дело каждого, и к идее моей рекомендации отношения не имеет. Я не зря написал "не суть". Смысл моей идеи прост: "разделяй и властвуй". А по поводу вектора - оставьте свои рекомендации для новичков. Мне об этом говорить не нужно.
0
|
||
|
|
||
| 26.11.2011, 00:51 | ||
|
0
|
||
|
Заблокирован
|
||
| 26.11.2011, 00:59 [ТС] | ||
|
2. Между сложностью решения, и дублированием лично я выбираю второе. Пускай будит уйма дублированного кода, вплоть до хардкорной копипасты, если при этом удастся погасить сложность общего решения. Чем проще архитектура, тем она безопаснее. В таком коде всегда меньше всего ошибок. Его проще сопровождать. Он быстрее конструируется. Самый простой код - продукт продуманной архитектуры. И бла бла бла. 3. Элегантное решение с применением того же самого полиморфизма порождает очень много дублированного кода. Но никого это особо не парит. Что характеризует.
0
|
||
|
|
||||
| 26.11.2011, 01:06 | ||||
|
0
|
||||
|
Заблокирован
|
||||||||
| 26.11.2011, 01:30 [ТС] | ||||||||
|
Но если в проекте присутствует только велосипед, или только вектор, то ни о каком дублировании уже нет и речи.
Хотя, если по задумке не требуется интерпретировать объекты типа ConcreteA и ConcreteB как одну и ту же сущность, то полиморфизм тут вообще не нужен будит. Тем не менее, они дублируют интерфейсы друг друга.
0
|
||||||||
|
|
||||
| 26.11.2011, 01:36 | ||||
![]()
0
|
||||
|
Заблокирован
|
|||
| 26.11.2011, 01:51 [ТС] | |||
|
Весь полиморфный интерфейс дублируется подчастую, во всех потомках. Даже более того, если нет необходимости интерпретировать абсолютно разные сущности, как одну, но хочется сделать им одинаковый интерфейс для удобства - это тоже уже дублирование кода. Ну и что в этом плохого?
0
|
|||
|
|
|||
| 26.11.2011, 01:57 | |||
|
0
|
|||
|
Заблокирован
|
|||||
| 26.11.2011, 02:38 [ТС] | |||||
|
Меня даже не парит, если они будут иметь одноименные методы + одноименные реализации этих методов, если это позволит избежать усложнения архитектуры. И меня не парит, если некоторые из классов будут содержать одинаковые данные члены. Главное требование - красивая и логичная архитектура. Решение задач в рамках заявленных требований. Добавлено через 1 минуту
0
|
|||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 26.11.2011, 23:39 | ||
|
Bers,
Во всех потомках (или почти во всех) должен быть РАЗНЫЙ код.
0
|
||
|
Заблокирован
|
||
| 26.11.2011, 23:49 [ТС] | ||
|
Только реализация интерфейса? А заголовки, наверное, компилятор сам за программиста пишет? Он мысли программиста читает, и сам весь полиморфный интерфейс в потомков втыкает?
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 27.11.2011, 00:07 | ||||||
Сообщение было отмечено как решение
Решение
Bers, Пример приведи. Я тебя не понимаю.
0
|
||||||
|
Заблокирован
|
|
| 27.11.2011, 00:30 [ТС] | |
|
ForEveR, ну я на самом деле уже догадываюсь, почему непонятка вышла.
1. Класс имеет: прототипы методов, и реализацию этих прототипов (не всегда, и не для всех методов) Класс не обязан содержать реализацию своего интерфейса, и тогда его называют "чисто-абстрактным классом". То есть, это интерфейс - суть набор прототипов методов, которые будут реализовывать потомки. Ну так вот, список всех прототипов - это интерфейс класса. а реализация этих прототипов - это реализация интерфейса класса. То есть, под словом "интерфейс" лично я подразумеваю именно набор прототипов, а не набор прототипов + их реализации. А вы походу, думаете, что интерфейс это и прототипы, и реализация. 2. Код на с++ - это все символы из которых конструируется код в терминах с++, включая комментарии. Заголовок класса - такой же полноценный код на с++, как и реализация этого класса. И дублирование интерфейса (прототипов) полиморфного потомка является дублированием кода написанного на с++. Существует множество способов, как можно избежать этого дублирования. Самый простой и убогий - это например препроцессор (прототипы в отдельном хедере, и инклюдяццо везде, где они нужны) Одно из моих достижений в этой области - использование кодо-генераторов на макросах с автоматической "чисткой". То есть, класс создаётся по некоторому шаблону, при помощи макроса. Но такая запись крайне не читабельная, и ущербна в плане сопровождения. Однако после первой же удачной компиляции срабатывает "чистка", и вместо "непонятного макроса" в файле оказывается полноценный класс, со всеми своими данными-членами и прочим. Это тоже дублирование кода, но оно происходит автоматически, и не отбирает у программиста много времени. При помощи макросов можно автоматизировать развертку целых архитектур. Очень быстро создавать заготовки-паттерны, и тп. Например, с помощью кодо-генераторов на макросах удалось реализовать идиому "манипулятивных классов" - как одну из возможных замечательных альтернатив полиморфизму. Смысл которой: если нужно обрабатывать одни и те же данные, но только разными способами, не обязательно городить огород из полиморфов, а можно просто сделать несколько различных обработчиков, умеющих "подключатся" к данным и делать над ними действия. В данный момент, мне что бы создать очередную заготовку под манипулятор, нужно написать только три строчки макроса.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 27.11.2011, 00:43 | |
|
Bers, блин, ну обсуждали же уже пару месяцев назад всё это. Вы бред говорите, это уже на уровне фанатизма. То, о чём вы говорите, не подпадает под дублирование кода.
0
|
|
|
Заблокирован
|
||
| 27.11.2011, 00:50 [ТС] | ||
|
Но не нужно путать понятие "дублирование кода" с понятием "дублирование функционала" А вы мне говорите, что дублирование кода на с++ к дублированию кода не относится. То есть, копипаста интерфейсов - это типа не дублирование кода? Ну-ну
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 27.11.2011, 01:11 | |
2
|
|
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
| 27.11.2011, 01:38 | |
|
Bers, в каком-то смысле вы правы. Вы только объясните, желательно на конкретных примерах, что вы предлагаете взамен полиморфизму. По-моему, всё равно должно получиться всё то же самое, только сложнее (т.к. средства, заложенные в язык, проще по определению).
0
|
|
|
|
|||||||||
| 27.11.2011, 13:04 | |||||||||
0
|
|||||||||
| 27.11.2011, 13:04 | |
|
Помогаю со студенческими работами здесь
20
Дублирование базы , или дублирование информациии Абстракции Неопределенность в абстракции Абстракция, уровни абстракции
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник 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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|