Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Заблокирован
1

Сложность абстракции, полиморфизм, дублирование и другие

25.11.2011, 23:57. Показов 4401. Ответов 58
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//структура "матрица"
//Представляет собой обёртку над двухмерным массивом
template<typename TypeT, int _SizeX, int _sizeY>
struct Array2D
{
    Array2D()
    {
        for(int y = 0; y < _sizeY; ++y)
        {
            for(int x = 0; x < _SizeX; ++x)
            {
               Arr[x][y] =  rand()%100 + 1;
            }
        }
    }
    TypeT Arr[_SizeX][_sizeY];
};
 
//создаём 100 штук таких матриц
//каждая матрица будит проинициализирована
//случайными числами
Array2D<int,100,100> SuperArray[100];
 
 
int main()
{
   return 0;
};
Добавлено через 5 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
proger2030, вы читаете, что вам пишут? Используйте трёхмерные массивы (т.е. массивы двухмерных массивов, с логической точки зрения), в самом верхнем цикле перебирая двухмерные массивы, а во вложенных заполняя каждый из них.
Настоятельно не рекомендую использовать трехмерные массивы.
Более того, крайне не рекомендую использовать двухмерные массивы.

Одномерный массив намного проще для понимания, и гибче в управлении.
Его легче трансформировать во всевозможные состояния.

Если так сильно понадобились многомерные массивы - всегда можно инкапсулировать сложность абстракции внутри нового класса.

Массивы массивов намного гибче и проще в плане всевозможных трансформаций/сортировок и тп.
Не придётся голову ломать над глючной адресной арифметикой многомерных массивов.

Всегда нужно стремится понижать сложность архитектуры. Для этого и существуют классы.

 Комментарий модератора 
Корни темы здесь - Как создать 100 массивов разными значениями ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2011, 23:57
Ответы с готовыми решениями:

Одновременное дублирование строк на другие листы по условию
Всех с Новым годом! Есть таблица данных, ежедневно пополняемая! Задача в том, чтобы при пополнении...

Как сделать дублирование изображения формы 2 на первую с компонентом Panel или другие варианты
Как сделать дублирование изображения с формы 2 и обновление его на форме 1 с помощью Panel или...

Как вычислять сложность алгоритма, или найти асимптотическую сложность любой программки?
Например Вычислить x^n по алгоритму быстрого возведения в степень Добавлено через 43 секунды...

Дублирование базы , или дублирование информациии
Доброго времени суток ! Поставлена задача: мне нужно либо при изменении или добавлении данных...

58
Заблокирован
27.11.2011, 13:37  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от volovzi Посмотреть сообщение
Bers, в каком-то смысле вы правы. Вы только объясните, желательно на конкретных примерах, что вы предлагаете взамен полиморфизму. По-моему, всё равно должно получиться всё то же самое, только сложнее (т.к. средства, заложенные в язык, проще по определению).
А я ничего не предлагаю взамен полиморфизму. Там где нужен полиморфизм, используется полиморфизм. Нужно только знать область его применения.

Я лишь пытался объяснить господам в танке разницу между "дублированием кода на с++", и "дублированием функционала на с++"

И на примере того же полиморфизма показать им, что сама по себе технология полиморфизма полностью основана на дублировании кода.

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

Так думают они, тупо копипастя весь полиморфный интерфейс по всем потомкам.
Им же не приходит в голову, что делая копипасту, они уже дублируют код на с++

На с++ создание единообразного интерфейса для разных классов - суть дублирование кода.
В грамотной архитектуре используется везде и повсеместно.

Только господа почему то поставили знак равно между "дублирование кода", и "дублирование функционала". А теперь тупят, не в силах уловить разницу.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2011, 13:45 22
Bers, вы упорно думаете, что дублирование кода плохо как факт, само по себе. С этим и связано то, что вы до сих пор не перебрались в наш тёплый и уютный танк, а морозите задницу снаружи.
1
Заблокирован
27.11.2011, 13:56  [ТС] 23
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, вы упорно думаете, что дублирование кода плохо как факт, само по себе.
Вот поэтому, я и говорю, что вы в танке. Вы русский текст не воспринимаете:

