Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Философия программирования > А можно без классов?


Автор: slavaentp 18.9.2008, 17:44
Совершенно не знаю, где спросить, решил спросить здесьsmile 

Имеют ли право на существование языки программирования без классов(я так понимаю, что то, что с классами, называется ООП) или нет?smile Потому что вот эта система с классами мне совсем не нравится. Любой язык программирования нравится ровно до того момента, как выясняю, что там есть ЭТА хреньsmile Ну вот такое моё мнение об этом.

Если такие языки программирования есть(кроме Ассемблера), то можно ли рассчитывать получиьт работу с нормальной зарплатой, программируя на них, и если да, то где и как?

Спасибо.

Автор: Mayk 18.9.2008, 17:52
И за что не нравится ООП, раз уж мы в филосфии программирования?

Автор: Gwynbleidd 18.9.2008, 18:10
Цитата(slavaentp @ 18.9.2008,  15:44)
Совершенно не знаю, где спросить, решил спросить здесьsmile 

Имеют ли право на существование языки программирования без классов(я так понимаю, что то, что с классами, называется ООП) или нет?smile Потому что вот эта система с классами мне совсем не нравится. Любой язык программирования нравится ровно до того момента, как выясняю, что там есть ЭТА хреньsmile Ну вот такое моё мнение об этом.

Если такие языки программирования есть(кроме Ассемблера), то можно ли рассчитывать получиьт работу с нормальной зарплатой, программируя на них, и если да, то где и как?

Спасибо.

есть конечно. например можно программировать на С (простой си) для микроконтроллеров, там хочешь не хочешь а классов нет. так же можно писать например по юникс.. возможностей много smile

Автор: slavaentp 18.9.2008, 18:50
Цитата(Mayk @ 18.9.2008,  17:52)
И за что не нравится ООП, раз уж мы в филосфии программирования?

За бесполезный код.

Class A: ClassB{

public A = new A();

Вот эти две строчки ровным счётом ничего не делают. Не выводят ничего на экран, не выполняют вычислений, не включают даже какую-то там функцию, которая бы не работала без этого, ВООБЩЕ НИЧЕГО НЕ ДЕЛАЮТ. А строчка "public A = new A();" да ещё и после объявления класса А, по моему мнению вообще верх маразмаsmile Ну зачем это? Я помнимаю, что это что-то там делает, выполняет какие-то условия в ОО языке программирования, мне это жутко не нравится. Я хочу, чтобы код был максимально простым и значимым.

Я даже переменные стараюсь не использовать, поскольку они тоже являются бесполезным кодом. Использую только тогда, когда без них никак. Функции - признаю их право на существование, возможно иногда используя их, код станет более компактным, но ненавижу оверюз их. А goto люблю гораздо больше функцийsmile Классы не перевариваю вообще. Считаю ненужным бредом.

Вот такое моё мнениеsmile

Автор: skyboy 18.9.2008, 18:58
А чего: без классов нельзя написать бессмысленный код?
Код

c := с + 2;
с := с - 2;  



Добавлено через 1 минуту и 45 секунд
классы - такие же инструменты языка, как переменные, функции и тот же goto. не нравится - не используешь. если выходит коряво - мучаешься.
вот только на java писать чисто в процедурном стиле не получится. значит, на работу по java ты в жизни не пройдешь.

Автор: slavaentp 18.9.2008, 19:08
Цитата

А чего: без классов нельзя написать бессмысленный код?

Можно конечноsmile

Цитата
классы - такие же инструменты языка, как переменные, функции и тот же goto. не нравится - не используешь. если выходит коряво - мучаешься.
вот только на java писать чисто в процедурном стиле не получится. значит, на работу по java ты в жизни не пройдешь. 

Дело тут вот в чём.

Я - человек, ориентированный на результат. Если программа работает, если цель ДОСТИГНУТА полностью - значит задача выполнена. Меня абсолютно не интересует, "оптимизирована" ли программа. Поставлена задача(в т.ч. и мной самим перед собой) - я написал код, который её решил - значит всё выполнено ИДЕАЛЬНО и ОПТИМАЛЬНО.

Если из-за неоптимизированности кода возникнут проблемы - вот тогда их и будем решать, когда возникнут. Поставим отдельную задачу и решим её.

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

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

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

Автор: kosmonaFFFt 18.9.2008, 19:10
[OFFTOP]
Одно из преимуществ классов: наследование
Понадобилось мне по учебе прогу сваять (преобразования плоского графич. объекта) и решил я ее по быстрому сделать на C#.
А там по заданию надо перемножение матриц. А самому то все писать лень =>
Код

public class FMatrix : List<List<Single>>
{
//А здесь конструктор и перегрузка оператора *
}

smile
[/OFFTOP]

А насчет языкрв без классов, знаю только C, Pascal (!!! не Object Pascal)
Могу ошибаться, но по моему в Lisp и Prolog их тоже нет.

Автор: skyboy 18.9.2008, 19:16
Цитата(kosmonaFFFt @  18.9.2008,  18:10 Найти цитируемый пост)
но по моему в Lisp и Prolog их тоже нет. 

"Lisp" и "Prolog" - не более, чем общие названия. в одних версиях есть, в других - нет.
Цитата(slavaentp @  18.9.2008,  18:08 Найти цитируемый пост)
А если мою работу будут оценивать по принципу "Да, Ваша программа работает, всё полностью выполнено, но такой код нужно писать через классы, иначе программа через 10 лет будет работать чуточку медленнее" - я так не смогу. 

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

Добавлено через 33 секунды
Цитата(slavaentp @  18.9.2008,  18:08 Найти цитируемый пост)
иначе программа через 10 лет будет работать чуточку медленнее

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

Автор: slavaentp 18.9.2008, 19:18
Цитата(kosmonaFFFt @ 18.9.2008,  19:10)
[OFFTOP]
Одно из преимуществ классов: наследование
Понадобилось мне по учебе прогу сваять (преобразования плоского графич. объекта) и решил я ее по быстрому сделать на C#.
А там по заданию надо перемножение матриц. А самому то все писать лень =>
Код

public class FMatrix : List<List<Single>>
{
//А здесь конструктор и перегрузка оператора *
}

smile
[/OFFTOP]

А насчет языкрв без классов, знаю только C, Pascal (!!! не Object Pascal)
Могу ошибаться, но по моему в Lisp и Prolog их тоже нет.

Может быть если бы где-то расписаны вот такие подобные НАСТОЯЩИЕ преимущества - я бы и поменял отношение к классам или понял их лучшеsmile

А так, бред какой-то:

"Пишем программу HelloWorld. Создадим класс для нашей программы, дальше создадим экемпляр этого класса, а теперь поговорим подробно, какие аттрибуты мы можем поставить классу, и имейте в виду, что классы это такие-то такие-то ... <длиннейшее описание сути и философии классов и всех их разновидностей, из которого непонятно, зачем они вообще нужны>. Вот теперь, когда вы поняли всё о том, как создавать классы, экземпляры и конструкторы, правда не поняли, зачем это всё нужно, мы, наконец, напишем - Console.WriteLine("Hello, World!");"

Добавлено через 2 минуты и 39 секунд
Цитата

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

Это непонимание, зачем классы нужныsmile Я предположил, что для скорости - а иначе для чего?

Ибо все коды, которые я видел с классами, прекрасно могли быть написаны без них.

Автор: kosmonaFFFt 18.9.2008, 19:23
Цитата(slavaentp @  18.9.2008,  19:18 Найти цитируемый пост)
Может быть если бы где-то расписаны вот такие подобные НАСТОЯЩИЕ преимущества - я бы и поменял отношение к классам или понял их лучше


ИМХО пока сам не начнешь это все юзать - не поймешь.
Я например вначале тоже думал на# они надо, а щас как то и не знаю даже иногда как без ООП smile

Добавлено через 4 минуты и 24 секунды
Цитата(slavaentp @  18.9.2008,  19:23 Найти цитируемый пост)
А разве от программиста не готовый продукт требуется? По идее кроме программиста, никто в коде и не должен копаться.


А как же те несчастные, которые будут потом поддерживать проект, если тебя уже не будет (место работы например сменишь)?
А им например надо будет какую то фичу добавить или баг устранить.
Вот и будут сидеть и проклинать автора, пытаясь разобраться в коде. smile

Автор: slavaentp 18.9.2008, 19:23
Цитата

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

А разве от программиста не готовый продукт требуется? По идее кроме программиста, никто в коде и не должен копаться.

Автор: slavaentp 18.9.2008, 19:27
Цитата(kosmonaFFFt @ 18.9.2008,  19:23)
Цитата(slavaentp @  18.9.2008,  19:18 Найти цитируемый пост)
Может быть если бы где-то расписаны вот такие подобные НАСТОЯЩИЕ преимущества - я бы и поменял отношение к классам или понял их лучше


ИМХО пока сам не начнешь это все юзать - не поймешь.
Я например вначале тоже думал на# они надо, а щас как то и не знаю даже иногда как без ООП smile

Дело в том, что когда я программирую для себя, я программирую на Ассемблереsmile

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

Другой вопрос, что за программирование на нём не платят, а что такое "прошивка микроконтроллеров", я вообще понятия не имею, как и то, почему это делается на Ассемблере.

Автор: kosmonaFFFt 18.9.2008, 19:29
Чет отправка глюканула, и не новый пост получился, а старый отредактировался.

Цитата

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


Для себя и для кого-то разные вещи.

Автор: slavaentp 18.9.2008, 19:30
Цитата


А как же те несчастные, которые будут потом поддерживать проект, если тебя уже не будет (место работы например сменишь)?
А им например надо будет какую то фичу добавить или баг устранить.
Вот и будут сидеть и проклинать автора, пытаясь разобраться в коде. smile

Неужто так сложно разобраться в чужом коде, если автор его намеренно что-то там не скрывал?smile

Добавлено через 3 минуты и 24 секунды
Цитата(kosmonaFFFt @ 18.9.2008,  19:29)
Чет отправка глюканула, и не новый пост получился, а старый отредактировался.

Цитата

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


Для себя и для кого-то разные вещи.

Так чтобы получить "для кого-то", нужно квалификацией обладать.

Вот я и спрашиваю, где силы приложить, и вообще имеет ли мне смысл прилагать силы в программированииsmile

Ибо если "надо сделать программу, чтобы работала" - это я могу сделать

А если нужно думать каждую секунду думать "Ой, как написать? Класс? Функцию? Или просто код?" - то тогда вряд ли, ибо для меня ответ(хотя бы по умолчанию) всегда - "просто код":)

Автор: kosmonaFFFt 18.9.2008, 19:34
Цитата(slavaentp @  18.9.2008,  19:30 Найти цитируемый пост)
Неужто так сложно разобраться в чужом коде, если автор его намеренно что-то там не скрывал?


Сам несколько раз пытался разобраться в чужом кривоватом коде
(например все имена переменных в стиле a, aa, ttt, d, v, tt и т. д. и тут даже имеющиеся в обилии коменты не спасали)
, забивал и писал сам. smile

Автор: slavaentp 18.9.2008, 19:39
Цитата(kosmonaFFFt @ 18.9.2008,  19:34)
Цитата(slavaentp @  18.9.2008,  19:30 Найти цитируемый пост)
Неужто так сложно разобраться в чужом коде, если автор его намеренно что-то там не скрывал?


Сам несколько раз пытался разобраться в чужом кривоватом коде
(например все имена переменных в стиле a, aa, ttt, d, v, tt и т. д. и тут даже имеющиеся в обилии коменты не спасали)
, забивал и писал сам. smile

Но сделал же в итогеsmile Работодателю по идее должно быть всё равно - при любом варианте он имеет работающую програму.

Автор: kosmonaFFFt 18.9.2008, 19:41
Цитата(slavaentp @  18.9.2008,  19:30 Найти цитируемый пост)
Ибо если "надо сделать программу, чтобы работала" - это я могу сделатьА если нужно думать каждую секунду думать "Ой, как написать? Класс? Функцию? Или просто код?" - то тогда вряд ли, ибо для меня ответ(хотя бы по умолчанию) всегда - "просто код":)


Я например "просто код" всегда разбиваю на классы+методы/функции ибо мне так например легче.
Разбил задачу на более мелкие - написал и протестировал каждую, потом соединил и все работает. smile
А потом, если что-то аналогичное потребуется (да хоть те же матрицы с их умножением,а они у меня в отдельном классе)
взял, скопировал/унаследовал+дописал и можно юзать.

Добавлено через 2 минуты и 54 секунды
Цитата(slavaentp @  18.9.2008,  19:39 Найти цитируемый пост)
Но сделал же в итоге Работодателю по идее должно быть всё равно - при любом варианте он имеет работающую програму.


Не, эт я по учебе схалявить хотел и готовый курсак переделать. В итоге убил время на попытку в нем разобраться. smile

Автор: slavaentp 18.9.2008, 19:46
Цитата(kosmonaFFFt @ 18.9.2008,  19:41)
Цитата(slavaentp @  18.9.2008,  19:30 Найти цитируемый пост)
Ибо если "надо сделать программу, чтобы работала" - это я могу сделатьА если нужно думать каждую секунду думать "Ой, как написать? Класс? Функцию? Или просто код?" - то тогда вряд ли, ибо для меня ответ(хотя бы по умолчанию) всегда - "просто код":)


Я например "просто код" всегда разбиваю на классы+методы/функции ибо мне так например легче.

Не спорю, у разных людей разные предпочтения.

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

Автор: kosmonaFFFt 18.9.2008, 19:53
Цитата(slavaentp @  18.9.2008,  19:46 Найти цитируемый пост)
оплачивается ли такой подход в программировании

ИМХО нет.
Думаю что если бы оплачивался, то ООП не возникло бы smile

Автор: Mayk 18.9.2008, 20:32
Цитата(slavaentp @  18.9.2008,  23:08 Найти цитируемый пост)
Если программа работает, если цель ДОСТИГНУТА полностью - значит задача выполнена

Абсолютно не верный вывод. После ввода программы в эксплуатацию требуется её активная поддержка для добавления фич и устранения багов. 
Цитата(slavaentp @  18.9.2008,  23:08 Найти цитируемый пост)
Поставлена задача(в т.ч. и мной самим перед собой) - я написал код, который её решил - значит всё выполнено ИДЕАЛЬНО и ОПТИМАЛЬНО.

соответсвенно это тоже не верно, ну и всё последующее.

Автор: Shaggie 18.9.2008, 20:40
Цитата(slavaentp @  18.9.2008,  20:08 Найти цитируемый пост)
Я - человек, ориентированный на результат. Если программа работает, если цель ДОСТИГНУТА полностью - значит задача выполнена.

Программы приходится развивать. Вырастают новые технические требования, отмирают старые. Вылезают ошибки, а иногда переделывать приходится больше половины готового кода. Есть даже отдельные программисты, которые работают не на написание новых проектов, а на поддержку старых. Что в таком случае является целью? Что думать о товарище программисте, который написал "чтобы работало" и свалил? Не проще ли было изначально задуматься о стройной архитектуре? Я не пытаюсь заставить тебя полюбить ООП, хочешь - решай в функциональной парадигме, но только безо всяких "после нас хоть потоп"!

Цитата(slavaentp @  18.9.2008,  20:08 Найти цитируемый пост)

Если из-за неоптимизированности кода возникнут проблемы - вот тогда их и будем решать, когда возникнут. Поставим отдельную задачу и решим её.

Умоляю тебя! В данный момент я - жертва такого программиста. Не бывает задачи "неоптимизированность кода". Бывает задача "эй вы, парни, нам надо вот такую фишку сделать и тут поменять", и в решении задачи ты сотни, тысячи раз обматеришь предшественника, поменяешь всё до чего дотянешься (или, что случается чаще, примешь как есть. Нет времени всё переписывать). Ура - задача (не скажу какой ценой) решена, можно перестать ругаться на заплатанный код. Думаешь, какая задача встанет следующей? Правильно! "Вот вылез баг, вот здесь плюшечку, и мы тут с бухгалтерией подумали, что надо вот этот момент по-другому вычислять...", но задачи оптимизации тебе в жизни никогда не поставят. И даже если выбьешь с начальника время на таковую, что теперь уже можно поменять? Только переписать всё целиком.

Чем дальше, тем больше заплатанным становится код. Изменение одной его части влечёт совершенно непредсказуемые для всей программы последствия. Автоматизированные тесты навесить на это разваливающееся и подпёртое костылями чудо невозможно, и тестирование превращается в каторгу. Представь теперь, какое количество иголок будет втыкаться в твою восковую фигуру - нужна такая тяжесть на карме?

Цитата(slavaentp @  18.9.2008,  20:46 Найти цитируемый пост)

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

Эй, на чём-то придётся остановиться! Ни классов, ни функций, ни переменных - так не бывает, хотя бы что-то одно придётся использовать, причём это одно наверняка окажется функциями  smile 

Диагноз - повышенное оптимизаторство, плавали - знаем, сам с ассемблера начинал. Жизнь заставит - всё полюбишь. И функции (за что на них-то взъелся?), и классы (с опытом поймёшь, как их юзать). И даже переменные. Всё хорошо, когда растёт на своём месте.

Автор: slavaentp 19.9.2008, 15:18
Цитата(Shaggie @ 18.9.2008,  20:40)
функции (за что на них-то взъелся?)

Зачем:

function superkod($a, $b){

echo $a+$b;

}

superkod(3+1);

если можно:

echo 3+1;

Автор: kosmonaFFFt 19.9.2008, 15:59
Цитата(slavaentp @  19.9.2008,  15:18 Найти цитируемый пост)
Зачем:function superkod($a, $b){echo $a+$b;}superkod(3+1);если можно:echo 3+1;


А представь себе, что там не echo $a + $b, а около 40 строк кода, который делает что то с этими самыми переменными
а в программе это делать с ними надо часто. И тут появляется выбор - функция или копирование кода через
Ctrl+C, Ctrl+V (или как там у кого хоткеи настроены) smile
Я лично предпочитаю в такой ситуации написать функцию.

Автор: slavaentp 19.9.2008, 16:23
Цитата(kosmonaFFFt @ 19.9.2008,  15:59)
Цитата(slavaentp @  19.9.2008,  15:18 Найти цитируемый пост)
Зачем:function superkod($a, $b){echo $a+$b;}superkod(3+1);если можно:echo 3+1;


А представь себе, что там не echo $a + $b, а около 40 строк кода, который делает что то с этими самыми переменными
а в программе это делать с ними надо часто. И тут появляется выбор - функция или копирование кода через
Ctrl+C, Ctrl+V (или как там у кого хоткеи настроены) smile
Я лично предпочитаю в такой ситуации написать функцию.

Чем "goto" не устраивает?

Автор: Shaggie 19.9.2008, 17:25
Цитата(slavaentp @  19.9.2008,  16:18 Найти цитируемый пост)

function superkod($a, $b){

echo $a+$b;

}

Действительно отстой. Название superkod не говорит совершенно ни о чём. Функция обладает побочным эффектом, заключающимся в использовании echo. Ну её такую нафиг!

Автор: smartov 19.9.2008, 17:26
slavaentp, тролль нехороший smile Но зато живая беседа.

Начнем, полжалуй, с функций.
Чтобы пример был нагляднее, возмем матрицу.
Нам нужно посчитать детерминант матрицы. Возьми матрицу 5x5 и попробуй написать код для рассчета ее детерминанта без функций. 
А теперь представь что матрица не 5х5, а вообще произвольного размера - как пользователь задаст.
Это тоже можно написать без функций. И даже будет работать, но код будет во много раз длиннее, а читать этот код будет нереально. Следовательно поддержка программы сводится к нулю.
Итого: больше потраченного времени программиста, программа занимает больше места, большее количество кода увеличивает шанс человеческой ошибки (скрытые баги), поддержку программы осуществлять трудно.

Вообще: большинство из того, что сделано - функции, классы и т.п. - сделано для упрощения поддержки и развития программы.

Автор: Shaggie 19.9.2008, 17:29
Цитата(slavaentp @  19.9.2008,  17:23 Найти цитируемый пост)
Чем "goto" не устраивает?

Истории много лет, не одна сотня копий разбита в боях. Поисковики в помощь.

Автор: kosmonaFFFt 22.9.2008, 18:41
Цитата(slavaentp @  19.9.2008,  16:23 Найти цитируемый пост)
Чем "goto" не устраивает?

Хорошо, а теперь взять те же матрицы и их умножение (недавно сам делал):
как с помощью goto реализовать умножение двух произвольных матриц?
мне это представляется возможным только так:
Код

начало_умножения:
    тут идет умножение матрицы А на Б и результат записывается в С;
    switch (куда_идти)
    {
        case 1: goto куданибудь1;
        ...
        case n: goto куданибудьn;
    }

//А тут понадобилось умножить 2 матрицы
А = ... //Инициализация А
Б = ... //Инициализация Б
куда_идти = 1;
goto начало_умножения;
куданибудь1:
    //В итоге в С оказывается результат.

//А где то здесь тоже надо умножить матрицы. И где нибудь ниже тоже.


А теперь с функциями (даже без классов):
Код

Матрица УмножитьМатрицы(Матрица м1, Матрица м2)
{
    //Тут умножение и возврат результата.
}

//Тут понадобилось умножение.
Матрица С = УмножитьМатрицы(А, Б);

//И здесь и ниже так-же.
Матрица СN = УмножитьМатрицы(АN, БN);


И какой же вариант более простой и легчечитаемый? smile

Автор: ne0n 22.9.2008, 19:34
Нет, я конечно не ярый фанат ООП, но вы батенька ,slavaentp, похоже немного бередите. Вы мне напоминаете китайцев, которые сначало создают себе трудности а потом их решают. 
Например я не люблю использовать ООП в тех случиях когда без него можно обойтись, ну например какаянито маленькая програмка(обычно системная утила) - я стараюсь реализовать все на api, используя процедурный подход.  а когда речь идет о чем то более глобальном...например база данных. зачем создавать себе трудности, лопатить кучу документации, зачем изобретать велосипед, когда можно воспользоваться готовым классом и при необходимости дорабоать его. 
ну а уж слова по поводу того что функция - это ненужная вещь, я задам лишь один вопрос...вы когданибудь писали программы на нсеколько тысяч строк??!!  разбираться в такой мешанине кода это наверно веселое занятие...когда гораздо удобнее все фуки раскидать по юнитам, и при необгодимости вызывать их из главной программы.

Автор: nerezus 22.9.2008, 19:43
Цитата

Я - человек, ориентированный на результат. Если программа работает, если цель ДОСТИГНУТА полностью - значит задача выполнена. Меня абсолютно не интересует, "оптимизирована" ли программа. Поставлена задача(в т.ч. и мной самим перед собой) - я написал код, который её решил - значит всё выполнено ИДЕАЛЬНО и ОПТИМАЛЬНО.
 ООП позволяет тебе писать меньше кода на больших проектах. Вопросы есть?

Добавлено через 2 минуты и 51 секунду
Есть такие штуки, как полиморфизм. Они уменьшают количество кода.
Есть такие штуки, как инкапсуляция. Они повышают читабельность кода.
Есть такие штуки, как шаблоны проектирования. Они уменьшают количество головной боли при разработке.
Есть такие штуки, как фреймворки. Они в разы сокращают количество кода по сравнению с C-style библиотеками.

Автор: korian 27.9.2008, 21:07
тема наверно для стеба создавалась?  smile
если нет, то впринципе все уже сказано
если подытожить, то можно сказать, что качество работы программиста уже очень давно не оценивается по принципу "программа работает". это необходимое условие, но никак не достаточное.
http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F определают качество работы программиста в нынешнее время.

Автор: smartov 27.9.2008, 21:24
korian, надо же. Даже статья на Вики есть. Не знал.

Автор: DRUID3 28.9.2008, 06:43
Цитата(smartov @  19.9.2008,  16:26 Найти цитируемый пост)
slavaentp, тролль нехороший smile Но зато живая беседа.

100% тролль ...
Цитата(smartov @  19.9.2008,  16:26 Найти цитируемый пост)
Это тоже можно написать без функций. И даже будет работать, но код будет во много раз длиннее, а читать этот код будет нереально. Следовательно поддержка программы сводится к нулю.
Итого: больше потраченного времени программиста, программа занимает больше места, большее количество кода увеличивает шанс человеческой ошибки (скрытые баги), поддержку программы осуществлять трудно.

именно...
Цитата(Shaggie @  18.9.2008,  19:40 Найти цитируемый пост)
Программы приходится развивать. Вырастают новые технические требования, отмирают старые. Вылезают ошибки, а иногда переделывать приходится больше половины готового кода. Есть даже отдельные программисты, которые работают не на написание новых проектов, а на поддержку старых. Что в таком случае является целью? Что думать о товарище программисте, который написал "чтобы работало" и свалил? Не проще ли было изначально задуматься о стройной архитектуре? Я не пытаюсь заставить тебя полюбить ООП, хочешь - решай в функциональной парадигме, но только безо всяких "после нас хоть потоп"!

Все верно, как и в предыдущем пояснении, но товариСЧ решил пЕсать для себя... Для себя можно как угодно )))


Цитата(Shaggie @  18.9.2008,  19:40 Найти цитируемый пост)
но задачи оптимизации тебе в жизни никогда не поставят

Ну только вот таких вот обобщений не надо  smile ... Смотря кто где и над какими задачами работает.

Цитата(kosmonaFFFt @  22.9.2008,  17:41 Найти цитируемый пост)
как с помощью goto реализовать умножение двух произвольных матриц?
. . . И какой же вариант более простой и легчечитаемый?

Цитата(kosmonaFFFt @  19.9.2008,  14:59 Найти цитируемый пост)
А представь себе, что там не echo $a + $b, а около 40 строк кода, который делает что то с этими самыми переменными
а в программе это делать с ними надо часто. И тут появляется выбор - функция или копирование кода через
Ctrl+C, Ctrl+V (или как там у кого хоткеи настроены) smile
Я лично предпочитаю в такой ситуации написать функцию. 

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


ну Ваши представления об возможностях оператора безусловного перехода несколько искажены. http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/pp/ewd215.html за полную дезориентацию синхронизма выполняемых действий - затруднения в очевидности, наглядности работы системы. А совсем, как раз, не за усложнение и утяжеление чтения исходника в пределах одного блока кода - кстати оба Ваших варианта читаются довольно легко. Поколдовав с препроцессором можно добиться ясности и простоты для намного более запутанных случаев... Мало того ПП(или ООП smile ) на asm будет тоже тяжелочитаемым. Кстати никто goto собственно и не запрещает, в планировщике задач Linux, что 2.4 что 2.6(более ранних - невидал) он на каждом шагу... И Торвальдс такую работу принимает.
slavaentp
прав в своих кратких тезисах. Все это (+ процедурное программирование) парадигмы - мировоззренческие точки отсчета. Но никто никого не заставляет  smile ... 

Цитата(Gwynbleidd @  18.9.2008,  17:10 Найти цитируемый пост)
есть конечно. например можно программировать на С (простой си) для микроконтроллеров, там хочешь не хочешь а классов нет. так же можно писать например по юникс.. возможностей много 

Не совсем верен сам подход... Можно писать ООП на asm. Но это, конечно, экстрим. Но уже для С так очень часто поступают - для тех же микроконтроллеров может не оказаться C++, например, а команда хочет ООП. Кстати, ранние версии GCC преобразовывали C++ в C. И книги встречались на английском как писать на C в стиле C++. http://psi-logic.narod.ru/pro/diffs.htm. Ну а все, что можно на C можно и на asm  smile . 

Цитата(Shaggie @  18.9.2008,  19:40 Найти цитируемый пост)
Ни классов, ни функций, ни переменных - так не бывает, хотя бы что-то одно придётся использовать, причём это одно наверняка окажется функциями

есть такой язык http://thr.do.am/publ/1-1-0-34... там ничего этого нет. И он работает... Правда именно так как и называется...

Автор: RockClimber 3.10.2008, 10:45
Мое скромное имхо по теме...
1) ООП - не панацея от кривого кода. Кто не верит, могу прислать пару модулей, написанных моим коллегой на VB smile 
2) Модульность и полиморфизм/инкапсуляция/наследование - не одно и тоже. А от переписывания большого количества кода спасать должна правильная структура программы (и модульность - пророк её)...
3) ООП - это все-таки здорово, но только если без фанатизма...

Автор: Fiyanov 3.11.2008, 08:28
По теме сообщения:
Без классов можно, но имейте виду что их придумал для того что бы упростить жизнь программиста...

Автор: Фантом 6.11.2008, 01:41
Ко всему этому можно добавить, что в классах (и ООП в целом) нет ничего плохого... но только до тех пор, пока их не начинают пихать куда попало. У этой парадигмы есть определенная область применения, а попытки использовать ее в других задачах (к сожалению, чрезвычайно частые) обычно выглядят так, что вызывают желание полностью отказаться от ООП.  smile 

Автор: slavaentp 24.12.2008, 00:21
Хорошо, спрошу так: где граница между теми программами, где не нужно применять ООП, и теми, где ООП лучше применить?

Автор: Lazin 24.12.2008, 06:39
по любому прийдется учить ООП smile 

Автор: slavaentp 24.12.2008, 14:58
Я и так ООП учу, просто пока что считаю его бесполезнымsmile Я не пытаюсь что-то доказать, я для себя хочу понять.

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

a = GetString();

b = LetUserInput(3);

InitiateConversation();

и т.д.

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

---

В то же время - когда мы имеем дело с чистым листингом, то каждая строка - понятна, потому что она состоит из всем известных инструкций. 

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

---

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

А вот аргумент сторонника goto убийственный(с форума http://www.sql.ru:

"3) Целевой машинный код в конечном счете будет содержать goto, какие-бы вы не использовали структурно-обьектно-функциональные компилляторы.".

Ещё раз, я не спорю, я хочу для себя понять.

Автор: nerezus 24.12.2008, 19:07
Конечно же можно без классов. Но нельзя без ООП, а классы в этом сильно помогают.

Пример огромной программы без классов: linux. Но ООП там есть.

Автор: kosmonaFFFt 25.12.2008, 15:37
Цитата(slavaentp @  24.12.2008,  14:58 Найти цитируемый пост)
же состоит сплошь из юзером определённых функций, названия которых ничего не говорят стороннему наблюдателю!a = GetString();b = LetUserInput(3);InitiateConversation();и т.д.


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

И опять же комментарии при объявлении функций еще не отменял.

Кстати мну тут друг недавно рассказывал - пытался одной знакомой по
программированию помочь, у нее простенькая прога максимум строк на 400 на с++ была написана
сплошным текстом (без функций/классов) и с использованием того же goto, причем было много коментов нормальных, так он часа 3
пытался разобраться в этом всем - не смог, и минут за 30 написал то же самое, но с разбивкой
на функции, и заняло это по объему кода намного меньше.

Автор: Shaggie 29.12.2008, 09:39
Точно тролль.

Автор: ksili 29.12.2008, 11:48
Такое ощущение, что здесь почти все кроме slavaentp - тролли.

ООП почти ничего к читаемости кода не добавляет. Объём становится больше - без вопросов. А вот читаемость могут повысить только комментарии, внятные имена переменных и документация.
Я сейчас участвую в проекте на ООП. Куча классов, куча проектов, куча всего. И ни хрена сходу непонятно. Мне дают задание, говорят что надо использовать такой-то класс или либу с набором классом. Я начинаю делать, а потом оказывается, что там не то, или недоделано или есть ограничения, которые обходить дороже, чем сделать заново. В результате куча времени - сами знаете куда. А все потому, что в этой куче кода - ни строчки комментариев, о документации я вообще молчу. 

Я смотрю на класс и по тому, что он кого-то наследует, использует полиморфизм и другую х, мне не становится понятно, что он получает, что дает на выходе и какие он имеет ограничения в использовании. А теперь подставьте в предыдущем предложении вместо слова "класс" слово "функция" или "модуль" и оно останется справедливым. Потому что читаемость кода от подхода в программировании зависит самую малость, можно сказать в пределах погрешности.

Больше всего в ООП мне не нравятся всякие неявные действия - конструкторы и особливо десктрукторы. От того, что в программе выполняется функция, которой нет в тексте исполняемого модуля, по-моему ни фига не проще программировать. Уже не раз ловил глюк с неявным вызовом деструктора тогда когда это совсем не нужно. 

Мое собственное мнение - классы нужны когда проект большой, его результаты будут использовать много людей. И самое главное - каждый класс отдается другим людям когда он уже максимально отлажен. 
Проблема наверно ещё в том, что многие люди мечтают работать в больших проектах, в больших командах, а поэтому начинают изучать ООП и использовать его где ни попадя. Так появляются всякие мелкие программы , где под каждую функцию написан класс. 

Автор: Lazin 29.12.2008, 12:47
ksili, при чем тут документация?
Разве не логичней, когда у тебя есть класс "строка", ты создаешь объект этого класса, а затем посылаешь сообщение "ToUpper" этому объекту, по твоему лучше когда вместо класса, объекта и сообщения у нас есть область памяти выделенная под строку, указатель на строку, куча переменных хранящих длину строки, кодировку символов и тд и функция, принимающая в качестве параметра указатель на область в памяти и кодировку символов?
Вообще, ###код можно писать как угодно, но код написанный в ООП стиле, если он написан правильно, намного проще использовать и сопровождать. Например мы пишем программу - редактор текста, и у нас есть класс CDocumentElement, от которого порожден класс CText, и от которого в свою очередь порожден CFormattedText, единственное отличие которого от простого текста - наличие форматирования. Теперь представим что нам потребовался класс CImage(наследник CDocumentElement) - встроенное в документ изображение, затем нам потребуется CAlignedImage итд. Это плохой дизайн, в этом случае получится очень сильно упростить программу, если ввести класс CFormat который был-бы декоратором для CDocumentElement и мог-бы изменять поведение вложенного в него объекта. 
Дело даже не в языке программирования, а в подходе, можно и на асме писать ОПП программы.
зы
кстати, хорошо спроектированная программа или библиотека не нуждается в большом количестве комментариев.

Добавлено через 1 минуту и 4 секунды
Цитата(ksili @  29.12.2008,  11:48 Найти цитируемый пост)
Такое ощущение, что здесь почти все кроме slavaentp - тролли.

Такое ощущение, что здесь почти все кроме slavaentp - занимались сопровождением собственного кода smile 

Автор: ksili 29.12.2008, 13:07
Lazin, и как часто мы пишем текстовые редакторы, которые будем сопровождать полжизни? 
Я не говорил, что ООП вообще не нужно. Если проект большой - пожалуйста. Но большая часть программ - не такие крупные проекты как Word. 
И еще. Меня всегда поражал такой фанатизм в дроблении: сделаем Image, из него AlignedImage, из него ещё какой-нибудь имэйдж... Любит человек размножаться ничего не скажешь... Нельзя было сразу сделать объект со всеми нужными свойствами? AlignedImage же тоже можно сделать невыровненным.
Цитата(Lazin @  29.12.2008,  16:47 Найти цитируемый пост)
по твоему лучше когда вместо класса, объекта и сообщения у нас есть область памяти выделенная под строку, указатель на строку, куча переменных хранящих длину строки, кодировку символов и тд и функция, принимающая в качестве параметра указатель на область в памяти и кодировку символов?

Есть базовые классы, они хорошо отработаны. их хватает для большинства часто решаемых задач. Если их не хватает, значит проект наверняка большой  и используй ООП на здоровье. Но все это 
Цитата

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

у тебя опять же  будет, только кроме этого ещё куча воды.

Автор: Lazin 29.12.2008, 13:29
Цитата(ksili @  29.12.2008,  13:07 Найти цитируемый пост)
Есть базовые классы, они хорошо отработаны. их хватает для большинства часто решаемых задач. Если их не хватает, значит проект наверняка большой  и используй ООП на здоровье. Но все это 
Цитата

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

у тебя опять же  будет, только кроме этого ещё куча воды. 

Только я ее видеть не буду, это уже кое-что
А насчет больших и маленьких проектов, ты слышал когда-нибудь про принцип DRY, разве ты не захочешь использовать повторно код, который ты писал для маленького проекта? В случае если это ООП код, то это легко сделать, если код, к примеру чтения из реестра размазан по коду программы, то даже в маленьком проекте его будет трудно изменить а использовать в другом проекте, то что ты уже делал крайне затруднительно. Мне однажды пришлось переписать такую "небольшую" программу. Там было всего около 4к строк, но это был абсолютно не сопровождаемый и не читаемый код, все состояло из пары десятков функций и такого-же количества глобальных переменных, все отправилось в унитаз =)

Автор: ksili 29.12.2008, 13:34
Цитата(Lazin @  29.12.2008,  17:29 Найти цитируемый пост)
но это был абсолютно не сопровождаемый и не читаемый код

а комментарии там были читаемые? Готов поспорить, что их там не было или почти не было
Цитата(Lazin @  29.12.2008,  17:29 Найти цитируемый пост)
ты слышал когда-нибудь про принцип DRY

неа
Цитата(Lazin @  29.12.2008,  17:29 Найти цитируемый пост)
разве ты не захочешь использовать повторно код

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

Автор: Lazin 29.12.2008, 14:01
какая разница были там комментарии или нет, мне что-бы что-то изменить в программе нужно весь код разбирать что-ли?
Don't Repeat Yourself smile 
Цитата(ksili @  29.12.2008,  13:34 Найти цитируемый пост)
обычно я для этого использую CTRL-C  CTRL-V, но вообще обычно делать то, что уже делал раньше, не берусь. Как-то так получается

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

Автор: ksili 29.12.2008, 14:08
Цитата(Lazin @  29.12.2008,  18:01 Найти цитируемый пост)
вот представь, есть у тебя код для работы с реестром, скажем добавление ключа в реестр, ты его скопипастил в N проектов, потом выходит windows vista, в которой немного изменилась работа с атрибутами безопасности и этот код перестал работать, ты будешь руками править все эти N проектов?

если там много работы с реестром, то для этого у меня будет пара соответствующих функций. Собственно их и надо будет переправить. 

Автор: Lazin 30.12.2008, 09:57
Цитата(ksili @  29.12.2008,  14:08 Найти цитируемый пост)
если там много работы с реестром, то для этого у меня будет пара соответствующих функций. Собственно их и надо будет переправить.

функция это уже какая-то абстракция, один шаг до ООП, к примеру функции такие:
Код

  void regstry_addkey(HANDLE h, LPCSTR key, LPCSTR value);//добавить ключ в реестр
  void registry_remkey(HANDLE h, LPCSTR key);//удалить ключ из реестра

это уже ООП, только ты не знаешь об этом smile 
лично я тут вижу класс registry, и два его метода, то что это его методы нам говорит название ф-й и то, что они принимают в качестве первого аргумента один и тот-же параметр, который определяет экземпляр объекта
Это все эквивалентно такому коду:
Код

class registry
{
  HANDLE h;
public:
...
  void addkey(LPCSTR key, LPCSTR value);//добавить ключ в реестр
  void remkey(LPCSTR key);//удалить ключ из реестра
};

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

Автор: nerezus 30.12.2008, 10:01
Цитата

это уже ООП, только ты не знаешь об этом
 О да, void * — офигенческий ООП.
Тогда можно сказать, что асм - самый оопный язык, т.к. там вообще типов нет.

Добавлено через 13 минут и 42 секунды
Lazin, а представь, что ты наследуешь "класс", т.е. дополняешь структуру(на которую тьвой void* смотрит) новыми данными.
Что получишь? Рантайм-ошибку конечно же.

На самом деле тебе придется при наследовании ПЕРЕписывать все ф-ии, т.е. писать над ними обертку для наследника.

+ отсутствует контроль во время компиляции, не говоря уже о подчеркивании красным в IDE.

Автор: ksili 30.12.2008, 10:21
Цитата(Lazin @  30.12.2008,  13:57 Найти цитируемый пост)
нельзя вызвать метод с неверным аргументом

для этого надо будет ещё постараться.

Цитата(Lazin @  30.12.2008,  13:57 Найти цитируемый пост)
функция это уже какая-то абстракция, один шаг до ООП

не передергивай. Также можно сказать, что создание своего типа типа - еще один шаг до ООП.

Цитата(Lazin @  30.12.2008,  13:57 Найти цитируемый пост)
это уже ООП, только ты не знаешь об этом

для меня ООП - это классы со всей их байдой. Если у меня в программе много сложных данных, я разруливаю это при помощи структур и функций, работающих с этими структурами. Как то я вот так привык. 
Наверно скажешь - так это же ООП! 

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

Автор: nerezus 30.12.2008, 10:26
ksili, ООП возможно и без классов, если все принципы ООП соблюдаются.

Цитата

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

Автор: ksili 30.12.2008, 10:29
Цитата(nerezus @  30.12.2008,  14:26 Найти цитируемый пост)
ksili, ООП возможно и без классов, если все принципы ООП соблюдаются

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

Добавлено через 7 минут и 56 секунд
А это реально бывает? или так, существует вероятность...

Автор: Lazin 30.12.2008, 10:56
Цитата(nerezus @  30.12.2008,  10:01 Найти цитируемый пост)
О да, void * — офигенческий ООП.


Цитата(nerezus @  30.12.2008,  10:01 Найти цитируемый пост)
Lazin, а представь, что ты наследуешь "класс", т.е. дополняешь структуру(на которую тьвой void* смотрит) новыми данными.
Что получишь? Рантайм-ошибку конечно же.

На самом деле тебе придется при наследовании ПЕРЕписывать все ф-ии, т.е. писать над ними обертку для наследника.


Код

struct my_base
{
    char* name;
    int data;
};

my_base* ctor_base(void* mem, char* name, int data)
{
  my_base* p = (my_base*)mem;
  size_t name_len = strlen(name);
  p->name =  (char*)malloc(name_len);
  strcpy(p->name, name);
  p->data = data;
  return p;
}

void base_method(by_base* self)
{
  print("%s, %d", self->name, self->data);
}

void dtor_base(my_base* self)
{
  free(self->name);
}

...
my_base* inst = ctor_base(malloc(sizeof(my_base)), "inst name", 111);
base_method(inst);
dtor_base(inst);
free(inst);
...

//Наследование
struct my_derived
{
    my_base base;
    double value;
}

