Как стать автором
Обновить

Комментарии 30

Спасибо. Отличная статья и отличная библиотека. Добавлю в закладки.
Спасибо :)
Рефлекс как у собаки Павлова — хорошо сказано. Который год думаю «выйду в отпуск, появится время, допишу свой проект». И вот наступает долгожданный, какой там проект — отдыхать!
Отличная история, спасибо.
Однако это замечание

> Кроме того, любая критика без ссылки на собственный open source проект восприниматься не будет

весьма подпортило впечатление. Критика, сопровождаемая аргументами и обоснованиями, очень ценна, и не важно, от кого она исходит. Лучше получить к ней в нагрузку необоснованные нападки и проигнорировать их, чем не получить ничего.
Может быть зря перестраховался от агресивно-настроенной публики Хабра. Может быть вы и правы, сейчас уберу.
И сразу вопрос:
зачем класс объявляется аж так: public class Complex extends Object?
extends Object явно лишнее и не способствует быстрому чтению и пониманию
Этот класс — открытый проект, я просто его включил в 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
*/
имя автора мне ничего не сказало, так как Вашего не знаю :) может это и Вы :) вот ссылка на проект было бы хорошо…
Ссылки никакой нет, этот человек просто где-то выложил свой клласс. Я даже не помню где его скачал. Гдето в google «java complex class».
посмотрел глубже — видимо один такой попался и я сразу на него наткнулся :)
а вообще код чистый, С КОММЕНТАРИЯМИ! :)
Кстати сначала писал их, потом даже специально стал вырезать. Не нужны они. Нужна документация, в данном случе javadoc с сылками к теории, например в википедию.

А любой коментарий устаревает сразу после того, как вы напишите "//".
лучше код с документацией, чем такой же но без оной. Особенно когда видишь что-то типа:

public void updatePrios(final MultiMap<Pair<Lang,String>,Triple<Source,Integer,Boolean>> newPrios, final int type) {

:)
Ну что нужна документация я написал.

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

У вас хорошая обстановка на кафедре по сравнению с моей, даже несмотря на
«непопулярные в университетских кругах языки (читай не С# и C++) и среды разработки (читай не VS2008)».
У нас не давали практически ничего из того, что нужно давать. Шаблоны проектирования? Ну что вы… Их даже не упоминали. Функциональное программирование? Только в виде галочки в учебном плане… Приходилось многое, очень многое изучать самому, а многие преподаватели даже тематику подсказать не могли, — некомпетентность была и остается удручающая.

P.S. У меня тоже есть свой open-source проект. ;)
Я бы сказал, в моем вузе отличная обстановка на кафедре, отличные преподаватели, умные ребята. Из-за объемов материала правда учиться невсегда приятно, но это мелочи.

А по поводу изучать самому — уж извольте. Вы высшее образование получаете, вас никто ничему не обязан учить. Ест даже фразеологизм «Научить — невозможно, можно только научиться.» Вас этому и учат на самом деле, учать не матану, вычмату и компиляторам, а учат — учиться и в сжатые сроки, в новой среде предоставлять результат. Инженерия чо уж там :)
> А по поводу изучать самому — уж извольте. Вы высшее образование получаете, вас никто ничему не обязан учить.

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

А так, безотностиельно себя, — да со всем согласен.
Никого не хотел обидеть и из комментария подумал что вы — студент. Прошу прощения если что.
Никаких обид, что вы. :)

Так какие еще языки вы использовали в своей учебной деятельности? Java? Может, еще что-нибудь?
Университетская программа мягко говоря заточена на С++ (даже тот что managed C++/CLI) и С# и конечно все это добро должно было писаться в VS2005 а потом и 2008 + Лисп и Пролог как части курсов по ФП. Все остальное — на усмотрение студента.

У меня это было, что-то вроде Java, Python + PyQT + numpy, Perl, совсем чуть-чуть PHP. Были эксперименты писать на GTK/QT (на Linux) ну и конечно Mono :)
Список достоин уважения. Сейчас не все мои бывшие сокурсники-то готовы изучать что-то помимо стандартных C#/С++, что уж говорить о студентах… Кстати, не знаю, что вы имеете в виду под «заточкой на С++», — сейчас я жалею, что ФП у нас толком не было, потому что для многих своих университетских программ я бы выбрал Haskell. Впрочем, и на «плюсах» неплохо все получалось, но считаю, что изучать новые языки, средства и технологии, надо. Раз в год осваивать новый язык, — очень хорошо, но можно и раз в полгода, не повредит. С другой стороны, кроме языков программирования есть еще огромный пласт знаний, — та же автоматизация (сборка, системы контроля версий), те же шаблоны проектирования, то же ФП…

> Раз в год осваивать новый язык, — очень хорошо, но можно и раз в полгода, не повредит.

В одной чудесной книге — «Программист-прагматик» именно так и написано. Еще написано, что нужно одну книгу (техническую) хотябы раз в три месяца чиать. Тогда портфель знаний будет на уровне :)

А заточка на С++ — это просто когда тебе читают курс ООП и фиктивный (управляемый) указательна С++/СLI называют «крышечкой» без объяснения что это и зачем. Был у нас грешок на кафедре. Преподаватель ООП, до сих пор обидно, что такой отличный курс, так погано было преподнесен.
С ООП не только у вас плохо, у нас тоже было, стыдно сказать, изучение Delphi / Builder'a со словами «а вот это — класс». Хотя это далеко не ООП, — это самые-самые начала ООП. В общем, этого курса тоже, можно сказать, не было.

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

Сейчас я преподаю не на своей кафедре (ИВТ), но на родственной к ней (ПИМ). Если все сложится хорошо, на следующий год попробую забрать себе функциональное программирование у своего бывшего преподавателя. К сожалению, все его предметы были «спустя рукава», — потому что он хоть и профессор, а выпить горазд. В итоге его держат ради его звания, — есть негласные показатели, когда на кафедрах должно быть столько-то кандидатов, столько-то докторов. И с каждым годом эти цифры выдерживать труднее, потому что аспирантов очень мало, докторантов еще меньше. В этой статье написано правильно: чувствуется разрыв поколений.
Вы высшее образование получаете, вас никто ничему не обязан учить.
Тогда следует переименовать его в «высшее самообразование», чтобы не смущать людей. И, конечно, ни дай бог вам когда-нибудь воспользоваться услугами проктолога-самоучки.
Пару мелких замечаний по коду.

1. класс AbstractVector и интерфейс Vector: во-первых, из объявления интерфейса неясно, какую фабрику векторов будут использовать методы без аргумента `factory`. Нужно выбрать либо вариант, когда фабрика передаётся в конструторе, либо в каждом методе. На мой взгляд, первый вариант лучше. во-вторых, почему одни методы могут выкидывать эксепшен, а другие нет — хотя имя у них одно (это касается интерфейса)?

2. интерфейс IOConstants: очень плохая практика использовать интерфейс в качестве хранения констант, а потом его имплементить. Основное предназначение интерфейса — описание методов объекта. Константы — это уже конкретика реализации и для них есть простые классы либо перечисления (enum). Тем более IOConstants не объявляет ни одного метода.

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

4. Поля, которые не предполагается менять, лучше делать `final`. Например в LinearSystem поля a, b не переопределяются (пусть даже сами поля изменяемы (mutable), но ссылки на них постоянны) — их можно сделать final.

Спасибо за замечания!

1) Я думал над тем, чтобы передовать фабрику в конструкторе, но на мой взляд это лишняя операция. По умолчанию просто создается ассоциированная с типом вектора фабрика. Это была большая проблема: понять какой именно вектор нужно создавать например при сложении двух: плотный + разреженый = плотный, а плотный * разреженый = разреженый. Я решил использовать фабрики и сделать так чтобы пользователь мог просто умножать вектора не думая о том какой будет результат, для этого и нужна фабрика, которая инстанциируется по-умолчанию. Если пользователь знает что ему нужно — передает фабрику.

2) Идея взята из download.oracle.com/javase/1.4.2/docs/api/java/io/ObjectStreamConstants.html Я знаю что практика плохая, Effective Java читал. Просто хотел сделать что-то очень похожее на классы из java.io.

3) Хорошее замечание, но я не хотел сильно перегружать API. Все должно было быть просто. Хотя я тут согласен, практика хорошая.

4) Согласен.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.