Войти
ПрограммированиеФорумОбщее

Прозрачность кода в C++ (2 стр)

Страницы: 1 2 3 421 Следующая »
#15
16:57, 27 июня 2009

Шаблонов не трогайте. Это святое.
Нет, серьезно. Это же великолепный инструмент. Особенно если нет других или ими нельзя пользоваться.


#16
17:07, 27 июня 2009

Sh.Tac.
Компилятор не пишет программу за программиста!

> читай Александреску : )))
> вряд ли я сумею рассказать лучше

Я его читал...

#17
18:05, 27 июня 2009

Разумеется, компилятор пишет программу за программиста.
Пример. Пусть нужно используя только тип float просуммировать ряд чисел из 100 миллинов элементов.
Ваше решение?

#18
18:06, 27 июня 2009

Executor
>Я его читал...

я когда первый раз увидел книгу на полке, не стал её покупать
в самом деле, ну что можно сказать нового о паттернах после GoF?

я это всё знаю сказал я себе и машинально поставил книгу обратно на полку

потом спустя какое-то время до меня начали доходить отголоски и мнения касательно этой книги, что это действительно новое слово в программировании

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

неприятие было ровно такое же
какие-то абстрактные заумные закорючки

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

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

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

на работе я пытался "ошаблонить" некоторые текущие задачки, но получалось как-то громозко неклюже, и главное совсем не к месту, код прекрасно смотрелся и работал без этого

параллельно я опять читал Александреску чтобы понять что я делаю не так

так продолжалось до тех пор, пока я не перешёл в контору, где лид-архитект работал в парадигме GP
признаться я и раньше заглядывал в исходники STL и boost и обилие шаблонов всегда вымораживало
какие-то вещи казались просто магией, например пустые шаблоны, содержащие в себе лишь typedef
если такую пустую конструкцию убрать,
то компилятор начинал выдавать километры невнятных сообщений

а тут я увидел прямо в коде игрового сервера феерический веер шаблонов
отступать было некуда
пришлось сесть и разбираться
и тут я увидел на практике КАК это работает

первую же мою задачу я старался выдержать в духе увиденного, параллельно сверяясь с Александреску, я честно нахреначил две стратегии, одна из которых так потом и не пригодилась, и постарался написать код, просто визуально похожий, лаконичный, с кучей угловых скобочек и двойных двоеточий, благо что исходными "кубиками" послужил boost где такого добра навалом

дальше больше и вуаля, я взял барьер непонимания обобщённого программирования, и это РАБОТАЛО

сейчас честно скажу, я разумно-осознанно (а не механически как раньше) дочитал Александреску лишь до конца третьей главы
и этого вполне достаточно:
списки типов
шаблонные шаблонные параметры шаблонов которые есть только в С++
и два генератора GenScatterHierarchy и GenLinearHierarchy

с этим нехитрым набором (+ ассерты, в т.ч. статические) можно и впрямь перекладывать львиную долю работы на компилятор : ))

#19
18:19, 27 июня 2009

Не уметь использовать феерический веер шаблонов.
Уметь использовать феерический веер шаблонов.
Уметь не использовать феерический веер шаблонов.

Ты сделал всего один шаг, можно сделать еще один.

#20
18:31, 27 июня 2009

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

но поковырявшись по работе в драйверах как-то разочаровался, там нет ничего интересного и присутствует большая куча быстрого кода с массой ифдефов и магических чисел

в графике разочаровываться не хочется : )))

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

#21
18:47, 27 июня 2009

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

#22
18:55, 27 июня 2009

О. Федор
> Пример. Пусть нужно используя только тип float просуммировать ряд чисел из 100
> миллинов элементов.
> Ваше решение?

Если я верно тебя понял:

float f = getNum();
while (not endOfNums())
{
  f += getNum();
  nextNum();
}
#23
18:59, 27 июня 2009

Executor
Ты проверял этот код? Он загнется на первом миллионе.

#24
19:01, 27 июня 2009

О. Федор
> Ты проверял этот код?

Нет...

>Он загнется на первом миллионе.

Почему?

#25
19:22, 27 июня 2009

О. Федор

unsigned int i = 100000000;
float f = 0.0f;
while(--i) f += 0.001f;
выполнится зак секунду, результат будет не точным из-за метода кодировки float, но он не загнется
#26
19:24, 27 июня 2009

ashujon
> выполнится зак секунду

Наверное потому что компилятор выкинет цикл?

#27
19:27, 27 июня 2009

и с чего это он будет делать такую глупость?

#28
19:34, 27 июня 2009

Executor
Твою идею я переписал чуть иначе (просто чтоб было меньше писанины)

template <typename T, typename Tsum>
Tsum summa(T *a, int n)
{
  Tsum sum = 0;
  for (int i = 0; i<n; ++i)
    sum += Tsum(a[i]);
  return sum;
}

  int n = 100000000;
  float *a = new float[n];

  for (int i = 0; i<n; ++i)
    a[i] = 1;
  cout << " Tsum == float " << summa<float, float>(a, n) <<endl;
  cout << " Tsum == double " << summa<float, double>(a, n)<<endl;

  delete[] a;

Результат вызовов при Tsum == float или double отличается в 6 раз.

#29
19:38, 27 июня 2009

ashujon
Твой результат будет отличаться от реального (100000000) в 6 раз. Проверь

  unsigned int i = 100000000;
  float f = 0.0f;
  while(--i) f += 1;
  cout << " ashujon " << f <<endl;

Страницы: 1 2 3 421 Следующая »
ПрограммированиеФорумОбщее