my_derived* ctor_derived(void* mem, char* name, int data, double value)
{
  my_base* b = ctor_base(mem, name, data);
  my_derived* d = (my_derived*)b;
  d->value = value;
  return d;
}

void derived_method(my_derived* self)
{
  base_method((my_base*)self);
  print("%g", self->value);
}

void dtor_derived(my_derived* self)
{
  dtor_base((my_base*)self);
}

...
my_derived* inst = ctor_derived(malloc(sizeof(my_derived)), "derived", 111, 3.14159);
derived_method(inst);
dtor_derived(inst);
free(inst);
...

как видишь переписывать не пришлось, в общем, так выглядит наследование если убрать синтаксический сахар в виде классов smile 
что-бы такое не писать и придумали классы
вообще я тут не изображал виртуальные ф-ии, это не сложно в принципе, достаточно в my_base добавить указатель на таблицу виртуальных функций
Цитата(ksili @  30.12.2008,  10:21 Найти цитируемый пост)
Не используя классы, я избавляюсь от 
1) неявных действий в виде конструкторов/деструкторов
2) глупых ограничений, типа "эту функцию над этими данными выполнить нельзя, т.к. они вообще друг друга не знают" (как же они меня бесят) 

1) используй explicit для конструкторов, что плохого в том что вызывается деструктор я не понял...
2) ради этого все и задумывалось, что-бы обходить ограничения есть шаблоны, например:
Код

void send_to(int* where)
{
   while(somethig) *where++ = anything;
}

это плохо
Код

template<class Iter>
void send_to(Iter where)
{
   while(somethig) *where++ = anything;
}

а это хорошо, так-как будет работать как с std::vector<int>::intertor так и с int*
Цитата(ksili @  30.12.2008,  10:21 Найти цитируемый пост)
для меня ООП - это классы со всей их байдой. Если у меня в программе много сложных данных, я разруливаю это при помощи структур и функций, работающих с этими структурами. Как то я вот так привык. 

для меня ООП - это способ ясно выразить архитектуру приложения, классы в этом помогают smile 

Автор: Shaggie 30.12.2008, 11:32
Цитата(ksili @  29.12.2008,  11:48 Найти цитируемый пост)
А вот читаемость могут повысить только комментарии, внятные имена переменных и документация.

У меня в legacy проекте есть комментарии и документация, два пункта из трёх. Но этого, оказывается, маловато. И даже переименовывание переменных не помогает. Чую отчётливый запах серы.

Цитата(ksili @  29.12.2008,  11:48 Найти цитируемый пост)

Больше всего в ООП мне не нравятся всякие неявные действия - конструкторы и особливо десктрукторы. От того, что в программе выполняется функция, которой нет в тексте исполняемого модуля, по-моему ни фига не проще программировать.

Сложно? Создаётся объект - вызывается конструктор, уничтожается объект - вызывается деструктор. Другое дело, что в них можно любой лишний код засунуть, ну так это не от ООП зависит. Опять же - действия конструкторов/деструкторов разрешено документировать так же свободно, как любой другой код.

Неявный вызов деструкторов? Это не std::auto_ptr ли в коллекциях замешан? Тут несколько другая ситуация, неоднократно упомянутая в различных источниках. Другой случай? Давай разберёмся - я искренне заинтересован.

Чем дальше, тем больше в программировании неявных действий. Ты же не ругаешься, что компилятор без твоего участия сам PE заголовок виндовому экзешнику выстраивает, секции кода/данных/стека размечает. Никогда не было трудностей с пониманием работы коллбеков (мне крышу сорвали в своё время начисто)? Сейчас даже в программировании на ассемблере неявностей выше крыши, и сделано это не ради запутывания несчастных мятущихся программерских душ, но для упрощения процесса программирования. И это ты ещё АОП не видел!

А по факту, современные скриптовые языки (самые известные - перл, пайтон, руби), все как один обладают вагоном неочевидных на первых взгляд тонкостей. Перловые "$<symbols>", пайтоновые "__<functions>__", и так далее. Я лично от таких плюшек в полном восторге.

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

Автор: ksili 30.12.2008, 12:04
Цитата(Shaggie @  30.12.2008,  15:32 Найти цитируемый пост)
Другой случай? Давай разберёмся - я искренне заинтересован

Да я хотел обсудить этот случай на форуме, но некогда было. Потом просто переделал там способ достучаться до члена класса - и он перестал уничтожаться. Если вспомню как там это было - создам тему, но это наверно уже после праздников. auto_ptr там не было

Цитата(Shaggie @  30.12.2008,  15:32 Найти цитируемый пост)
Да, процесс программирования имеет постоянную тенденцию к усложнению, обсуждено тысячи раз. А всё для того, чтобы один программист мог как можно дольше удерживать в голове картинку происходящего.

Ну это как бы не повод называть топикстартера троллем. Ему ООП нафиг не нужно, т.к. он не сталкивался с большими проектами. А тут ему ещё стали втирать, что надо и любой мелкий проект писать с использованием ООП.

Вообще таких специалистов как топикстартер сейчас пожалуй даже не хватает в реальном производстве. Я имею в виду людей который не ломает писать на ассемблере или С без использования каких бы то ни было шаблонов. А ООП-шников навалом. Предложи человеку, который первое что узнал - ООП, что-нибудь написать для микроконтроллера, так он и на С наверно этого сделать не сможет.

Автор: Lazin 30.12.2008, 12:51
Цитата(ksili @  30.12.2008,  12:04 Найти цитируемый пост)
Вообще таких специалистов как топикстартер сейчас пожалуй даже не хватает в реальном производстве. Я имею в виду людей который не ломает писать на ассемблере или С без использования каких бы то ни было шаблонов. А ООП-шников навалом. Предложи человеку, который первое что узнал - ООП, что-нибудь написать для микроконтроллера, так он и на С наверно этого сделать не сможет. 

я думаю это заблуждение, программирование развивается в сторону большей абстракции, так-как:
  • железо стоит дешево
  • программисты стоят дорого
то-есть, нанимая 10 программистов на Си, работодатель получает через какое-то время готовый проект который относительно быстро работает, но он его разработка обошлась дорого и его сложно поддерживать, так-как для этого опять-же нужны программисты на Си. 
В то-же время можно нанять одного ООП-шника программиста на python, java, C# etc (в зависимости от задачи), который сделает то-же самое, но быстро, этот проект сможет поддерживать кто угодно, а разницу в скорости работы программы можно очень недорого компенсировать лучшим железом. В общем это намного дешевле, соответственно конечный продукт при том-же функционале будет стоить намного меньше.
Кстати, контроллеры нынче часто программируют на java, и в этом нет ничего плохого smile

http://www.codinghorror.com/blog/archives/001198.html

Автор: ama_kid 30.12.2008, 13:40
Цитата(Lazin @  30.12.2008,  13:51 Найти цитируемый пост)
Кстати, контроллеры нынче часто программируют на java, и в этом нет ничего плохого
Можешь привести парочку наименований? Я хоть для общего развития почитаю про них, а то не слышал про такое... Кстати, хорошего на мой взгляд в этом ничего нет, но возможно, у меня взгляд замылен, и технологии уже утопали настолько далеко, что я безнадежно отстал от них. Тогда надо наверстывать smile
Цитата(Lazin @  30.12.2008,  13:51 Найти цитируемый пост)
то-есть, нанимая 10 программистов на Си, работодатель получает через какое-то время готовый проект который относительно быстро работает, но он его разработка обошлась дорого и его сложно поддерживать, так-как для этого опять-же нужны программисты на Си. 
В то-же время можно нанять одного ООП-шника программиста на python, java, C# etc (в зависимости от задачи), который сделает то-же самое, но быстро, этот проект сможет поддерживать кто угодно, а разницу в скорости работы программы можно очень недорого компенсировать лучшим железом.
Я думаю, ksili не зря упомянул про реальный сектор. А там - всякие питоновцы, пхп-вцы, C#-цы и прочие (около)web-кодеры места себе не найдут или найдут, но где-то на очень высоком уровне абстракции от собственно реального уровня промышленного оборудования... 
Для темы общесофтварной разработки - ты, конечно, прав... smile 
Цитата(Lazin @  30.12.2008,  13:51 Найти цитируемый пост)
железо стоит дешево
Опять же, сертифицированное железо, применяемое в реальном (т.е. околотехнологическом) производстве, стоит ОЧЕНЬ дорого (по сравнению с себестоимостью, конечно). Несертифицированное - просто мало кто применяет, а кто применяет - на свой страх и риск и как правило на некритичных\вспомогательных участках и\или в условиях недофинансирования...
Цитата(ksili @  30.12.2008,  13:04 Найти цитируемый пост)
Вообще таких специалистов как топикстартер сейчас пожалуй даже не хватает в реальном производстве. Я имею в виду людей который не ломает писать на ассемблере или С без использования каких бы то ни было шаблонов. А ООП-шников навалом. Предложи человеку, который первое что узнал - ООП, что-нибудь написать для микроконтроллера, так он и на С наверно этого сделать не сможет. 
правильно сказал, я бы даже немного добавил - очень нехватает людей, которые могут с легкостью обучиться чему-то нестандартному и подхватить на лету "идею", и именно люди с незашоренным философией ООП взглядом могут проявить себя в таком качестве максимально эффективно. Собственно, берусь это утверждать именно потому, что за несколько лет работы в этой отрасли из всех студентов, что у меня были - только два смогли реально быстро включиться в работу и оба, как ни странно, очень хорошо знали только ассемблер\базовый С, ну и аппаратно\электронную сторону железа. Всякие ООП им нафиг не сдались на то время...

Автор: Lazin 30.12.2008, 14:05
http://www.jcontrol.org/index_en.php например

Добавлено через 3 минуты и 23 секунды
Цитата(ama_kid @  30.12.2008,  13:40 Найти цитируемый пост)
Я думаю, ksili не зря упомянул про реальный сектор. А там - всякие питоновцы, пхп-вцы, C#-цы и прочие (около)web-кодеры места себе не найдут или найдут, но где-то на очень высоком уровне абстракции от собственно реального уровня промышленного оборудования... 

реальный сектор это не только встраиваемые системы smile 

Цитата(ama_kid @  30.12.2008,  13:40 Найти цитируемый пост)
правильно сказал, я бы даже немного добавил - очень нехватает людей, которые могут с легкостью обучиться чему-то нестандартному и подхватить на лету "идею", и именно люди с незашоренным философией ООП взглядом могут проявить себя в таком качестве максимально эффективно. Собственно, берусь это утверждать именно потому, что за несколько лет работы в этой отрасли из всех студентов, что у меня были - только два смогли реально быстро включиться в работу и оба, как ни странно, очень хорошо знали только ассемблер\базовый С, ну и аппаратно\электронную сторону железа. Всякие ООП им нафиг не сдались на то время... 

так ведь это не проблема ООП подхода а проблема обучения, кто мешает знать и то и другое?

Автор: perloid 30.12.2008, 14:53
Можно и без классов - напирмер oberon, javascript ... Классы это всего лиш способ реализации ООП в некоторых языках. В oberon (zonnon, blackbox) нету никаких классов, есть расширяемые структуры, есть модули.

Автор: source777 7.1.2009, 18:41
Цитата(Lazin @  29.12.2008,  12:47 Найти цитируемый пост)
кстати, хорошо спроектированная программа или библиотека не нуждается в большом количестве комментариев.
+1
На практике комментарии не так уж полезны, как об этом теоретизируют, зачастую даже вредны. Надо чётко осознавать, что хорошие комментарии не дублируют код и не объясняют его, они лишь поясняют его цель, т.е. описывают намерения программиста, а не то, что он написал, т.к. сам язык программирования в этом плане гораздо яснее и лаконичнее. Если же программист не способен написать код, который понятен без комментариев(т.е. комментарии чуть ли не в каждой третьей строке), то с чего вы взяли, что он будет способен написать понятный комментарий  smile  Такие комментарии вредны, и со временем вовсе рассинхронизируются с кодом, что приводит к тому, что неправильными становятся и код, и комментарии к нему.
Хороший код читается как простой текст на английском(пусть и немного корявый со стилистической точки зрения), и классы в данном плане отлично помогают. Но надо понимать, что классы - это синтаксический сахар, как тут уже говорили, т.е. они делают процесс кодирования более приятным, но отнюдь не обеспечивают ООП... 
ООП может быть без классов, а классы могут быть без ООП. Большинство противников ООП просто не осознают сей простой факт.
 

Автор: nerezus 7.1.2009, 19:33
source777, *doc - это тоже комментарии, если что ;)

Автор: lukas 8.1.2009, 09:58
Поди напиши VCL на одних функциях и goto.

Хороший пример применения ООП это обертка GUI для WinAPI.

Автор: 31416 9.1.2009, 06:30
Многое зависит от предметной области задачи и от взгляда программиста на эту задачу,
именно отсюда он будет выделять классы, кто-то сделает это очень криво так что потом никто не разберется и нужны тысячи комментов
а кто-то выделит самую суть и его код будет читаем без всяких комментов компактен и легко подключаем.

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

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

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

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

Вот такое вот у меня на сегодняшний день мнение)

Автор: Torsten 11.2.2009, 20:12
Все зависит от задачи.
Другое дело, что хороший язык программирования должен давать возможность делать так, как разработчик считает это нужным, а не действовать в рамках ограничений конкретного ЯП.

Добавлено через 3 минуты и 47 секунд
Цитата(source777 @  7.1.2009,  18:41 Найти цитируемый пост)
+1На практике комментарии не так уж полезны, как об этом теоретизируют, зачастую даже вредны. Надо чётко осознавать, что хорошие комментарии не дублируют код и не объясняют его, они лишь поясняют его цель, т.е. описывают намерения программиста, а не то, что он написал, т.к. сам язык программирования в этом плане гораздо яснее и лаконичнее. Если же программист не способен написать код, который понятен без комментариев(т.е. комментарии чуть ли не в каждой третьей строке), то с чего вы взяли, что он будет способен написать понятный комментарий    Такие комментарии вредны, и со временем вовсе рассинхронизируются с кодом, что приводит к тому, что неправильными становятся и код, и комментарии к нему.Хороший код читается как простой текст на английском(пусть и немного корявый со стилистической точки зрения), и классы в данном плане отлично помогают. Но надо понимать, что классы - это синтаксический сахар, как тут уже говорили, т.е. они делают процесс кодирования более приятным, но отнюдь не обеспечивают ООП... 

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

Автор: makarov_dv 14.2.2009, 15:25
Очень интересная тема.....

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

Программист, работающий под конкретную задачу, это боец. Мгновенная реакция. Идеальное владение техникой. Хакер, с точки зрения не деструктивных мотиваций, а возможности программирования on-line.

Архитектор продает продукт, Хакер свою работу.

Как правильно программировать, вопрос не принципа, а психологии.

Холерик и сангвиник - Хакеры.
Флегматик и меланхолик - Архитекторы.



Автор: Krawler 15.3.2009, 17:33
Цитата(makarov_dv @  14.2.2009,  15:25 Найти цитируемый пост)
Флегматик и меланхолик - Архитекторы.

 [offtopic] Я флегматик. => Я архитектор... Верно подмечено, мне ООП нравится гораздо больше процедурного стиля... И когда пришлось работать как-то с чистым WinAPI у меня промелькнула мысль: а почему бы не сделать обертку для всего этого с использованием ООП

Автор: kosmonaFFFt 15.3.2009, 20:10
smile Кстати да, я тож например флегматик и ближе к архитектору, чем к хакеру...
Сейчас например LISP осваиваю, так первое за что взялся - объектная система... smile

Автор: slavaentp 29.11.2009, 16:33
Объясню, за что я на функции взъелся: не люблю прыгать по коду и постоянно скроллить туда-сюда.

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

А через какое-то время в программе наступает тупик - не получается реализовать что-то. И я понимаю, что запутался в собственной программе.

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

if (условие)
{
     Funktsiya();
}

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

Добавлено через 6 минут и 33 секунды
И ещё меня бесят функции в учебных примерах. Очень неудобно читать. MSDN любит писать примеры программы "Hello, world!" кодом на 1000 строк, чтобы программа одновременно ещё и теорему Ферма доказывала(вдруг кто заинтересуется?), хотя я всего лишь интересовался "Console.WriteLine".

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

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

Автор: DenWPF 29.11.2009, 17:15
для этого в MSDN есть синтаксис, который показывает функцию, и если ты доверяешь своим знаниями, то ты можешь без примера всё сделать. а пример это уже для тех кто не смог справится иил не азохтел с одним синтаксисом.

Автор: source777 29.11.2009, 19:15
Цитата(slavaentp @  29.11.2009,  16:33 Найти цитируемый пост)
И меня раздражает, когда вместо обычного линейного кода я получаю что-то типа "LetThisShitWork()" и полные непонятки, чот это означает. 

А ты пробовал именовать функции нормальными идентификаторами, а не такими дебильными как LetThisShitWork и Funktsiya?

P.S. Нехорошо откапывать такие старые темы smile 

Автор: slavaentp 29.11.2009, 20:48
Цитата(DenWPF @ 29.11.2009,  17:15)
для этого в MSDN есть синтаксис, который показывает функцию, и если ты доверяешь своим знаниями, то ты можешь без примера всё сделать. а пример это уже для тех кто не смог справится иил не азохтел с одним синтаксисом.

Что ты имеешь в виду под словом "синтаксис"? Я плохо понимаю описания MSDN. Я гораздо лучше понимаю на примерах.

Добавлено через 1 минуту и 50 секунд
Цитата(source777 @ 29.11.2009,  19:15)
Цитата(slavaentp @  29.11.2009,  16:33 Найти цитируемый пост)
И меня раздражает, когда вместо обычного линейного кода я получаю что-то типа "LetThisShitWork()" и полные непонятки, чот это означает. 

А ты пробовал именовать функции нормальными идентификаторами, а не такими дебильными как LetThisShitWork и Funktsiya?

P.S. Нехорошо откапывать такие старые темы smile

Я делаю функции с хорошими именами. А вот MSDN и многие авторы туториалов - нет.
А тему поднял, потому что возник непонятный вопрос.

На самом деле не так всё однозначно - я написал тот пост и сам засомневалсяsmile) Но вот про туториалы и МСДН точно так.

Автор: Exai1e 30.11.2009, 04:25
slavaentp, незнаю, у меня доки в мсдн практически не когда не вызывали проблем с понятием кода по какой либо функции или классу, а если оттуда не мог уловить описание той или иной информации, потому что не всегда хватало знания моего анг =) то гугл выручал всегда.
Это на вкус и цвет, пасмотрите Java api doc у sun. там вообще сам черт ногу сломит (имхо естесно) по сравнению с MSDN

комментарии дело хорошее, когда ими пользуются осмысленно, про что сказал source777[/B) а не в стиле:

Код

//Объявляем переменную А
int a;
//Объявляем переменную B
int b;
//Объявляем переменную RESULT
int result;
//Складываем значение переменной A со значением переменной B и заносим полученный результат в переменную RESULT
result = a + b;

//etc



например если я объявил где то [b]простой
 метод к примеру:
Код

        //Добавление пользователя в список на сервере
        public bool AddUser(string pUserName, string pUsersurname)
        {

        }

я помечу его однострочным комментирием, иногда по ним проще ориентироваться, хотя задача метода часто бывает понятна из имени метода =)

Автор: Любитель 30.11.2009, 06:04
Цитата(slavaentp @  29.11.2009,  16:33 Найти цитируемый пост)
В то же время, если бы код был написал линейно, я бы сразу определил ненужные мне инструкции, пропустил бы их и дошёл до нужных, быстро найдя то, что я искал. 

Убило smile 

Автор: kosmonaFFFt 30.11.2009, 08:47
Насчет перескоков к функции - а не судьба пользоваться IDE, которые это умеют? Мну например, чтобы прыгнуть куда-то, надо просто нажать шифт и жмакнуть по функции мышом... Ну и к тому же если функция работает без ошибок, то зачем смотреть ее код, при каждом вызове? Достаточнотолько знать что она делает...

Автор: slavaentp 5.12.2009, 17:18
_______

Автор: slavaentp 10.12.2009, 19:44
Приведу пример насчёт MSDN.

Вот мне нужно сделать очень простую вещь. Простейшую. На экране должна появиться цифра 1 и через секунду должна появиться цифра 2. Всё, больше ничего не надо.

Я не знаю как это делать. Но знаю, что в C# есть "Timer", вроде он за это отвечает. Открываю MSDN, набираю "Timer" в поисковом окне. Жму на вторую ссылку, мне там выдаёт:

Цитата

Предоставляет механизм для выполнения метода в заданные интервалы времени. Этот класс не может наследоваться.

Примененный к данному типу или члену атрибут HostProtectionAttribute имеет следующее значение свойства Resources: Synchronization | ExternalThreading. Атрибут HostProtectionAttribute не оказывает влияния на настольные приложения (обычно запускаемые двойным щелчком значка, вводом команды или вводом URL в обозревателе). Дополнительные сведения см. в описании класса HostProtectionAttribute или в разделе Программирование SQL Server и атрибуты защиты основного приложения.
saba8ksx.alert_note(ru-ru,VS.90).gifПримечание.

Примененный к этому классу атрибут HostProtectionAttribute имеет следующее значение свойствResources: Synchronization | ExternalThreading. Атрибут HostProtectionAttribute не оказывает влияния на приложения рабочего стола (обычно запускаемые двойным щелчком значка, вводом команды или вводом URL-адреса в веб-обозревателе). Дополнительные сведения см. в описании класса HostProtectionAttribute или разделе Программирование SQL Server и атрибуты защиты основного приложения.

Следует использовать делегат TimerCallback для задания метода, который надо выполнить объектом Timer. Делегат таймера задается при создании объекта таймера и не может изменяться. метод не выполняется в потоке, создавшем таймер; он выполняется в отдельном потоке ThreadPool, предоставляемом системой.

При создании таймера можно задать количество времени, в течение которого ожидать первого выполнения метода (ожидаемое время), и количество времени, в течение которых происходит ожидание между последовательными вызовами (период). Можно изменять эти значения, или отключить таймера используя метод Change.
saba8ksx.alert_note(ru-ru,VS.90).gifПримечание.

В течение всего использования объекта Timer, необходимо хранить на него ссылку. Что касается любого управляемого объекта, то объект Timer подлежит сборке мусора, когда на этот объект не существует ссылок. Тот факт, что Timer все еще активен, не предотвращает его от утилизации.

Когда в таймере больше нет необходимости, следует использовать метод Dispose для освобождения ресурсов, которые занимает таймер. Для получения сигнала после ликвидации таймера следует использовать перегрузку метода Dispose(WaitHandle), использующую WaitHandle. Объект WaitHandle получает сигнал при удалении таймера.

Метод обратного вызова, выполняемый таймером, должен быть реентерабельным, так как он вызывается потоками из ThreadPool. Обратный вызов может выполняться одновременно в двух пулах потоков, если интервал таймера меньше, чем время, нужное для выполнения обратного вызова, или если все пулы потоков уже используются, а обратный вызов запрошен несколько раз.
saba8ksx.alert_note(ru-ru,VS.90).gifПримечание.

Объект System.Threading..::.Timer — простой таймер, использующий методы ответного вызова, который обслуживается потоками пула. Не рекомендуется использовать с Windows Forms, поскольку обратные вызовы не происходят в потоках пользовательского интерфейса. System.Windows.Forms..::.Timer является более желательным вариантом для использования с Windows Forms. Для функций таймера, базирующихся на сервере, можно использовать System.Timers..::.Timer, который управляет событиями и обладает дополнительными функциями.
 Примеры

Вот как мне по ЭТОМУ понять, как мне мою простенькую задачу выполнить?

Автор: kosmonaFFFt 10.12.2009, 22:05
0) написать метод, который вызывается по таймеру
1) создать таймер, передать ему делегат на метод
2) задать время срабатывания 1 с
3) задать однократное срабатывание
4) запустить таймер
smile Примерно так...
Я когда последний раз пользовался таймером на C#, вообще не читал ничего, а просто посмотрел какие методы у него есть,
и сделал то, что мне нужно...

Автор: Lazin 10.12.2009, 22:33
Цитата(slavaentp @  10.12.2009,  19:44 Найти цитируемый пост)
Вот как мне по ЭТОМУ понять, как мне мою простенькую задачу выполнить?
блин, да проблема оказывается не в классах, может начать с чего нибудь попроще, ну там с helloworld-a например?

Автор: source777 10.12.2009, 23:05
Да закройте уже эту тему. А то скоро её будет пора в песочницу переносить...

Автор: GoldFinch 11.12.2009, 10:57
Цитата(slavaentp @  10.12.2009,  19:44 Найти цитируемый пост)
Вот мне нужно сделать очень простую вещь. Простейшую. На экране должна появиться цифра 1 и через секунду должна появиться цифра 2.

в псевдокоде:
Код

print("1")
sleep(1000)
print("2")

Автор: list2006 29.9.2010, 17:11
Тебе мой друг подойдет Си (чистый, не С++)
хотя не кто не заставляет классы строить, он идеален как объект данных, в остальном это не панацея и пихать куда не надо не стоит.

Автор: RockClimber 30.11.2010, 08:54
Цитата(list2006 @  29.9.2010,  17:11 Найти цитируемый пост)
Тебе мой друг подойдет Си (чистый, не С++)

А паскаль не подойдет? Чорт, а я уже все написал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)