Comments 30
Спасибо. Отличная статья и отличная библиотека. Добавлю в закладки.
+3
Рефлекс как у собаки Павлова — хорошо сказано. Который год думаю «выйду в отпуск, появится время, допишу свой проект». И вот наступает долгожданный, какой там проект — отдыхать!
+4
Отличная история, спасибо.
Однако это замечание
> Кроме того, любая критика без ссылки на собственный open source проект восприниматься не будет
весьма подпортило впечатление. Критика, сопровождаемая аргументами и обоснованиями, очень ценна, и не важно, от кого она исходит. Лучше получить к ней в нагрузку необоснованные нападки и проигнорировать их, чем не получить ничего.
Однако это замечание
> Кроме того, любая критика без ссылки на собственный open source проект восприниматься не будет
весьма подпортило впечатление. Критика, сопровождаемая аргументами и обоснованиями, очень ценна, и не важно, от кого она исходит. Лучше получить к ней в нагрузку необоснованные нападки и проигнорировать их, чем не получить ничего.
+8
Вот зря Вы в конце написали: "критика без ссылки на собственный open source проект восприниматься не будет"…
+6
Может быть зря перестраховался от агресивно-настроенной публики Хабра. Может быть вы и правы, сейчас уберу.
+1
И сразу вопрос:
зачем класс объявляется аж так: public class Complex extends Object?
extends Object явно лишнее и не способствует быстрому чтению и пониманию
зачем класс объявляется аж так: public class Complex extends Object?
extends Object явно лишнее и не способствует быстрому чтению и пониманию
0
Этот класс — открытый проект, я просто его включил в la4j.
Вот хедер же:
/**
* Complex implements a complex number and defines complex
* arithmetic and mathematical functions
* Last Updated February 27, 2001
* Copyright 1997-2001
* @version 1.0
* @author Andrew G. Bennett
*/
Вот хедер же:
/**
* Complex implements a complex number and defines complex
* arithmetic and mathematical functions
* Last Updated February 27, 2001
* Copyright 1997-2001
* @version 1.0
* @author Andrew G. Bennett
*/
0
посмотрел глубже — видимо один такой попался и я сразу на него наткнулся :)
а вообще код чистый, С КОММЕНТАРИЯМИ! :)
а вообще код чистый, С КОММЕНТАРИЯМИ! :)
+3
Кстати сначала писал их, потом даже специально стал вырезать. Не нужны они. Нужна документация, в данном случе javadoc с сылками к теории, например в википедию.
А любой коментарий устаревает сразу после того, как вы напишите "//".
А любой коментарий устаревает сразу после того, как вы напишите "//".
+4
лучше код с документацией, чем такой же но без оной. Особенно когда видишь что-то типа:
:)
public void updatePrios(final MultiMap<Pair<Lang,String>,Triple<Source,Integer,Boolean>> newPrios, final int type) {
:)
+1
Поддерживаю: код изменяется, а комментарий остается.
+2
Спасибо.
> непопулярные в университетских кругах языки
А какие?
У вас хорошая обстановка на кафедре по сравнению с моей, даже несмотря на
«непопулярные в университетских кругах языки (читай не С# и C++) и среды разработки (читай не VS2008)».
У нас не давали практически ничего из того, что нужно давать. Шаблоны проектирования? Ну что вы… Их даже не упоминали. Функциональное программирование? Только в виде галочки в учебном плане… Приходилось многое, очень многое изучать самому, а многие преподаватели даже тематику подсказать не могли, — некомпетентность была и остается удручающая.
P.S. У меня тоже есть свой open-source проект. ;)
> непопулярные в университетских кругах языки
А какие?
У вас хорошая обстановка на кафедре по сравнению с моей, даже несмотря на
«непопулярные в университетских кругах языки (читай не С# и C++) и среды разработки (читай не VS2008)».
У нас не давали практически ничего из того, что нужно давать. Шаблоны проектирования? Ну что вы… Их даже не упоминали. Функциональное программирование? Только в виде галочки в учебном плане… Приходилось многое, очень многое изучать самому, а многие преподаватели даже тематику подсказать не могли, — некомпетентность была и остается удручающая.
P.S. У меня тоже есть свой open-source проект. ;)
0
Я бы сказал, в моем вузе отличная обстановка на кафедре, отличные преподаватели, умные ребята. Из-за объемов материала правда учиться невсегда приятно, но это мелочи.
А по поводу изучать самому — уж извольте. Вы высшее образование получаете, вас никто ничему не обязан учить. Ест даже фразеологизм «Научить — невозможно, можно только научиться.» Вас этому и учат на самом деле, учать не матану, вычмату и компиляторам, а учат — учиться и в сжатые сроки, в новой среде предоставлять результат. Инженерия чо уж там :)
А по поводу изучать самому — уж извольте. Вы высшее образование получаете, вас никто ничему не обязан учить. Ест даже фразеологизм «Научить — невозможно, можно только научиться.» Вас этому и учат на самом деле, учать не матану, вычмату и компиляторам, а учат — учиться и в сжатые сроки, в новой среде предоставлять результат. Инженерия чо уж там :)
0
> А по поводу изучать самому — уж извольте. Вы высшее образование получаете, вас никто ничему не обязан учить.
Пожалуйста, спокойнее в формулировках. Свое высшее образование я получил два с половиной года назад, а сейчас и вовсе сам преподаватель.
А так, безотностиельно себя, — да со всем согласен.
Пожалуйста, спокойнее в формулировках. Свое высшее образование я получил два с половиной года назад, а сейчас и вовсе сам преподаватель.
А так, безотностиельно себя, — да со всем согласен.
0
Никого не хотел обидеть и из комментария подумал что вы — студент. Прошу прощения если что.
+1
Никаких обид, что вы. :)
Так какие еще языки вы использовали в своей учебной деятельности? Java? Может, еще что-нибудь?
Так какие еще языки вы использовали в своей учебной деятельности? Java? Может, еще что-нибудь?
0
Университетская программа мягко говоря заточена на С++ (даже тот что managed C++/CLI) и С# и конечно все это добро должно было писаться в VS2005 а потом и 2008 + Лисп и Пролог как части курсов по ФП. Все остальное — на усмотрение студента.
У меня это было, что-то вроде Java, Python + PyQT + numpy, Perl, совсем чуть-чуть PHP. Были эксперименты писать на GTK/QT (на Linux) ну и конечно Mono :)
У меня это было, что-то вроде Java, Python + PyQT + numpy, Perl, совсем чуть-чуть PHP. Были эксперименты писать на GTK/QT (на Linux) ну и конечно Mono :)
+1
Список достоин уважения. Сейчас не все мои бывшие сокурсники-то готовы изучать что-то помимо стандартных C#/С++, что уж говорить о студентах… Кстати, не знаю, что вы имеете в виду под «заточкой на С++», — сейчас я жалею, что ФП у нас толком не было, потому что для многих своих университетских программ я бы выбрал Haskell. Впрочем, и на «плюсах» неплохо все получалось, но считаю, что изучать новые языки, средства и технологии, надо. Раз в год осваивать новый язык, — очень хорошо, но можно и раз в полгода, не повредит. С другой стороны, кроме языков программирования есть еще огромный пласт знаний, — та же автоматизация (сборка, системы контроля версий), те же шаблоны проектирования, то же ФП…
0
> Раз в год осваивать новый язык, — очень хорошо, но можно и раз в полгода, не повредит.
В одной чудесной книге — «Программист-прагматик» именно так и написано. Еще написано, что нужно одну книгу (техническую) хотябы раз в три месяца чиать. Тогда портфель знаний будет на уровне :)
А заточка на С++ — это просто когда тебе читают курс ООП и фиктивный (управляемый) указательна С++/СLI называют «крышечкой» без объяснения что это и зачем. Был у нас грешок на кафедре. Преподаватель ООП, до сих пор обидно, что такой отличный курс, так погано было преподнесен.
В одной чудесной книге — «Программист-прагматик» именно так и написано. Еще написано, что нужно одну книгу (техническую) хотябы раз в три месяца чиать. Тогда портфель знаний будет на уровне :)
А заточка на С++ — это просто когда тебе читают курс ООП и фиктивный (управляемый) указательна С++/СLI называют «крышечкой» без объяснения что это и зачем. Был у нас грешок на кафедре. Преподаватель ООП, до сих пор обидно, что такой отличный курс, так погано было преподнесен.
0
С ООП не только у вас плохо, у нас тоже было, стыдно сказать, изучение Delphi / Builder'a со словами «а вот это — класс». Хотя это далеко не ООП, — это самые-самые начала ООП. В общем, этого курса тоже, можно сказать, не было.
Для противовеса можно вспомнить, что было хорошего. Математика была, много. Некоторую часть вел замечательный преподаватель с многолетним стажем. Лекции его всегда на высоте.
Сейчас я преподаю не на своей кафедре (ИВТ), но на родственной к ней (ПИМ). Если все сложится хорошо, на следующий год попробую забрать себе функциональное программирование у своего бывшего преподавателя. К сожалению, все его предметы были «спустя рукава», — потому что он хоть и профессор, а выпить горазд. В итоге его держат ради его звания, — есть негласные показатели, когда на кафедрах должно быть столько-то кандидатов, столько-то докторов. И с каждым годом эти цифры выдерживать труднее, потому что аспирантов очень мало, докторантов еще меньше. В этой статье написано правильно: чувствуется разрыв поколений.
Для противовеса можно вспомнить, что было хорошего. Математика была, много. Некоторую часть вел замечательный преподаватель с многолетним стажем. Лекции его всегда на высоте.
Сейчас я преподаю не на своей кафедре (ИВТ), но на родственной к ней (ПИМ). Если все сложится хорошо, на следующий год попробую забрать себе функциональное программирование у своего бывшего преподавателя. К сожалению, все его предметы были «спустя рукава», — потому что он хоть и профессор, а выпить горазд. В итоге его держат ради его звания, — есть негласные показатели, когда на кафедрах должно быть столько-то кандидатов, столько-то докторов. И с каждым годом эти цифры выдерживать труднее, потому что аспирантов очень мало, докторантов еще меньше. В этой статье написано правильно: чувствуется разрыв поколений.
+1
Вы высшее образование получаете, вас никто ничему не обязан учить.Тогда следует переименовать его в «высшее самообразование», чтобы не смущать людей. И, конечно, ни дай бог вам когда-нибудь воспользоваться услугами проктолога-самоучки.
-1
Пару мелких замечаний по коду.
1. класс AbstractVector и интерфейс Vector: во-первых, из объявления интерфейса неясно, какую фабрику векторов будут использовать методы без аргумента `factory`. Нужно выбрать либо вариант, когда фабрика передаётся в конструторе, либо в каждом методе. На мой взгляд, первый вариант лучше. во-вторых, почему одни методы могут выкидывать эксепшен, а другие нет — хотя имя у них одно (это касается интерфейса)?
2. интерфейс IOConstants: очень плохая практика использовать интерфейс в качестве хранения констант, а потом его имплементить. Основное предназначение интерфейса — описание методов объекта. Константы — это уже конкретика реализации и для них есть простые классы либо перечисления (enum). Тем более IOConstants не объявляет ни одного метода.
3. имплементации интерфейсов и относящиеся к ним классы лучше выносить в отдельный под-пекедж `impl`, если вы хотите отделить абстракцию от конкретики (и так удобней будет иметь один api и несколько реализайций)
4. Поля, которые не предполагается менять, лучше делать `final`. Например в LinearSystem поля a, b не переопределяются (пусть даже сами поля изменяемы (mutable), но ссылки на них постоянны) — их можно сделать final.
1. класс AbstractVector и интерфейс Vector: во-первых, из объявления интерфейса неясно, какую фабрику векторов будут использовать методы без аргумента `factory`. Нужно выбрать либо вариант, когда фабрика передаётся в конструторе, либо в каждом методе. На мой взгляд, первый вариант лучше. во-вторых, почему одни методы могут выкидывать эксепшен, а другие нет — хотя имя у них одно (это касается интерфейса)?
2. интерфейс IOConstants: очень плохая практика использовать интерфейс в качестве хранения констант, а потом его имплементить. Основное предназначение интерфейса — описание методов объекта. Константы — это уже конкретика реализации и для них есть простые классы либо перечисления (enum). Тем более IOConstants не объявляет ни одного метода.
3. имплементации интерфейсов и относящиеся к ним классы лучше выносить в отдельный под-пекедж `impl`, если вы хотите отделить абстракцию от конкретики (и так удобней будет иметь один api и несколько реализайций)
4. Поля, которые не предполагается менять, лучше делать `final`. Например в LinearSystem поля a, b не переопределяются (пусть даже сами поля изменяемы (mutable), но ссылки на них постоянны) — их можно сделать final.
+1
Спасибо за замечания!
1) Я думал над тем, чтобы передовать фабрику в конструкторе, но на мой взляд это лишняя операция. По умолчанию просто создается ассоциированная с типом вектора фабрика. Это была большая проблема: понять какой именно вектор нужно создавать например при сложении двух: плотный + разреженый = плотный, а плотный * разреженый = разреженый. Я решил использовать фабрики и сделать так чтобы пользователь мог просто умножать вектора не думая о том какой будет результат, для этого и нужна фабрика, которая инстанциируется по-умолчанию. Если пользователь знает что ему нужно — передает фабрику.
2) Идея взята из download.oracle.com/javase/1.4.2/docs/api/java/io/ObjectStreamConstants.html Я знаю что практика плохая, Effective Java читал. Просто хотел сделать что-то очень похожее на классы из java.io.
3) Хорошее замечание, но я не хотел сильно перегружать API. Все должно было быть просто. Хотя я тут согласен, практика хорошая.
4) Согласен.
1) Я думал над тем, чтобы передовать фабрику в конструкторе, но на мой взляд это лишняя операция. По умолчанию просто создается ассоциированная с типом вектора фабрика. Это была большая проблема: понять какой именно вектор нужно создавать например при сложении двух: плотный + разреженый = плотный, а плотный * разреженый = разреженый. Я решил использовать фабрики и сделать так чтобы пользователь мог просто умножать вектора не думая о том какой будет результат, для этого и нужна фабрика, которая инстанциируется по-умолчанию. Если пользователь знает что ему нужно — передает фабрику.
2) Идея взята из download.oracle.com/javase/1.4.2/docs/api/java/io/ObjectStreamConstants.html Я знаю что практика плохая, Effective Java читал. Просто хотел сделать что-то очень похожее на классы из java.io.
3) Хорошее замечание, но я не хотел сильно перегружать API. Все должно было быть просто. Хотя я тут согласен, практика хорошая.
4) Согласен.
0
Решил сообщить для неравнодушных. Версия la4j-0.3.0 доступна для загрузки.
Новый официальный сайт: la4j.org
Relase notes: la4j.blogspot.com/2012/12/la4j-030-is-out.html
la4j @ GitHub: github.com/vkostyukov/la4j
Новый официальный сайт: la4j.org
Relase notes: la4j.blogspot.com/2012/12/la4j-030-is-out.html
la4j @ GitHub: github.com/vkostyukov/la4j
0
Sign up to leave a comment.
Мой open source велосипед