LINUX.ORG.RU

java после C++

 , , ,


0

3

Любил си, нравится его философия. Знаю с++ на среднем уровне, более менее понимаю концепцию ООП. Но уже давно пишу под андроид на джава, и понимаю что я все дальше отдаляюсь от Си/C++ и перехожу к джаве. А я ведь даже ни одной книги о джаве не читал, пишу в неком сишном(или с++) стиле.

Так вот, какую книгу прочитать чтоб лучше программировать на джаве? Но у меня не только проблемы с недостатком знаний, мне ещё философия джавы не нравится(или не понятна). Вот например разные сеттеры геттеры, вроде философия этого ясна, проще дебажить(так говорится, почему так не понимаю). Все приходящие данные можно контролировать в сеттере, если изменилась какая-то логика то можно поменять что-то в геттере, а не везде в коде где получается это значение. Но как-то это «некрасиво» чтоль, настолько привычнее писать obj.something = something; чем obj.setSomething(something);

А этот дурацкий доступ к ArrayList через get? Ну куда это годится, выглядит отвратительно.

Богомерзкий 
balls.get(j).body.getPosition()
вместо православного 
balls[j].body.position 

Крче, просвятите меня, как жить и куда дальше двигаться. П.С. напоминаю что джавой я пользуюсь исключительно для android разработки(вообще говоря сейчас я пишу на libGDX оно и под десктопе запускается, в таком случае java я пользуюсь для геймдева).

★★★

А этот дурацкий доступ к ArrayList через get?

Простите, а какой способ вы предлагаете? Ничего на ум не приходит.

философия джавы

сеттеры геттеры

При чём тут джава? Это философия ООП, геттеры и сеттеры к языку никакого отношения не имеют.

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

Но это же не массив.

Аналог с++ вектора. И доступ к элементам по индексу там вроде тоже линейный.

abs ★★★
() автор топика
Ответ на: комментарий от vurdalak

При чём тут джава? Это философия ООП, геттеры и сеттеры к языку никакого отношения не имеют.

Я неособо много учил С++, в основном это только Qt, и я не видел там огромного количества сеттеров геттеров. В отличии от java

abs ★★★
() автор топика
Ответ на: комментарий от abs

Суть в том, что массив это массив, а коллекция (включая список) это объёкт. С объектами работают через методы и поля, а не каким-то особым синтаксисом, поэтому и доступ через методы.

vurdalak ★★★★★
()
Ответ на: комментарий от abs

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

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

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

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

abs ★★★
() автор топика
Ответ на: комментарий от abs

Да это не имеет отношения к философии именно джавы. Инкапсуляция это парадигма ООП в принципе, а не языка.

vurdalak ★★★★★
()

По геттерам-сеттерам. Проблема в неоднородности кода. В каких-то местах ты точно захочешь иметь геттеры-сеттеры. Если у тебя будет половина так, а половина по-другому, то это будет плохо читаться. Лучше пусть везде будут геттеры-сеттеры. Это нахаляву даёт возможность изменять их поведение в будущем и ставить быстрые брякпоинты на изменение данных (Ты можешь поставить брякпоинт на геттер, чтобы узнать, кто читает это поле или ты можешь поставить брякпоинт на сеттер, чтобы узнать, кто пишет в это поле. Есть возможность ставить брякпоинт прямо на доступ к полю, но он замедляет программу).

Суммируя — проблем с их генерацией нет и они дают незначительные удобства и более читаемый код.

Про List. Ты придираешься к мелочам. Я тебе советую почаще использовать встроенные массивы, если тебе не нужно изменение размера, там можно индексировать оператором. List как правило индексировать не нужно. Ну а если нужно, не такая это и проблема.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от abs

Qt, и я не видел там огромного количества сеттеров геттеров.

Вообще-то все property сделаны через setter/getter.

grondek
()

Но как-то это «некрасиво» чтоль, настолько привычнее писать obj.something = something; чем obj.setSomething(something);

Очень плохо. Ты ООП не умеешь. Зачастую очень здравая идея - сделать something приватным и написать публичные методы setSomething и getSomething. Иначе, сколько раз видел, как товарищи напишут где-то в коде на C++ что-то типа такого:

cass someClass
{
    public: int Something;
...
};
...
int main ()
{
    ...
    if(objSomeClass.Something=5)
    {
        ...
    }
    else
    {
        ...
    }
}
А потом программа работает неправильно, т.к. условие в if выполнится всегда и objSomeClass.Something изменится. А самое страшное, что такой код практически не падает и отловить такую ошибку в большой программе не всегда легко.

peregrine ★★★★★
()
Ответ на: комментарий от abs

Родители очень хотят чтоб я учился.

Зря, толку тебя учить мало, ты не хочешь.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Иначе, сколько раз видел, как товарищи напишут где-то в коде на C++ что-то типа такого

Сколько раз видел?

Stil ★★★★★
()
Ответ на: комментарий от peregrine

А потом программа работает неправильно, т.к. условие в if выполнится всегда и objSomeClass.Something изменится. А самое страшное, что такой код практически не падает и отловить такую ошибку в большой программе не всегда легко.

А если запустить поиск одинарных равно внутри if-ов

abs ★★★
() автор топика
Ответ на: комментарий от abs

гм, вообще для сей есть статические анализаторы кода (и для явы кстати тоже, рекомендую ознакомиться, напр findbugs)

Deleted
()
balls.get(j).body.getPosition()

в шестой джаве можно полуправославно:

balls[j].body.getPosition()

а в каком-нибудь груви, наверное, можно православно

и вообще, в том же Qt все делается так же как в джаве, через get(index) и getWhatever()

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от Deleted

В данном случае даже варнингов компилятора хватит... Лучше скажи, ты веришь что такой говнокод можно (не специально) видеть 5 раз в месяц? ;)

ИМХО, кто-то включил эрзента

Stil ★★★★★
()
Ответ на: комментарий от abs

А это ещё понять надо, что ошибка именно в if-ах, а не где-то ещё.

peregrine ★★★★★
()
Ответ на: комментарий от Stil

Лучше скажи, ты веришь что такой говнокод можно (не специально) видеть 5 раз в месяц? ;)

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

Deleted
()

Так вот, какую книгу прочитать чтоб лучше программировать на джаве?

Я изучал по книге от авторов языка.

Арнольд Кен, Джеймс Гослинг. Язык программирования Java.

Еще пара хороших учебников.

Брюс Эккель. Философия Java

Кей Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала. Том 2.

Это для совсем новичков, для более опытного разработчика подойдет:

Джошуа Блох. Java. Эффективное программирование.

JavaEE лучше изучать начиная с сервлетов, потом Hibernate, Spring и другие технологии. Лучшая книга по сервлетам:

Брюс Перри. Java сервлеты и JSP. Сборник рецептов.

Но у меня не только проблемы с недостатком знаний, мне ещё философия джавы не нравится(или не понятна).

Собственно философия такая же, как у C++, набор костылей. Изначально (до 5-й версии) язык был ближе к Паскалю, такой же разумный минимализм. Но получался слишком громозкий код и сотни XML файлов, все это было тяжело поддерживать, поэтому решили внести изменения, сохранив обратную совместимость. В результате имеем то, что имеем.

Но как-то это «некрасиво» чтоль, настолько привычнее писать obj.something = something; чем obj.setSomething(something);

Посмотри C#, там есть свойства. И вообще язык спроектирован более грамотно, т.к. создавался с учетом костылей Java. Мне очень нравится этот язык, но не нравится проприетарность платформы .NET. Полностью свободная реализация .NET Framework (включая WPF и WCF) однозначно зарулила бы жабу.

Den_Zurin
()
Ответ на: комментарий от Den_Zurin

Это очень старая статья. Для libgdx достаточно подключить в gradle runtime-библиотеку скалы и gradle-плагин и все само будет работать без всяких лишних настроек.

backburner
()
Ответ на: комментарий от Deleted

Ъ перегрузка операторов, отстрел обоих ног одной пулей со смещенным центром.

Давно читал про перегрузку операторов в java. Ссылку не помню. Но смысл был таков, авторы языка испугались, что открыв такую возможность, они получат беспорядочные половые отношения (БПО), поэтому подстраховались. Но со временем, им стало понятно, что любая новая возможность начинается с БПО, а потом приходит культура ПО. Так что ничего в перегрузке такого страшного нет.

barberry ★★
()
Ответ на: комментарий от abs

Без относительно к андроид, на groovy код:

Vector2 jv = balls.get(j).body.getPosition();[br]
Vector2 iv = balls.get(i).body.getPosition();[br]

Будет выглядеть примерно так:

def jv = balls[j].body.position
def jv = balls[i].body.position
barberry ★★
()
Ответ на: комментарий от Stil

В данном случае даже варнингов компилятора хватит...

Откуда компилятор знает, что это было написано не намеренно?

anonymous
()

Core Java двухтомник отличная книга по самому языку и его бибилотеке.

Effective Java - хорошая книга по best practices и философии языка.

afiskon
()
Ответ на: комментарий от anonymous

зато он знает что-то вроде «will always evaluate as 'true'»

anonymous
()

настолько привычнее писать obj.something = something; чем obj.setSomething(something);

Ты и в С++ слабоват, если не понимаешь, почему сеттер лучше.

Богомерзкий
balls.get(j).body.getPosition()
вместо православного
balls[j].body.position

Так ведь им переопределение операторов не завезли.

В жаве есть куча мест, которые заставляют страдать (отсутствие нормальных деструкторов, поголовное забивание на WeakReference и прочее говно), но ты описал как раз более-менее приемлемые отличия.

g0t0
()
Ответ на: комментарий от abs

в основном это только Qt
я не видел там огромного количества сеттеров геттеров

Ловите лжеца!

g0t0
()
Ответ на: комментарий от peregrine

if(objSomeClass.Something=5)

Если такие ошибки делать, то даже геттеры с сеттерами не помогут. А не делать их помогают ворнинги конпелятора. Только для этого их надо читать.

g0t0
()
Ответ на: комментарий от vurdalak

геттеры и сеттеры к языку никакого отношения не имеют.

имеют. в шарпе есть встроенные геттеры-сеттеры, в С++ часто эта концепция заменима перегрузкой операторов.

next_time ★★★★★
()
Ответ на: комментарий от vurdalak

С объектами работают через методы и поля, а не каким-то особым синтаксисом

а с чего бы [] == особый синтаксис? обычный перегружаемый оператор.

next_time ★★★★★
()
Ответ на: комментарий от next_time

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

vurdalak ★★★★★
()
Ответ на: комментарий от next_time

Но я не вижу тут никакого неудобства. Не пофиг ли, какими буковками обращаться к объекту? Тем более что IDE автодополняет.

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

отличается тем, что исходный код после этого не выглядит вырвиглазным и нет необходимости каждый раз писать нечитабельные простыни из obj1.setX(obj2.getY() + obj3.getZ()) вместо obj1.X = obj2.Y + obj3.Z, да ещё и расписывая функции getSmth и setSmth на каждый чих, надо оно или нет

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.