{{notification.text}}

MirGames

egslava Вячеслав

Брянск, Москва
Зарегистрирован 09.08.10 20:36
Последний раз был в сети 23 дня назад
400 
Как Dan докатился до жизни такой?
04.02.17 00:34

Хе-хе :-) Тоже летел к "корешу из Aviasales" (одногруппник) с ещё двумя одногруппниками. Но, в итоге, так получилось, что мы теперь в Chon Buri, другой не долетел, а третий то на Пхукет, то на Самуи, то в Бангкок, то ещё куда-то. В общем, такие дела, что сидим тут одни, никто вокруг английский не понимает :-/

Если кто-то сейчас в Тае - пишите :-D Хоть буду знать, что тут есть где-то в радиусе 1500км :-D

Dan
Кстати, ты ещё в Тае? Просто интересно, неужели тут интереснее, чем в Ау/Нз? Я здесь для дешёвой жизни и огорождения от русского на момент обучения английскому. А так: в РФ же больше возможностей: универы, работы, различные конференции и проч-проч. Чем ты тут занимаешься?

Как я программирую в последнее время (kotlin vs "быдлокод")
12.09.16 18:09

В общем, т.к. рубить сгоряча не хочется, пока для себя решил так:
1. Свойства (properties) использовать тогда, когда есть какая-то сущность, которую можно положить/изъять и никогда иначе. read-only свойства так же можно использовать для любых существительных.
2. data-classes использовать всегда, но всегда быть готовым писать код вручную. Т.е. data class'ы, в основном, при создании приложения. При дальнейшем его развитии быть морально готовым к тому, что код скатывается в Java-подобный.
3. Всегда указывать тип для свойств/функций, но не указывать для локальных переменных. Потому что локальные переменные определяют алгоритм, и там чёткое указание типа вряд ли нужно. А когда открываешь код класса, хочется взглянуть - что же в нём есть.

Это по мелочи.

Мда.

Раскрой, пожалуйста. Очень интересно твоё мнение :-)

Как я программирую в последнее время (kotlin vs "быдлокод")
10.09.16 22:06

Всем привет! :-) Я тут неплохо отравился и, вместо того, чтобы чувствовать боль, наоборот, чувствую себя свежо и сплю по 4-5 часов :-) Очень странно. Но куда более странно восприятие мною стилей программирования в последнее время.

Kotlin

Когда вышел такой замечательный язык, как Kotlin, мне показалось, что он ну очень хорош - там есть extension-функции и лямбды, алгоритмы на коллекциях (fold, map, flatMap, filter, и прочее). В общем, очень удобно. Есть такая штука, как Data classes. Вот пример:
Kotlin data class Point(x: float = 0, y: float = 0);Kotlin

inline-функции. Ну и прочее-прочее.

Быдлокод

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

Причины, по которым я выбираю "Быдлокод"

Их много, но, например:
1. type inference имеет один минус: я не вижу типа. Банально, конечно, но, оказывается, если хочется обойти дерево файлов, то возвращается Sequence, а не List (что логично). Не помню подробностей недавней утилиты, но так оно дальше и покатилось - Sequence через Sequence ("ленивая структура данных"). В итоге, я вылетел из памяти по непонятным, на первый взгляд, причинам. Меня вообще не напрягают явные типы в Java. Да-да. Мне всё равно на эти большие конструкции - в 99% случаев я их просто пропускаю, не отдавая им внимания. А если там написано что-то неверное, то могу и заметить. Я не пишу эти конструкции, не трачу на них время. Я просто жму cmd + alt + v и всё! =) Всё пишется само. Избытычность не мешает, даже помогает.
2. Когда я программирую на супер-пупер высокоуровнем языке (Kotlin) он должен работать идеально. Он, чуть ли, не сам программы писать должен. Потому что, если есть какая-то высокоуровневая конструкция, которая работает неидеально, то я даже не могу её сразу увидеть и должен проходиться отладчиком.
3. смотрю на Kotlin - в нём не хватает фич. Смотрю на Scala - не хватает скорости компилятора. В итоге, имхо, лучше уж писать на Java, чем иметь ни то, ни сё. Взять те же data-classes. Что будет, если я захочу исключить какое-то поле из toString? Пример простой: у меня есть дерево, у его узла есть parent и children[]. Что-то я, да захочу исключить - иначе вывод строки зайдёт в рекурсию. Ок, что мне предлагают сделать? Правильно, переписать toString() самому. И, вот, data-классы уже не такие уж и красивые.
4. Надо слишком много думать. Да, я, наверное, не очень быстро думаю. Особенно, когда речь заходит о выборе, который почти ничего не значит и его надо просто сделать случайным образом.

Вопросы, которые не нужны и которые мешают

Позволю себе раскрыть это чуть подробнее. Есть список вопросов, которые меня заставляют просто зависнуть на несколько секунд:
1. Надо ли стирать это бельё? Если я выбил много кофе, то я становлюсь дерзким и сразу спрашиваю "зачем"? Мне говорят, про какое-то пятно и я тогда говорю, что да, стирать надо. Но, чаще всего, всё происходит не так: я думаю, хм, а надо ли? Или не надо? Надо? Вроде, норм. *Тут я перехожу в овощное состояние и могу задуматься и о чём-либо ещё". Короче говоря, оба варианта мне - безразличны, а зависаю я над ними надолго
2. Будешь чай? (Именно тогда, когда я его не сам хочу, а мне его предлагает кто-то). Я начинаю думать, ломаться, что-то там прокручивать в голове. Не слишком ли ещё поздно для кофеина, не буду ли я хотеть потом есть. А какого размера кружка - мне же потом в дорогу. И т.д.

Совсем другое дело, если бы меня спросили - давай я тебе сегодня долг верну? Ответ на этот вопрос возникает сам собой. Нет трудностей с ответом.

Что я вижу плохого в Kotlin'е

К сожалению, красивые языки вроде Kotlin'а порождают много стилистических вопросов. Не неся никакой практической нагрузки (вопрос только стиля), он порождает много неуверенности.

  1. Надо ли писать метод глобально или написать метод в companion object'е?
  2. Надо ли писать data class, или лучше на Java, т.к. стабильно?
  3. "Как бы сделать покрасивше?"
  4. Как бы это сделать на билдерах, чтобы переменную, которая часто встречается, вообще не надо было нигде указывать.
  5. Как extension-методе сохранить произвольную информацию об объекте? (оказалось, что никак)
  6. Стоит ли писать

fun getVelocity() = (x - lastX)/time

или лучше написать

  fun velocity(): float { 
     return (x - lastX) / time 
  }

или лучше вообще

  val velocity: float get() {
      return (x - lastX) / time
  }

И возникают ещё дополнительные проблемы:

  • Почему ORM опять упал? Нужно сделать @JvmField? @JvmStatic? Ещё как-то?
  • А почему десериализатор тогда не упал?
  • А почему резко улетела память непонятно куда?
  • Приложение стало собираться медленно из-за Kotlin/APT/ещё какого-либо фреймворка или из-за моих кривых рук?

И т.д. пишу я это всё, скорее для себя, т.к. попробую продолжать писать на Kotlin'е, но учитывая предыдущие ошибки.

Наша первая игрушка - хочется советов и фидбэк :)
12.01.16 11:28

Я играл на Андроиде. Скучно, однообразно, темно, непонятно. Непонятно, почему, если у меня есть монетки, я не могу ничего купить. Непонятно - другие уровни будут или нет? Музыка тоже приедается быстро. Реклама в огроменных количествах. Даже не знаю, что сказать. Вы либо просто троллируете, либо у нас ну уж очень разные вкусы.

g2mp
09.01.16 16:04

Блин, ну очень круто :-) Смотрю на тебя с Мефом и просто обалдеваю: один такой классный портал забабахал один, другой такой движок и редактор сделал один. И это всё без анонсов, без сбора денег или команды, без понтов (навроде, мы используем RoR/Go/Scala, поэтому сделан такой-то проект в такие-то сроки и мы ищем спонсора). Всё просто работает. С одной стороны всё очень скромно, с другой стороны - нереально круто :-)

Спасибо, Dan! Не знаю, чем могу помочь, но, мне кажется, что если я расскажу друзьям - уже будет хоть что-то :-) У проекта есть страничка, на которую можно было бы кинуть ссылку?

В гугле нашёл только репу на github'е, поэтому пока бросаю ссылку на эту страницу и на видео.

g2mp
26.12.15 13:10

Очень-очень здорово выглядит! :-) Особенно радует, что есть быстрый запуск и "просмотр" игры. Т.к. я пишу под Андроид, я уже и забыл, что такое быстрая сборка. Ну, очень классно, в самом деле. Быстро, удобно, хорошо. Почитал - вроде, есть даже поддержка Android, что тоже круто :-) Поражаюсь тебе Dan, как же тебе, всё-таки, удаётся писать такие здоровские вещи? Какие качества нужны человеку, чтобы делать также хорошо? :-/

Вызов методов суперкласса в методах его подкласса
13.02.14 20:44

http://docs.python.org/3.1/reference/grammar.html (краткий пересказ книг Лутца о пайтоне в 100 с небольшим строчках)

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

Вызов методов суперкласса в методах его подкласса
13.02.14 00:07

И да, если есть какой-нибудь класс сокет, который может передавать только поток байт, то вспомогательные классы ТекстовыйСокет (который может передавать текст) и ШифрованныйСокет (который может передавать шифрованные данные), я реализую не с помощью наследования, а просто как отдельные классы внутри пакета "сокеты", которые используют приватную переменную типа Сокет.

Мне кажется, что подобный код намного проще для восприятия. Как минимум потому, что когда где-то используется наследование, то при вызове метода подключисьКТойСтороне(), я не знаю, используется метод Сокета или метод ШифрованногоСокета и устанавливается шифрованное соединение. Т.е. я должен каждый раз мысленно чекать это. В общем, не нравится мне подобный код.

Вызов методов суперкласса в методах его подкласса
13.02.14 00:04

А можно подробнее, почему так?

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

Яблоко наследуется от фрукта, потому что яблоко - это фрукт. Фрукт наследуется от объекта, потому что фрукт - это объект. Ну и т.д. Речь идёт о существительных: т.е. объект, фрукт, яблоко.

Если речь идёт о прилагательных, то я их делаю интерфейсами: вкусный, цветной, и т.д. Сами же значения прилагательных (т.е., по сути, перечисления: очень вкусный/вкусный и т.п., красный/синий/зелёный) я делаю как свойства в интерфейсе.

Т.е. интерфейс вкусный будет иметь свойство цвет, которое может возвращать красный/синий/зелёный и т.п.

Итак, итоговый пример:
Класс фрукт наследуется от класса объект. Он реализует интерфейсы Вкусный и Цветной. Класс Яблоко наследуется от Фрукта и реализует интерфейс СКосточками.

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

WIP: MirGames
12.02.14 18:47

Мне кажется, что если я пишу пост, то чужие сообщения не подгружаются. У меня было как:

  1. Я пишу пост.
  2. Зачем-то на открыл ту же тему на другой вкладке
  3. Оказывается, что на другой вкладке уже есть новые сообщения
  4. На прошлой вкладке отправляю своё сообщение
  5. Моё сообщение добавляется, но чужое новое сообщение "не пришло".
Вызов методов суперкласса в методах его подкласса
12.02.14 18:35

[offtop]

не использовать наследование без явной на то необходимости #

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

[/offtop]

Вызов методов суперкласса в методах его подкласса
12.02.14 18:14

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

Не уверен, но, кажется, конструктор, также, можно вызвать только один раз.

Т.е. не сможешь сделать так:

class LittleC(SuperC):
    def __init__(self, x, y, z):
         self.z = z
         SuperC.__init__(self, x, y) #Вот он вызов

А вот в других методах можно вызвать всё в произвольном порядке и многократно. Как хочешь.

WIP: MirGames
13.01.14 02:38

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

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

Но это, как я понимаю, задача довольно нестандартная, поэтому это просто пожелание на супердалёкое будущее :-) Так-то всё устраивает :-)

WIP: MirGames
13.01.14 02:26

old-school пагинация :-) хз почему, но она меня бесит. Понимаю, что она крута тем, что если в обсуждении 100 страниц, то можно перейти на последнюю, не читая остальные 99 страниц.

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

WIP: MirGames
07.01.14 19:33

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