Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Bers
Заблокирован
25.11.2011, 23:57     Сложность абстракции, полиморфизм, дублирование и другие #1
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 массивов разными значениями ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 23:57     Сложность абстракции, полиморфизм, дублирование и другие
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

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

При этом и Б и Цэ унаследовали весь функционал класса А.
В этом так же нет ничего плохого. Если это как то логично обоснованно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.11.2011, 13:59     Сложность абстракции, полиморфизм, дублирование и другие #24
Bers, так а чего же вы тогда добиваетесь?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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;
А Вы же говорите о дублировании, которое можно утрировать к тому, что я вынужден каждый раз писать возвращаемый тип для методов. Это бред же какой-то.
Bers
Заблокирован
27.11.2011, 14:02  [ТС]     Сложность абстракции, полиморфизм, дублирование и другие #26
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, вы упорно думаете, что дублирование кода плохо как факт, само по себе.
О том, что дублирование кода - это плохо, начали говорить вы, а не я. Я же на протяжении всей темы, пытаюсь вам объяснить, что это - нормальное явление на с++

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

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

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

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

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

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

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

Кто из нас болен бредом?
может вас стоит почитать книжки? Не то что бы про ООП, а какие нибудь для начинающих?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.11.2011, 14:15     Сложность абстракции, полиморфизм, дублирование и другие #31
Цитата Сообщение от Bers Посмотреть сообщение
О том, что дублирование кода - это плохо, начали говорить вы, а не я.
Ага, плохо.

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

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

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

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

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

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

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

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

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

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

Не по теме:

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



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

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

Не по теме:

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.11.2011, 22:14     Сложность абстракции, полиморфизм, дублирование и другие #39
ForEveR, чисто для объективности: обе стороны изо всех сил пытаются непонять друг друга. Причём, большинство, тупо из стадного инстинкта, — против Берса. Здравое есть и там, и там. Просто некоторые, например, модераторы, думают, что правы априори, т.к. они модераторы (наблюдение из личного опыта).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 22:26     Сложность абстракции, полиморфизм, дублирование и другие
Еще ссылки по теме:

C++ Небольшая сложность
Полиморфизм C++
C++ Полиморфизм в с++

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

Или воспользуйтесь поиском по форуму:
fasked
27.11.2011, 22:26     Сложность абстракции, полиморфизм, дублирование и другие
  #40

Не по теме:

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

Yandex
Объявления
27.11.2011, 22:26     Сложность абстракции, полиморфизм, дублирование и другие
Закрытая тема Создать тему
Опции темы

Текущее время: 15:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru