Курсы по JAVAкуда пойти учиться???
#22
Отправлено 07.11.2006, 11:42:20
Каждый программист знает, что тестировать программы нужно всегда. Независимо от того, на сколько профессионально они сделаны. То количество ошибок, которое может возникнуть при тестировании на разных ОС, зависит от уровня граммотности разработчика, т.к. все известные проблемы можно сразу учитывать во время разработки.Java завоевал популярность благодаря двум главным преимуществам: 1) своей независимости от платформы (теоретически, одна и таже программа без всякой переделки может работать под Linux, Windows, Macintosh и т.д.) и 2) своей доступности: Java SDK можно было бесплатно загрузить с сервера Sun.
Однако на практике все оказалось не так-то просто. Красивый лозунг, придуманный для Java "Написано один раз - запускается везде" вскоре многие разработчики стали произносить с разочарованием и иронией: "Написано один раз - отлаживать надо везде"
Никто из начинающих не будет сразу заниматься так называемыми настояшими профессиональными работами, так что на первые 2-3 года каждый начинающий обеспечен бесплатным ПО в виде Eclipse или NetBeans.А бесплатность тоже, как оказалось, имеет свои пределы. Для настоящей профессиональной работы на Java все равно понадобятся коммерческие пакеты. Доказательством этого являются популярные пакеты Visual Cafe, Visual Age и JBuilder.
Мне пока известно, что есть ограничения в области DirectX, но над этим люди работают.Кроме того, сам язык Java, хотя и значительно более упорядочен по сравнению с очень похожим на него С++, но именно этот строгий порядок, дисциплина, обернулись ограничением свободы разработчика:[list]
Если не ошибаюсь. то в С++ можно выйти за рамки размера массива, что приведет к непредсказуемым поведениям программы.Java, в отличие от С++, не поддерживает указатели. Работа напрямую с памятью невозможна, зато повышается безопасность работы приложений (иногда в ущерб быстродействию).
Ни один нормальный Java программист не надеется на сборщик мусора на все 100%. Но, в то же время, опытному Java программисту, открываются тайны, как более граммотно избегать утечек памяти. Например, правильное использование слушателей.Среда Java предоставляет механизм сборки "мусора", который предотвращает утечки памяти.
Если под операторами понимаются поля класса, то, используя принцип инкапсуляции, переопределять их просто нет смысла. Но можно, создав их как public.Java, в отличие от С++, не поддерживает перегрузку операторов.
Глобальные функции допускаются и называются они статическими методами.Java является полностью объектно-ориентированным языком. Это значит, все функции должны определяться в области видимости класса. Глобальные функции не допускаются - значит, программист на Java не может применять процедурное программирование (тогда как в С++ глобальные данные и функции допускаются, и процедурное программирование всегда возможно, хотя С++ при этом полностью объектно-ориентированный язык).
Процедурное программирование в Java просто не нужно. Нет смысла.
Все (или почти все, т.к. есть еще темные места в области безопасности) имеющиеся классы в Java можно переопределить задав им нужные свойства.Java поставляется в комплекте с обширной иерархией классов, это одновременнно и достоинство, и недостаток (легче вести разработку, но в то же время выше зависимость разработчика от готовых классов).
#23
Отправлено 07.11.2006, 12:14:07
или функциями-членами.Поясните пожалуйста, что значит "виртуальные функции"?
Вообще-то в Java эти самые функции принято называть методами.
Точно самое время вводить определения:
Если метод класса может быть переопределен в классах-наследниках и при этом реализация метода определяется во время исполнения, то данный метод можно смело назвать - virtual.
Сообщение отредактировал T. Anre: 07.11.2006, 12:15:07
#24
Отправлено 08.11.2006, 00:21:23
Поясните пожалуйста, что значит "виртуальные функции"?
Вообще-то в Java эти самые функции принято называть методами.
1. Определение виртуальных функций уже достаточно хорошо дано T. Anre, оно правильное, но слишком краткое, суть виртуальных функций может остаться непонятной. Ключевыми словами здесь являются "реализация метода определяется во время исполнения". Отметим, что в производном классе ничто не мешает перекрыть и те функции базового класса, которые в базовом классе не были объявлены виртуальными. И такое перекрытие функций (точнее, их скрытие в производном классе) иногда бывает необходимо.
При вызове виртуальной функции необходимо делать проверки во время выполнения, чтобы определить, какой из перекрывающихся методов нужно вызвать. Но для невиртуальных функций эта информация доступна во время компиляции (компилятор может определить соответствующий перекрывающий метод по типу объекта, на который объявлена ссылка). А для виртуальных функций это невозможно: объектная переменная может указывать на базовый класс B, но компилятор ведь позволяет такой переменной хранить ссылку и на любой класс D, производный от B (на стадии компиляции это неизвестно!). В таком случае вызываться будет виртуальная функция базового класса - если она не была перекрыта в производном классе - а если была, то будет вызвана перекрывающая ее функция объекта производного класса - и только путем поиска адреса этой функции в таблице виртуальных функций vtable. Так-то.
2. Каждая функция - это метод. Но методы - это лишь часть функций класса. Термин "функция" обозначает не только методы, но и все остальное, что не является данными, но может содержаться в классе: конструкторы, деструкторы, операции.
А в C# к функциям относятся, кроме того, индексаторы, а еще - свойства (хотя по своему внешнему виду и способу работы с ними свойства очень похожи на данные).
Сообщение отредактировал Visual1: 08.11.2006, 01:39:41
#25
Отправлено 08.11.2006, 00:46:45
Да. Теперь благодаря Java каждый программист знает, что тестировать программы нужно не только всегда, но и везде.Каждый программист знает, что тестировать программы нужно всегда. Независимо от того, на сколько профессионально они сделаны. То количество ошибок, которое может возникнуть при тестировании на разных ОС, зависит от уровня граммотности разработчика, т.к. все известные проблемы можно сразу учитывать во время разработки.
Аналогично, для начинающих Microsoft предоставляет бесплатную учебную версию Visual Studio .NET 2005, в ней тоже есть все, что необходимо, и она позволяет (с некоторыми ограничениями) создавать вполне реальные и даже вполне коммерческие программы. Так что уровень "бесплатности" MS VS.NET ничуть не хуже (если не лучше), чем у Java.Никто из начинающих не будет сразу заниматься так называемыми настояшими профессиональными работами, так что на первые 2-3 года каждый начинающий обеспечен бесплатным ПО в виде Eclipse или NetBeans.
Если речь идет о классическом С++, то нет, не ошибаетесь. Хотя я не вижу здесь особой проблемы для среднего программиста на С++, а с использованием STL этой проблемы вообще нет. В С# этой проблемы с самого начала не существует - массив поддерживается как определенный, отдельный тип. Каждый созданный в программе массив - это объект, имеющий методы и свойства. Диапазон массива является свойством, есть методы для его установки и контроля. Более того, в C# массив может менять свой размер динамически. Вообще, работать с массивами в C# очень удобно - программисту предоставляются все наиболее необходимые свойства и методы (сортировка массива, получение его длины, причем в случае многомерного массива длину можно получить по каждому из измерений). Во всех случаях память под массивы выделяется и освобождается автоматически. Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java?Если не ошибаюсь. то в С++ можно выйти за рамки размера массива, что приведет к непредсказуемым поведениям программы.
Нет. Под операторами понимаются не "поля класса", а операторы. Например такие, как + (оператор операции сложения), - (оператор операции вычитания). Если вы разработали класс Vector, то в Java вы не сможете написать:Если под операторами понимаются поля класса, то, используя принцип инкапсуляции, переопределять их просто нет смысла. Но можно, создав их как public.
Vector V1, V2, V3; // Инициализация V2 и V3 ... V1 = V2 + V3;потому что Java не поддерживает перегрузку операций. Хотя конечно, перегрузка методов, я думаю, программистам на Java хорошо знакома, а без перегрузки операций Java все равно остается полностью объектно-ориентированным языком. Однако в Java придется разработать вместо операции для каждого класса свой метод этого класса. И затем в Java-программе вместо простейшего D = (A + B)*C вам придется написать что-нибудь вроде
D = C.Multiply(A.Add(B));и еще разобраться, выполняет ли здесь оператор присваивания = на самом деле то, что подразумевал программист? Скорее всего, нет.
С этим я полностью не согласен. Статический метод можно вызывать без создания экземпляра класса, но попробуйте написать в Java простейшую программу, чтобы в ней хотя бы одна функция была глобальной - иначе говоря, чтобы она была определена вне любого класса. Глобальных функций (методов) в Java нет, любые методы (статические и нестатические) обязательно принадлежат своим классам.Глобальные функции допускаются и называются они статическими методами.
В С++ тоже вообще-то нет. Он создавался как полностью объектно-ориентированый язык - однако все возможности процедурного программирования в стиле C там удалось сохранить, без всякого ущерба для реализации принципов ООП. Это удобно при написании низкоуровневых программ - в отличие от Java, разработчику на С++ не понадобится переходить на другой язык.Процедурное программирование в Java просто не нужно. Нет смысла.
#26
Отправлено 08.11.2006, 05:42:36
Не совсем так, если использовать функцию at(), то будет исключение, а если оператор [], то будет то же, что и в случае обычных массивов.Если речь идет о классическом С++, то нет, не ошибаетесь. Хотя я не вижу здесь особой проблемы для среднего программиста на С++, а с использованием STL этой проблемы вообще нет.
Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java?
И правильно Перегрузка порождает больше проблем, чем преимуществ. Она оправдана довольно редко, в случаях например математических операций над векторами или матрицами. Но подобные задачи в индустриальном программировании редки.потому что Java не поддерживает перегрузку операций. Хотя конечно, перегрузка методов, я думаю, программистам на Java хорошо знакома, а без перегрузки операций Java все равно остается полностью объектно-ориентированным языком. Однако в Java придется разработать вместо операции для каждого класса свой метод этого класса. И затем в Java-программе вместо простейшего D = (A + B)*C вам придется написать что-нибудь вроде
D = C.Multiply(A.Add(B));и еще разобраться, выполняет ли здесь оператор присваивания = на самом деле то, что подразумевал программист? Скорее всего, нет.
Понятия глобальных функций и открытых статических идентичны. Разница лишь в синтаксисе. Можете считать имя класса аналогом пространства имён в С++. То же относится и к константам.С этим я полностью не согласен. Статический метод можно вызывать без создания экземпляра класса, но попробуйте написать в Java простейшую программу, чтобы в ней хотя бы одна функция была глобальной - иначе говоря, чтобы она была определена вне любого класса. Глобальных функций (методов) в Java нет, любые методы (статические и нестатические) обязательно принадлежат своим классам.
Отмечу, что возможности процедурного программирования в стиле С в С++ остались лишь потому, что он должен быть совместим с С.В С++ тоже вообще-то нет. Он создавался как полностью объектно-ориентированый язык - однако все возможности процедурного программирования в стиле C там удалось сохранить, без всякого ущерба для реализации принципов ООП. Это удобно при написании низкоуровневых программ - в отличие от Java, разработчику на С++ не понадобится переходить на другой язык.
#27
Отправлено 08.11.2006, 07:28:02
"Лехко"? Покажите, пожалуйста, как это делается в С++.Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java?
И какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.И правильно Перегрузка порождает больше проблем, чем преимуществ. Она оправдана довольно редко, в случаях например математических операций над векторами или матрицами. Но подобные задачи в индустриальном программировании редки.
Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.Отмечу, что возможности процедурного программирования в стиле С в С++ остались лишь потому, что он должен быть совместим с С.
P.S. Да, и научитесь, пожалуйста, правильно цитировать.
#28
Отправлено 08.11.2006, 12:19:34
"Лехко"? Покажите, пожалуйста, как это делается в С++.
vector< vector<int> > m; m.resize(N); for (unsigned i = 0; i < N; ++i) m[i].resize(i + 1); for (unsigned i = 0; i < N; ++i) for (unsigned j = 0; j < i; ++j) m[i][j] = i + j;
Проблемы в том, что зачастую за выражениемИ какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".
Безусловно. Совместимость с С это очень важная вещь, которая позволяет напрямую использовать все интерфейсы ОС, без промежуточных прослоек.Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.
#29
Отправлено 08.11.2006, 13:30:34
Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab."Лехко"? Покажите, пожалуйста, как это делается в С++.
Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java?
#30
Отправлено 08.11.2006, 13:53:35
Статические функции не виртуальны. Их нельзя переопределить в подклассах, а вызываться они могут с уровня класса или его объекта в зависимости от видимости. Разумеется , и работают они быстрее остальных, тк связываются во время компиляции.Мне намного интереснее получить ответ на свой вопрос: так все же, что хорошего и что плохого в том, что в Java все функции обязаны быть виртуальными?
А это "неровный" массив (с разной длиной подмассивов)Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? wink.gif
String[][] неровныйМассив = {{"a","b"},{"a","b","c"}};
Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностейпрограммист на Java не может применять процедурное программирование (тогда как в С++ глобальные данные и функции допускаются, и процедурное программирование всегда возможно, хотя С++ при этом полностью объектно-ориентированный язык).
Сообщение отредактировал antee: 08.11.2006, 13:55:39
#31
Отправлено 08.11.2006, 19:42:27
М-да, это называется "лехко"?
"Лехко"? Покажите, пожалуйста, как это делается в С++.vector< vector<int> > m; m.resize(N); for (unsigned i = 0; i < N; ++i) m[i].resize(i + 1); for (unsigned i = 0; i < N; ++i) for (unsigned j = 0; j < i; ++j) m[i][j] = i + j;
В C# делается так:
int[][] a = new int[3][]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1];Вот и все, что понадобилось для создания неровного массива. Отметим также, что C# позволяет создавать массивы, не инициализируя их.
Как будто бы код вроде D = C.Multiply(A.Add(B)) легче сопровождать, чем D = (A + B)*C А ведь реальные, неупрощенные формулы приведут к намного более устрашающему виду. Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.Проблемы в том, что зачастую за выражением
И какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".
Вот это, на самом деле, не только правильное, но и важное замечание.Безусловно. Совместимость с С это очень важная вещь, которая позволяет напрямую использовать все интерфейсы ОС, без промежуточных прослоек.
Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.
#32
Отправлено 08.11.2006, 19:52:12
Покажите, пожалуйста, как создается непрямоугольный ("неровный") массив в Java. Для примера возьмите массив такой же, как в моем ответе для v04bvs. Интересно, намного ли проще получится в Java, чем в С#.Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab.
#33
Отправлено 08.11.2006, 20:30:50
Спасибо, но это уже объяснили раньше (см. ответ T. Anre на предыдущей странице). Однако все остальные функции в Java обязаны быть виртуальными, если не ошибаюсь? И ответа на мой вопрос, хорошо это или плохо, пока не дал никто.Статические функции не виртуальны.
Мне намного интереснее получить ответ на свой вопрос: так все же, что хорошего и что плохого в том, что в Java все функции обязаны быть виртуальными?
С уровня класса или его объекта, Вы сказали? Это что, надо создавать объект, чтобы вызвать статическую функцию? Впервые вижу такое.Их нельзя переопределить в подклассах, а вызываться они могут с уровня класса или его объекта в зависимости от видимости.
Интересный у Вас поворот мысли. Меня, оказывается, надо "спасать от процедурного стиля программирования"? Я всегда хочу использовать объектные возможности, но иногда все же требуется процедурное программирование и прямое обращение к функциям API (см. предыдущие сообщения). Как уже говорилось, Java такой возможности не предоставляет.Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностей
#34
Отправлено 08.11.2006, 22:40:23
Покажите, пожалуйста, как создается непрямоугольный ("неровный") массив в Java. Для примера возьмите массив такой же, как в моем ответе для v04bvs. Интересно, намного ли проще получится в Java, чем в С#.
Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab.
Двумерные непрямоугольные массивы, как в JAVA так и в C#, называются рваными.
Как можно объявлять двумерные массивы в некоторых языках.
//C# int[][] a = new int[3][]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1]; // JAVA int[][] a = new int[3][]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1]; // JAVA int[][] b = {{1,2,3,4}, {1,2,3}, {1}} //PHP $a = array( array(1,2,3,4), array(1,2,3), array(1) ); //JAVASCRIPT a = { 0:{0:1,1:2,2:3,3:4}, 1:{0:1,1:2,2:3}, 2:{0:1} };
Сообщение отредактировал T. Anre: 08.11.2006, 23:05:51
#35
Отправлено 08.11.2006, 23:27:54
Да, это называется лехко А что здесь сложного то?М-да, это называется "лехко"?
vector< vector<int> > m; m.resize(N); for (unsigned i = 0; i < N; ++i) m[i].resize(i + 1); for (unsigned i = 0; i < N; ++i) for (unsigned j = 0; j < i; ++j) m[i][j] = i + j;
Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.Как будто бы код вроде D = C.Multiply(A.Add(B)) легче сопровождать, чем D = (A + B)*C А ведь реальные, неупрощенные формулы приведут к намного более устрашающему виду.
Проблемы в том, что зачастую за выражением
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".
В сущности я с вами согласен. Я люблю свободу, и люблю язык, который мне её даёт. Но не весь код пишу я, вот ведь в чём проблема .Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.
#36
Отправлено 08.11.2006, 23:45:07
Тут дело не в сложности, а в неудобстве, нечитабельности, громоздкости.Да, это называется лехко А что здесь сложного то?
На Java пишутся игры, моделируются физические процессы и тд и тп. Так что можно с уверенностью сказать, что при программировании на Java ,частенько, приходится иметь дело с формулами.Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.
В любых отношениях главное... границы (с) к-ф Милашка (Кэмерон Диаз)В сущности я с вами согласен. Я люблю свободу, и люблю язык, который мне её даёт. Но не весь код пишу я, вот ведь в чём проблема .
Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.
Сообщение отредактировал T. Anre: 08.11.2006, 23:47:22
#37
Отправлено 09.11.2006, 01:14:31
Может и правда, ничего особо сложного... после серьезного изучения шаблонов, однако. А как бы у вас выглядел на С++ приведенный у меня выше пример очень простого непрямоугольного массива на C#? Что, там тоже без двойного цикла обойтись нельзя?Да, это называется лехко А что здесь сложного то?
М-да, это называется "лехко"?
vector< vector<int> > m; m.resize(N); for (unsigned i = 0; i < N; ++i) m[i].resize(i + 1); for (unsigned i = 0; i < N; ++i) for (unsigned j = 0; j < i; ++j) m[i][j] = i + j;
И вообще, насчет громоздкости, нечитабельности присоединяюсь к мнению T. Anre.
Дело, конечно, не в том, откуда возьмутся формулы, и не в линейных уравнениях. Дело в перегрузке операций, которая в C# есть, а в Java - нет. Вы уже говорили об этом:Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.
Мне представляется, что применение перегрузки операций все же оправдано намного чаще, а область этого применения - намного шире:Она оправдана довольно редко, в случаях например математических операций над векторами или матрицами. Но подобные задачи в индустриальном программировании редки.
- не только векторы, но и другие математические объекты (координаты, матрицы, тензоры), а также в программах математического или физического моделирования - там обязательно будут классы, представляющие моделируемые объекты;
- графические программы: они очень широко распространены, а без экранных и оконных координат обойтись там совершенно невозможно;
- программы обработки и анализа текста: там могут быть классы, представляющие собой предложения, абзацы и т.д. Может потребоваться, например, более сложная версия конкатенации строк.
- финансовые программы (учитывая важность и объемы таких программ, в C# даже был введен специальный денежный тип decimal, так что без перегрузки операций для работы с таким типом обходиться будет очень трудно, если только вообще возможно).
В любом случае, никто ведь никого не заставляет использовать перегрузку операций, не так ли?Полноценность ООП без нее тоже не нарушается. В общем, по выбору программиста. Но у программиста на С++ и на С# такой выбор есть, а у Java-программиста - нет.
Сообщение отредактировал Visual1: 09.11.2006, 01:29:14
#38
Отправлено 09.11.2006, 01:30:53
к Sun -овцам надо обращатсяДоброго времени суток, Уважаемые!
Хочу пойти на курсы JAVA, но не могу найти достойную контору у нас в Алмате. Подскажите пожалуйста, может кто-нить проходил курсы и может посоветовать куда пойти учиться, желательно с телефончиками и адресами.
Заранее премного благодарен...
#39
Отправлено 09.11.2006, 02:02:28
Ну не знаю. У меня проблем с чтеним этого кода нет. Вам виднее конечно.Тут дело не в сложности, а в неудобстве, нечитабельности, громоздкости.
Может и правда, ничего особо сложного... после серьезного изучения шаблонов, однако. А как бы у вас выглядел на С++ приведенный у меня выше пример очень простого непрямоугольного массива на C#? Что, там тоже без двойного цикла обойтись нельзя?
И вообще, насчет громоздкости, нечитабельности присоединяюсь к мнению T. Anre.
vector< vector<int> > a(3); a[0].resize(4); a[1].resize(3); a[2].resize(2);
Насчёт шаблонов - да, их знать надо, без них на С++ программировать тяжело.
Кстати, на всякий случай скажу, что вышеприведённый код является всего лишь примером использования библиотеки STL. Если говорить про полный аналог динамического массива в языке, то это можно записать так:
int **a = new (int*)[3]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1];Другое дело, что освобождать память в этом случае надо будет самостоятельно, да и к тому же приведённый код не является безопасным, по отношению к исключениям, поэтому предпочтительней использовать 1-й вариант.
#40
Отправлено 09.11.2006, 12:03:45
Visual1, в чем проблема-то? Хочешь виртуальную или не виртуальную - всё это есть в java, для области применения которой этого более чем достаточно. Или это самоцель какая-то : чтобы часть других функций можно было делать не виртуальными?...
Спасибо, но это уже объяснили раньше (см. ответ T. Anre на предыдущей странице). Однако все остальные функции в Java обязаны быть виртуальными, если не ошибаюсь? И ответа на мой вопрос, хорошо это или плохо, пока не дал никто.
Ответ на вопрос: Для java это хорошо , тк является неотъемлемой частью её последовательной объектной концепции, позволяющий делать качественный дизайн реализации бизнес логики не отвклекаясь на технические детали. Если использовать java платформу по назначению - такой вопрос вряд ли возникнет, по крайней мере мой опыт это подтверждает.
Еще раз перечитал своё высказывание - вроде понятно должно быть.С уровня класса или его объекта, Вы сказали? Это что, надо создавать объект, чтобы вызвать статическую функцию? Впервые вижу такое.
Их нельзя переопределить в подклассах, а вызываться они могут с уровня класса или его объекта в зависимости от видимости.
Имел ввиду следующее:
class StaticExample {
public void static staticMethod {
System.out.println("Static method");
}
}
Вызывать можно двумя способами:
StaticExample.staticMethod(); - рекомендуемое использование
new StaticExample().staticMethod();
Никто вас не ограничит написание метода на целую страницу в процедурном стиле.... Пишите, если нравится...Интересный у Вас поворот мысли. Меня, оказывается, надо "спасать от процедурного стиля программирования"? Я всегда хочу использовать объектные возможности, но иногда все же требуется процедурное программирование и прямое обращение к функциям API (см. предыдущие сообщения)
Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностей
Сообщение отредактировал antee: 09.11.2006, 12:37:51
Количество пользователей, читающих эту тему: 0
пользователей: 0, неизвестных прохожих: 0, скрытых пользователей: 0