Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

25.11.2011, 23:57. Просмотров 2646. Ответов 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 массивов разными значениями ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложность абстракции, полиморфизм, дублирование и другие (C++):

Неопределенность в абстракции - C++
Добрый день. Есть класс A от которого производится класс В и С. У этих классов есть общий метод f1(). у класса B не...

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

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

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

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

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

58
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.11.2011, 14:15 #31
Цитата Сообщение от Bers Посмотреть сообщение
О том, что дублирование кода - это плохо, начали говорить вы, а не я.
Ага, плохо.

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

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

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

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

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

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

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

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

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

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

Не по теме:

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



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

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

Не по теме:

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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

0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.11.2011, 23:36 #41
fasked, мощно сказано.
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
28.11.2011, 00:45 #42
Цитата Сообщение от volovzi Посмотреть сообщение
Причём, большинство, тупо из стадного инстинкта, — против Берса. Здравое есть и там, и там. Просто некоторые, например, модераторы, думают, что правы априори, т.к. они модераторы
Ерунда полная. И
Цитата Сообщение от volovzi Посмотреть сообщение
чисто для объективности
ForEveR не модератор. Может причина в том, что большинство в данном случае правильно говорит?

Цитата Сообщение от Bers Посмотреть сообщение
Это типа, если докалебаться больше не до чего, надо докалебаться до грамматики
Bers, Вы, конечно, не обижайтесь, но складывается мнение, что безграмотность - ваше кредо. Вот Вам два простых примера:
C++
1
2
3
4
5
6
7
8
9
//...
const int SIZE(3);
int arr[SIZE] = { 1, 2, 3 };
for ( int i = 0; i < SIZE; ++i )
    std::cout << arr[i] << ' ';
//some changes 
for ( int i = 0; i < SIZE; ++i )
    std::cout << arr[i] << ' ';
//...
C++
1
2
3
4
5
6
7
8
9
10
//...
void dump(const int * arr, size_t size, std::ostream & ost){
    while ( size-- )
        ost << *arr++ << ' ';
}
//...
int arr[SIZE] = { 1, 2, 3 };
dump(arr, SIZE, std::cout);
//some changes
dump(arr, SIZE, std::cout);
В первом есть дублирующийся код, хоть и набран подряд, во втором дублирующегося кода нет не смотря на то, что второй вызов функции скопирован и вставлен.
1
Bers
Заблокирован
28.11.2011, 00:54  [ТС] #43
Цитата Сообщение от easybudda Посмотреть сообщение
В первом есть дублирующийся код, хоть и набран подряд, во втором дублирующегося кода нет не смотря на то, что второй вызов функции скопирован и вставлен.
А этого второго вызова функции в исходном коде нет? То есть сам вызов никак не продублирован?

И сам по себе вызов функции - это не код? Это так.. это "не считается" за код, да?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
28.11.2011, 01:14 #44
Цитата Сообщение от Bers Посмотреть сообщение
А этого второго вызова функции в исходном коде нет? То есть сам вызов никак не продублирован?
И сам по себе вызов функции - это не код? Это так.. это "не считается" за код, да?
Вот и не знаю - смешно это, или грустно...
По логике программы массив должен два раза выводиться. Первый раз перед изменениями, второй - после. Существенная разница в том, что при изменении вывода (вдруг оказалось, что массив нужно задом на перёд выводить, или поля вывода нужно определённой ширины сделать, да ещё с ведущими нулями, etc...) в первом случае изменения прийдётся в двух местах вносить, а во втором - только в функции вывода. По-моему очень неплохо сначала в таких простых моментах разобраться, а уж потом абстрактные сущности разделять...
0
Bers
Заблокирован
28.11.2011, 01:15  [ТС] #45
Цитата Сообщение от easybudda Посмотреть сообщение
Вот и не знаю - смешно это, или грустно...
Вы не ответили на вопрос.
0
28.11.2011, 01:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 01:15
Привет! Вот еще темы с ответами:

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

Права доступа, уровень абстракции - C# MVC
Использую Asp.net 4, в качестве провайдера доступа использую пока свой, похожий на membership. В БД есть: 1)таблица Users, в ней есть...

Разработка гибкой абстракции больших масштабов - PHP
Не уверен что нужный форум, но лучшего не нашел. ,Возможно термины буду применять не совсем корректно, надеюсь все поймут. Есть некая идея...

Интерфейс для абстракции доступа к данным - Java EE
Доброго времени суток, форумчане! Объясните мне пожалуйста, как начинающему, на пальцах, как пользоваться фреймворком Spring...


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

Или воспользуйтесь поиском по форуму:
45
Закрытая тема Создать тему
Опции темы

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