Цитата Сообщение от Bers Посмотреть сообщение
2. Между сложностью решения, и дублированием лично я выбираю второе. Пускай будит уйма дублированного кода, вплоть до хардкорной копипасты, если при этом удастся погасить сложность общего решения. Чем проще архитектура, тем она безопаснее. В таком коде всегда меньше всего ошибок. Его проще сопровождать. Он быстрее конструируется.
Самый простой код - продукт продуманной архитектуры. И бла бла бла.
Цитата Сообщение от Bers Посмотреть сообщение
Даже более того, если нет необходимости интерпретировать абсолютно разные сущности, как одну, но хочется сделать им одинаковый интерфейс для удобства - это тоже уже дублирование кода. Ну и что в этом плохого?
Цитата Сообщение от Bers Посмотреть сообщение
А я не пытаюсь избежать самого по себе дублирования кода. Меня не парит, если у меня будит десяток классов, каждый из которых будут иметь одноименные интерфейсы в своих заголовках.
Я вам 3 раза одно и тоже разными словами пытался донести. До вас так и не дошло, что в самом по себе дублировании кода нет ничего плохого

Впрочем, при грамотном подходе нет ничего плохого и в дублировании функционала.

Например, класс A реализует некий функционал.
Класс Б и класс Цэ наследуются от класса А.

При этом и Б и Цэ унаследовали весь функционал класса А.
В этом так же нет ничего плохого. Если это как то логично обоснованно.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2011, 13:59 24
Bers, так а чего же вы тогда добиваетесь?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.11.2011, 14:01 25
Цитата Сообщение от Bers Посмотреть сообщение
разницу между "дублированием кода на с++", и "дублированием функционала на с++"
Ага. А я когда циклы копипастом вставляю тоже дублирую. Или два раза подряд вызывая алгоритм find, я получается тоже дублирую код. Так можно дойти до маразма...

Фаулер, если мне не изменяет память, выделял три типа дублирования:
  • текстовое;
  • функциональное;
  • временное.
Текстовое - идентичные куски кода. Решается базовыми способами рефакторинга, такими как выделение и повторное использование метода, например. В самом утрированном виде это может выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < items.size(); ++i) {
    if (items[i] == 5) {
          five = i;
          break;
    }
}
 
for (int i = 0; i < items.size(); ++i) {
    if (items[i] == 15) {
          fifteen = i;
          break;
    }
}
Функциональное - собственно то, о чем мы тоже уже говорили. Дву сущности повторяют функционал друг друга, то есть имеют одно предназначение.
C++
1
2
3
4
5
6
7
struct Point2D {
     int x, y;
};
 
struct Point {
    int x, y;
};
Временное - когда некая работа выполняется несколько раз подряд, но смысла в этом нет.
C++
1
2
3
4
5
6
for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
         item = some(src[i]);
         dst[j] += item;
    }
}
C++
1
2
3
4
5
n = some();
x = n + a + b;
 
n = some();
y = n + b + c;
А Вы же говорите о дублировании, которое можно утрировать к тому, что я вынужден каждый раз писать возвращаемый тип для методов. Это бред же какой-то.
0
Заблокирован
27.11.2011, 14:02  [ТС] 26
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, вы упорно думаете, что дублирование кода плохо как факт, само по себе.
О том, что дублирование кода - это плохо, начали говорить вы, а не я. Я же на протяжении всей темы, пытаюсь вам объяснить, что это - нормальное явление на с++

Добавлено через 1 минуту
fasked, вот это вы и объясните тому господину, который и открыл эту ветку.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.11.2011, 14:03 27
Цитата Сообщение от Bers Посмотреть сообщение
Например, класс A реализует некий функционал.
Класс Б и класс Цэ наследуются от класса А.
При этом и Б и Цэ унаследовали весь функционал класса А.
В этом так же нет ничего плохого. Если это как то логично обоснованно.

Почитайте уже хоть какие-то книги по ООП или UML.
0
Заблокирован
27.11.2011, 14:06  [ТС] 28
silent_1991, я ничего не добиваюсь.

Я хочу писать красивый элегантный код. И все.
Если я сталкиваюсь со сложной абстракцией, которая ломает мне мозг, то я стараюсь погасить её сложность за счет создание новой абстракции, и работаю дальше.

Добавлено через 2 минуты
Цитата Сообщение от fasked Посмотреть сообщение
Почитайте уже хоть какие-то книги по ООП или UML.
класс Б и класс Цэ унаследовали весь функционал от класса А
То бишь, и интерфейс, и его реализацию.

Теперь все три класса содержат этот функционал.

Это не очевидно? При этом код на с++ не дублировался, а вот функционал полностью
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.11.2011, 14:10 29
Цитата Сообщение от Bers Посмотреть сообщение
Это не очевидно? При этом код на с++ не дублировался, а вот функционал полностью.
Это бред чистой воды! Базовый класс содержит собственный функционал, наследующие свой собственный.
0
Заблокирован
27.11.2011, 14:12  [ТС] 30
Цитата Сообщение от fasked Посмотреть сообщение
Это бред чистой воды! Базовый класс содержит собственный функционал, наследующие свой собственный.
То есть, по вашему, прямые наследники времени написания исходного кода, получают свой собственный функционал, и к базовому классу уже отношения никакого не имеют, да?

То есть, если я в базовом классе чего нибудь изменю, потомков это никак не затронет?

Кто из нас болен бредом?
может вас стоит почитать книжки? Не то что бы про ООП, а какие нибудь для начинающих?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2011, 14:15 31
Цитата Сообщение от Bers Посмотреть сообщение
О том, что дублирование кода - это плохо, начали говорить вы, а не я.
Ага, плохо.

Цитата Сообщение от Bers Посмотреть сообщение
Я же на протяжении всей темы, пытаюсь вам объяснить, что это - нормальное явление на с++
Вы довели до абсурда понятие дублирования, вот и всё (я ещё в прошлой подобной теме, пару месяцев назад, где вы говорили то же самое, говорил, что так можно сказать, что любой код дублирует любой другой потому, что они из одних и тех же символов состоят).
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.11.2011, 14:15 32
Вы не понимаете смысла слова "дублирование". Перечитайте мой пост, где я приводил примеры. А еще лучше прочитайте Фаулера. Больше мне нечего Вам сказать.
Не понимать (или не хотеть понимать) настолько простых и очевидных вещей и еще что-то говорить о красоте архитектуры. Фэйспалм.

Цитата Сообщение от Bers Посмотреть сообщение
То есть, если я в базовом классе чего нибудь изменю, потомков это никак не затронет?
И не надо переиначивать смысл моих слов.
1
Заблокирован
27.11.2011, 14:19  [ТС] 33
Цитата Сообщение от fasked Посмотреть сообщение
Вы не понимаете смысла слова "дублирование". Перечитайте мой пост, где я приводил примеры. А еще лучше прочитайте Фаулера. Больше мне нечего Вам сказать.
Не понимать настолько простых и очевидных вещей и еще что-то говорить о красоте архитектуры. Фэйспалм.
Я прекрасно понимаю, что такое "дублирование кода", и что такое "дублирование функционала".
А так же, где это дублирование правомерно, а где начинает пахнуть говнокодом.
И делаю принципиальные различия.

А вот вы все в одну кучу мешаете.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ага, плохо.
"дублирование кода плохо", но дублирование кода вот здесь и здесь - это уже абсурд, а вот здесь - это плохо.

Так вы определитесь сначала, когда плохо, а когда нет.
И не мешайте всё в одну кучу.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.11.2011, 14:21 34
Лучший ответ Сообщение было отмечено как решение

Решение

Bers, дублирование - плохо.
Дублирование в Вашем понимании
C++
1
2
3
4
5
class A {
};
 
class B {
};
Безымянный кодер: О, нет! Я продублировал слово class!
Bers: Но это не плохо, здесь это оправданное дублирование кода на C++.
- абсурд. Это уже давно определено и ничего не мешается в кучу.
4
Заблокирован
27.11.2011, 14:48  [ТС] 35
Цитата Сообщение от fasked Посмотреть сообщение
Bers, дублирование - плохо. Дублирование в Вашем понимании - абсурд. Это уже давно определено и ничего не мешается в кучу.
В моём понимании, если вы вообще сделали копипаст, то уже сделали дублирование кода.
Хорошо это или плохо зависит от ситуации.

Если вы считаете, такой копипст - что это не дублирование, возможно ваше "дублирование" в сферическом вакууме пахнет абсурдом.

Тот же Фуллер так же, как и я делает принципиальные различия, и выделяет "плохие дублирования". Даёт им характеристики.

Но тот факт что конкретно взятое "дублирование" - это "правомерное дублирование" Ещё не делает его НЕ_дублированием.
Тоже дублирование, только приемлемое. Вот об этом пишет Фуллер.

А вы как мартышки зазубрили характеристики "плохишей". И считаете, что все, что не попадает по их описание, то и вовсе не дублирование.
Дублирование. Просто приемлемое.

Это понимает каждый, кто дружит со здравым смыслом, а не пытается зубрить авторитетов, как мартышка.
 Комментарий модератора 
