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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Bers
Заблокирован
#1

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

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

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++
Добрый день. Есть класс A от которого производится класс В и С. У этих классов есть общий метод f1(). у класса B не...

Чего стоит использование абстракции типов данных? - C++
Здравствуйте! Я ещё зелёный в этом деле, только учусь (на первом курсе), и после изучения структур и классов я их использую везде! Они...

Создать базовый класс, использовать свойства полиморфизма и абстракции - C++
Создать базовый класс &quot; Транспортное средство&quot; и производные классы: &quot;Автомобиль&quot;, &quot;Мопед&quot;, &quot;Велосипед&quot;. Посчитать время и стоимость...

Полиморфизм :( - C++
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает...

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...

Полиморфизм - C++
Сколько я не читал книг и уроков по С++-программированию, я так и не смог понять что такое полиморфизм. Можно ли как-то просто и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.11.2011, 00:43     Сложность абстракции, полиморфизм, дублирование и другие #16
Bers, блин, ну обсуждали же уже пару месяцев назад всё это. Вы бред говорите, это уже на уровне фанатизма. То, о чём вы говорите, не подпадает под дублирование кода.
Bers
Заблокирован
27.11.2011, 00:50  [ТС]     Сложность абстракции, полиморфизм, дублирование и другие #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Bers, блин, ну обсуждали же уже пару месяцев назад всё это. Вы бред говорите, это уже на уровне фанатизма. То, о чём вы говорите, не подпадает под дублирование кода.
Я говорю, что дублирование кода на языке с++ никого особо не парит.
Но не нужно путать понятие "дублирование кода" с понятием "дублирование функционала"

А вы мне говорите, что дублирование кода на с++ к дублированию кода не относится.

То есть, копипаста интерфейсов - это типа не дублирование кода? Ну-ну
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.11.2011, 01:11     Сложность абстракции, полиморфизм, дублирование и другие #18
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.11.2011, 01:38     Сложность абстракции, полиморфизм, дублирование и другие #19
Bers, в каком-то смысле вы правы. Вы только объясните, желательно на конкретных примерах, что вы предлагаете взамен полиморфизму. По-моему, всё равно должно получиться всё то же самое, только сложнее (т.к. средства, заложенные в язык, проще по определению).
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.11.2011, 13:04     Сложность абстракции, полиморфизм, дублирование и другие #20
Цитата Сообщение от Bers Посмотреть сообщение
какого такого уровня?
Я имел в виду ту тему, из которой этот разговор вышел.
Цитата Сообщение от Bers Посмотреть сообщение
Класс не обязан содержать реализацию своего интерфейса, и тогда его называют "чисто-абстрактным классом".
Правда? Я то всегда думал, что абстрактный класс - тот, который имеет хотя бы один чисто виртуальный метод.

Цитата Сообщение от Bers Посмотреть сообщение
То есть, класс создаётся по некоторому шаблону, при помощи макроса.
Еще бы она была не ущербна. Мне ведь не нужно копировать вообще все прототипы функций.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <memory>
#include <iostream>
 
class Base {
public:
   virtual ~Base() = 0;
 
   virtual void foo() {
      std::cout << "base foo " << std::endl;
   }
   
   virtual void bar() {
      std::cout << "base bar " << std::endl;
   }
   
   virtual void quz() {
      std::cout << "base quz " << std::endl;
   }
};
 
Base::~Base() { }
 
class Derived1 : public Base {
public:
   virtual ~Derived1() { 
   }
   
   virtual void quz() {
      std::cout << "derived 1 quz " << std::endl;
   }
};
 
class Derived2 : public Base {
public:
   virtual ~Derived2() { 
   }
   
   virtual void bar() {
      std::cout << "derived 2 bar " << std::endl;
   }
};
 
void foo(Base *p) {
   p->quz();
   p->foo();
   p->bar();
}
 
int main() {
   Base *p1 = new Derived1();
   Base *p2 = new Derived2();
      
   foo(p1);
   foo(p2);
   
   delete p1;
   delete p2;
   
   return 0;
}
Ну и можно сказать, что методов в базовом классе может быть вообще-то больше чем два или три. И они могут быть гораздо сложнее.
Bers
Заблокирован
27.11.2011, 13:37  [ТС]     Сложность абстракции, полиморфизм, дублирование и другие #21
Цитата Сообщение от volovzi Посмотреть сообщение
Bers, в каком-то смысле вы правы. Вы только объясните, желательно на конкретных примерах, что вы предлагаете взамен полиморфизму. По-моему, всё равно должно получиться всё то же самое, только сложнее (т.к. средства, заложенные в язык, проще по определению).
А я ничего не предлагаю взамен полиморфизму. Там где нужен полиморфизм, используется полиморфизм. Нужно только знать область его применения.

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

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

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

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

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

Только господа почему то поставили знак равно между "дублирование кода", и "дублирование функционала". А теперь тупят, не в силах уловить разницу.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.11.2011, 13:59     Сложность абстракции, полиморфизм, дублирование и другие #24
Bers, так а чего же вы тогда добиваетесь?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.11.2011, 14:03     Сложность абстракции, полиморфизм, дублирование и другие #27
Цитата Сообщение от Bers Посмотреть сообщение
Например, класс A реализует некий функционал.
Класс Б и класс Цэ наследуются от класса А.
При этом и Б и Цэ унаследовали весь функционал класса А.
В этом так же нет ничего плохого. Если это как то логично обоснованно.

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

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

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

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

Это не очевидно? При этом код на с++ не дублировался, а вот функционал полностью
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.11.2011, 14:10     Сложность абстракции, полиморфизм, дублирование и другие #29
Цитата Сообщение от Bers Посмотреть сообщение
Это не очевидно? При этом код на с++ не дублировался, а вот функционал полностью.
Это бред чистой воды! Базовый класс содержит собственный функционал, наследующие свой собственный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 14:12     Сложность абстракции, полиморфизм, дублирование и другие
Еще ссылки по теме:

Полиморфизм - C++
Здравствуйте :) Я пытался читать про полиморфизм. Читал-читал, но не очень дошло. Понял, что можно переопределить виртуальную функцию...

Полиморфизм - C++
Прочитал в Википедии что такое полиморфизм: Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». ...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

Полиморфизм - C++
полиморфизм runtime vs compile polymorphism: как вы на проектах определяете, когда стоит пользоваться шаблоном, а когда...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...


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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
27.11.2011, 14:12  [ТС]     Сложность абстракции, полиморфизм, дублирование и другие #30
Цитата Сообщение от fasked Посмотреть сообщение
Это бред чистой воды! Базовый класс содержит собственный функционал, наследующие свой собственный.
То есть, по вашему, прямые наследники времени написания исходного кода, получают свой собственный функционал, и к базовому классу уже отношения никакого не имеют, да?

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

Кто из нас болен бредом?
может вас стоит почитать книжки? Не то что бы про ООП, а какие нибудь для начинающих?
Yandex
Объявления
27.11.2011, 14:12     Сложность абстракции, полиморфизм, дублирование и другие
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru