Большой Воронежский Форум
Страница 2 из 2
< 12
» Программирование>задача по высокоуровневым методам программирования
DWanek 21:15 20.01.2008

Сообщение от The_God:
копилятор определяет типы на этапе компиляции и генерит процедуры для каждого использованого типа свои

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

И на тему динамического каста: в Delphi все переменные типа класса, у которых не вызывается конструктор, являются указателями. То есть в Delphi есть возможность если ты уверен, что в этой переменной лежит указатель именно на этот класс, не использовать вообще касты а работь с указателями, не задумываясь куда он указывает. [Ответ]
The_God 21:26 20.01.2008

Сообщение от DWanek:
Тогда всё отличие от Delphi состоит только в том, что ты тратишь меньше времени на набор текста программы, я трачу больше тем, что приходится расписывать большее колличество функций, а выполняются программы всё равно одинаково.

угу

много способов использования, на примере функции просто очевидно как это может улучшить жизнь, есть и более хитрые приёмы.. но про них надо читать в книгах. эту технологию придумывали для решения реальных задач.
скорость выполнения она не изменяет, скорость разработки увеличивает, скорость компиляции уменьшает [Ответ]
The_God 21:29 20.01.2008
былоб прикольно еслиб метапрограммирование изучали в универе и политехе, хотяб в базовом виде.
ооп это ведь не предел абстракции. [Ответ]
Pengvin 22:42 20.01.2008
The_God, взгляни на топикстартера. Ему хотя бы с ООП разобраться, а заинтересованный человек сам потом нужную информацию поднимет. [Ответ]
DWanek 12:33 21.01.2008

Сообщение от The_God:
былоб прикольно еслиб метапрограммирование изучали в универе и политехе, хотяб в базовом виде.
ооп это ведь не предел абстракции.

Какое там метопрограммирование . Не знаю как там на ПММе, но у нас в политехе Delphi изучали на уровне кнопочек-картиночек. А ты про метапрограммирование. Если бы я сам не захотел это изучить в институте такого никогда бы не рассказали. [Ответ]
MadFish 15:00 21.01.2008
Метапрограммирование это конечно круто, но вот за необходимость явного вызова конструкторов и диструкторов, я готов дядюшку Вирта и разработчиков Delphi придушить!!! А множественное наследование не только потенциальный источник ошибок, но и большой плюс в плане проектирования интерфейсов(1 объект много интерфейсов). Delphi-язык для обучения школьников и написания мелких поделух. (ИМХО) Да еще забыл про темплаты, хотя в Delphi о них тоже забыли.. [Ответ]
DWanek 15:10 21.01.2008

Сообщение от MadFish:
Delphi-язык для обучения школьников и написания мелких поделух.

Когда будет закончен наш проект, я дам посмотреть тебе на эту "мелкую поделуху". [Ответ]
The_God 15:38 21.01.2008
руки самый большой источник ошибок

Сообщение от MadFish:
необходимость явного вызова конструкторов и диструкторов,

это что ? всмысле где это так страшно выглядит.

что ты забыл про темплейты ?
[Ответ]
Pengvin 16:43 21.01.2008
Эти споры уже достали. Я вот вчера побыстрому простенькую среду для асма сваял под Fasm с подсветкой синтаксиса и выводом компилятора в отдельое окошко,за час на Delphi. Это конечно "поделуха", но для некторых задач Delphi незаменим. И вобще на нем можно при желании и драйвер написать и ядро ОС, главное линкер найти. Кстати линкер тоже можно на Delphi написать. [Ответ]
AIM-9M 17:49 21.01.2008

Сообщение от DWanek:
Когда будет закончен наш проект, я дам посмотреть тебе на эту "мелкую поделуху".

Пока вокруг все кричат о смерти и отстойности дельфи, народ зарабатывает с помощью нее нормальные бабки. Может дело не в инструменте а в мастере? [Ответ]
DWanek 19:14 21.01.2008
AIM-9M, не знаю я в чем тут дело, но я работаю и заработываю неплохие деньги знанием Delphi. Да и не хочу я сказать, что Delphi лучше C++, вот не хуже это точно. Меня просто убивают высказывания о том, что на Delphi нелья сделать ничего серьёзного. Если кто-то не знает как это сделать - это совсем неозначает, что это невозможно.

Поверьте, возможно. [Ответ]
MadFish 12:20 23.01.2008

Сообщение от The_God:
руки самый большой источник ошибок

5 баллов Я буду это цитировать

Сообщение от The_God:
это что ? всмысле где это так страшно выглядит.
что ты забыл про темплейты ?

Это так страшно выглядит в дельфе. Представь себе табличку, ну скажем 100х100, состоящую из объектов. Так после создания таблички нужно еще пробежать по всем элементам и дернуть за конструктор... а если размерность таблицы динамическая... а если добавляем\удаляем строки \столбцы изменяем размерность? и уж не дай бог это древовидная структура!!! Одним словом? приятного мало...
про темплаты я забыл что их нет в дельфи...

PS Я не критикую дельфи как инструмент, у каждого проффессионала на столе их не один десяток. Просто раз уж речь зашло про ООП? то в дельфе это все неудобно(ИМХО). И еще я не понимаю оголтелой любви Воронежских программеров к этому языку. Ну ладно бы ностальгия по универу, а то приходят на собеседование такие кто кроме делфи НИЧЕГО не знают(и не хотят знать), да еще и учат мну жизни, что лучше знать оди язык но досконально (че там знать досконально? VCL чтоли?) чем знать несколько но не так глубоко...
[Ответ]
Pengvin 17:38 23.01.2008
MadFish проблема не в языке, в а его так сказать носителях. Арабский язык ведь в людей не стреляет.
И еще можно объяснить насчет "дернуть за конструктор". Я человек темный все по старинке делаю. Можно объяснить, как мне не бегать по дереву и не "дергать конструктор". Вот на примере двоичного дерева:


template<class T>
struct BiTree
{
_______T elem;
_______BiTree* left;
_______BiTree* right;
};

class B
{
public:
______B(int i);
______int Get();
private:
______int c;
};

B::B(int i) { c=i;}
int B::Get() { return c;}

#define ptree struct BiTree<B *> *

код инициализации узла дерева.

ptree create(ptree root, ptree p, int value){
_if(!p){
__p = new struct BiTree<B *>;
__p->left = 0;
__p->right = 0;
__p->elem = new B(value); //вывоз констркутора
__if(!root) return p;
__if(value<root->elem->Get()) root->left = p;
__else root->right = p;

__return p;
_}
_if(value < p->elem->Get()) create(p, p->left, value);
_else create(p, p->right, value);
_return root;
}

код приложения

ptree root;
int _tmain(int argc, _TCHAR* argv[])
{
int length = 15;
int* mas;
mas = new int[length];
for (i = 0 ; i < length; i ++ )
mas[i]=rand();
mas[0] = 10;

for(i=0;i<length;i++) root = create(root, root, mas[i]);
while (1) {};
return 0;
} [Ответ]
MadFish 20:19 23.01.2008

Сообщение от Pengvin:
Я человек темный все по старинке делаю. Можно объяснить, как мне не бегать по дереву и не "дергать конструктор". Вот на примере двоичного дерева:

Я тоже не шибко грамотный, и по этому тоже все делаю по старинке... Если отбросить Ваши игрища с темплатами и не переутомляться с рекурсией, а сделать все глупее и тривиальнее, то получим следующее:
class CA
{
____int a;
};
class CB
{
____CA a;
};
int _tmain(int argc, _TCHAR* argv[])
{
____CB b;//необходимо и достаточно
____return 0;
}
А вот в дельфи пришлось бы во первых работать только по ссылке, во вторых в опрераторе new(или сразу после ) вызывать конструктор b и внимание!!! вручную создать b.a и вызвать конструктор (запихнуть создание b.a и вызов конструктора b.a в конструктор b нельзя!!!, т.к. на момент выполнения конструктора b объект b еще не определен ну и как вам это нравиться??? а если вложенность не 1 как сдесь, а 10-15 уровней?). Данная проблема напрямую вытекает из того факта, что в паскале нет стандартного правила именования конструкторов, и компилятор не может самостоятельно определить какой из конструкторов вызывать. А при большом количестве элементов или при большой вложенности, факт необходимости ручного вызова начинает оч сильно напрягать. Да и главное потом не забыть перед dispose вызвать диструкторы b.a и затем b, что многие забывают, и как факт мемори лики = куча ненужной писанины-неудобно...

PS Еще раз повторюсь, я не против делфи как языка, просто ООП к нему прикручено "не доконца" и как следствие неудобно. НО ЭТО ТОЛЬКО МОЕ ИМХО!!!
[Ответ]
Pengvin 21:07 23.01.2008
извиняюсь я наверное действительно плохой пример привел. засрал все рекурсией, а сути не видно. Весь акцент был сделан на то,что конструктору передается параметр. При его "автоматическом" вызове нам придется инициализировать этот параметр самостоятельно, соответственно вся экономия теряется. Например я передаю конструктору строку и потом хеш от нее беру внутри него(это пример, проще конечно сразу хеш передавать). Я не спорю - это все замечательно, я лично об этом не знал, поэтому спасибо за информацию теперь буду это использовать. Я просто книжек по С/С++ вобще не читал большую часть на примерах и MSDN осваивал и многих тонкостей не знаю. [Ответ]
DWanek 21:20 23.01.2008
MadFish, то есть написать вместо:

CB b

вот так:

b := Cb.Create;

и в конце:

b.Free;

это проблема?

И на тему вызова деструктора: а если ты хочешь в середине процесса выполнения программы осободить память? [Ответ]
The_God 21:28 23.01.2008
это проблема, любые парные операции влекут ошибки

в с++ есть специальные приёмы которые позволяют делать так чтобы не заботится о парности таких вызовов, с их помощью вызов "Free" делается автоматически при выходе из функции или блока в котором создался объект CB b.

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

а если из функции точек выхода несколько.. то получается копипаст этих вызовов во все точки выхода, а при добавлении нового такого хитрого объекта опять нужно руками расставить в нужных местах его уничтожение а если в это время немного спешиш ( уже поздно и домой хочется ).. то глюки например в виде утечки памяти обеспечены. [Ответ]
MadFish 21:31 23.01.2008

Сообщение от DWanek:
CB b

вот так:

b := Cb.Create;

и в конце:

b.Free;

это проблема?

не, проблема не в этом. проблема в том, что после
b := Cb.Create;
я еще должен написать
b^.a:=CA.Create;
итд.

Сообщение от DWanek:
И на тему вызова деструктора: а если ты хочешь в середине процесса выполнения программы осободить память?

а если нехочу???
опять, не в том вопрос. вопрос в том что я ДОЛЖЕН строго последовательно вызывать диструкторы РУКАМИ, а потом освобождать памят dispose [Ответ]
DWanek 07:11 24.01.2008

Сообщение от MadFish:
я еще должен написать
b^.a:=CA.Create;

Не должен.
В обработчике конструктора класса b пишешь один раз:

constructor CB.Create;
begin
__a := CA.Create;
end;

соответственно в деструкторе:
destructor CB.Destroy;
__inherited;
__a.Free;
end;

Вызвав b := CB.Create, "a" создастся сам, при вызове b.free, "а" уничтожится сам. [Ответ]
DWanek 07:15 24.01.2008

Сообщение от MadFish:
я ДОЛЖЕН строго последовательно вызывать диструкторы РУКАМИ, а потом освобождать памят dispose

Что значит освождать память dispose?

При вызове деструктора "a.Free" всё само автоматически обнуляется, уничтожается, заниливается и освобождается, и кроме этого писать ничего не надо. [Ответ]
DWanek 13:08 24.01.2008
Pascal лучше C++ хотя бы тем, что в нем нельзя написать такое:

for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);

А в C++ можно.

Жалко несчастных людей, которые читают чужой код, написанный на C++.

MadFish, в Delphi не используются старые паскалёвские операторы "New" и "Dispose". Память выделяется и освобождается автоматически при вызове конструкторов и деструкторов класса. Уже в Turbo Pascal это не использовалось [Ответ]
The_God 13:34 24.01.2008

Сообщение от DWanek:
for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);

А в C++ можно.

этот код не скомпилится не при каких комбинациях используемых типов, хотяб потомучто оператор '-' заюзан неправильно. еще нехватает оператора в одном месте. вобщем странный код какойто.....

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

когда человек работает давно, он пишит так чтобы было все просто и понятно, а такие скороговорки он может читать, но писать их не будет.
[Ответ]
Страница 2 из 2
< 12
Вверх