2.7 Избегайте грамматических ошибок при написании сообщений.

Не по теме:

Bers, я Вам скоро за грамотность буду карточки раздавать, а потом можете сколько угодно обвинять меня в предрасположенности.



Добавлено через 20 минут
Это типа, если докалебаться больше не до чего, надо докалебаться до грамматики)))

Закрывайте нахрен эту глупую тему.
0
ForEveR
27.11.2011, 15:52
  #36

Не по теме:

Bers, Берс, ты упорно стоишь на своем и не желаешь обдумать точку зрения тех людей, которые тебе пишут. Это грустно. Ты становишься похож на Сыроежку.

0
Заблокирован
27.11.2011, 16:23  [ТС] 37
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Берс, ты упорно стоишь на своем и не желаешь обдумать точку зрения тех людей, которые тебе пишут. Это грустно. Ты становишься похож на Сыроежку.
Ну во-первых, разговор вообще начался с того, что я сказал: если абстракция, с которой нужно работать, слишком сложна для понимания, то её сложность лучше гасить за счет создания дополнительной сущности.

То есть, вместо того, что бы работать со сложно-понимаемым трех-мерным массивом, можно работать с легко-понимаемым одномерным, который в себе будит инкапсулировать двухмерный.

При этом, я специально сделал акцент, что не так важно как именно будит погашена сложность абстракции. На примере 3хмерного массива, это можно сделать за счет вектора векторов, или за счет самоделки. Это не так важно. Как автору кода понятнее будит - так он и сделает. Это зависит от мастерства самого программиста.

И тут начался батхерд! Мне тут же начали тыкать за "дублирование кода".

Хотя тема "понижения сложности абстракции" и тема "дублирование кода" - это вообще перпендикулярные друг другу темы. Которые могут не иметь общих точек соприкосновения.

Вот есть класс, которые реализует определённые услуги для вызывающей стороны.
И с точки зрения ООП, можно рассматривать такой класс, как поставщика услуг.
Например, std::vector реализует работу с динамическим массивом.
То есть он поставляет услугу - удобный механизм работы с динамическим массивом.

Не нужно быть великим специалистом, что бы понимать, что в рамках одного и того же проекта, нет никакого смысла использовать два разных инструмента, которые поставляют одни и те же услуги.

Это все понятно, но это не имеет никакого отношения ни к "дублированию кода", ни к "дублированию функционала", ни к теме "понижение сложности абстракции".
Но у человека каша в голове, все в куче. Он говорит одно, а подразумевает совсем другое.

/ps Сыроежка может быть и занудный тип, но по большому счету то, о чем он говорит - очень правильные слова. Вот чего-чего, а Сыроежка то как раз никогда все в одну кучу не мешает.
Он очень конкретный тип.
0
easybudda
27.11.2011, 16:35
  #38

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
это вообще перпендикулярные друг другу темы. Которые могут не иметь общих точек соприкосновения.
Перпендикулярные - это которые под прямым углом пересекаются.

4
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
27.11.2011, 22:14 39
ForEveR, чисто для объективности: обе стороны изо всех сил пытаются непонять друг друга. Причём, большинство, тупо из стадного инстинкта, — против Берса. Здравое есть и там, и там. Просто некоторые, например, модераторы, думают, что правы априори, т.к. они модераторы (наблюдение из личного опыта).
0
fasked
27.11.2011, 22:26     Сложность абстракции, полиморфизм, дублирование и другие
  #40

Не по теме:

Цитата Сообщение от volovzi Посмотреть сообщение
Здравое есть и там, и там
В споре рождается истина, мой друг.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2011, 22:26

Абстракции
Мои работы в стиле абстракций. Работа выполненная несколько месяцев назад.

Неопределенность в абстракции
Добрый день. Есть класс A от которого производится класс В и С. У этих классов есть общий...

Абстракция, уровни абстракции
Как понять это? Может кто-нибудь объяснить более доступным и понятным языком нежели википедия?

Entity Framework и абстракции
Можно сказать &quot;новичковый&quot; вопрос :) Есть сущности, созданные из базы данных. Database First. К...

Задачка с использованием абстракции
Добрый день! подскажите(объясните:)) пожалуйста, что еще необходимо сделать с данной задачей с...

Изучение инкапсуляции и абстракции
Всем доброго вечера у меня очередная лабораторка. Завдання. Створити на мові Java клас, який...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru