Послевкусие от Kotlin, часть 2

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

  • f7989ca6ffa43e652953051611d71b4b_small.j

    03.09.17 в 20:43

    0

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


    data class IntervalInfo(amount: Long, type: ChronoUnit)
    operator fun Date.minus(interval: IntervalInfo):Date{…}
    operator fun Date.plus(interval: IntervalInfo):Date{…}
    val Int.months = IntervalInfo(this, ChronoUnit.MONTHS)
    val Int.days = IntervalInfo(this, ChronoUnit.DAYS)

    и использовать как-то вроде


    val before = date - 3.days
    val after = date + 2.months

    Ну, а если вы не на 8й джаве пока — тогда можно свой аналогийчный энам изобрести.

    • 855fc7ba7f8693d14666566d5f4404d6_small.j

      03.09.17 в 23:36

      0

      Мне не очень понравилась мысль перегружать примитивы. Это хорошо для DSL, но в продакшен коде будет приводить к проблемам, так как на days и months не остановишься, и скоро у простого Int будет api не меньше чем у list
      • f7989ca6ffa43e652953051611d71b4b_small.j

        04.09.17 в 00:13

        0

        Ну они не сами же вам в код попадают. Где надо — там заимпортировали, где не надо — не импортируете. То есть в том месте где у вас будет работа с датами — там и будете красивый код писать.
        • 855fc7ba7f8693d14666566d5f4404d6_small.j

          04.09.17 в 00:29

          0

          Да, только IDE будет подсказывать все. Проверил
          • f7989ca6ffa43e652953051611d71b4b_small.j

            04.09.17 в 00:32

            +1

            Мне кажется что если оно к месту — то почему бы не писать красиво там где можно писать красиво?
            • 855fc7ba7f8693d14666566d5f4404d6_small.j

              04.09.17 в 00:41

              +1

              Может, это чопорно, но по мне Int не должен знать о ChronoUnit, Date и прочем. Написав такой extension, мы расширяем api Int такими знаниями.
              Вариант ниже решает эту проблему: DAYS знает о Int, но не наоборот.
            • 04.09.17 в 02:17

              0

              Красиво — это не пихать мульйон методов в один тип. Любой нубас может наговнокодить божественных и несолидных объектов, когда это красивым стало?

      • f7989ca6ffa43e652953051611d71b4b_small.j

        04.09.17 в 00:16

        +1

        Но в общем можно и не использовать свой data-класс, а писать как-то вроде


        val before = date - Pair(3, DAYS)
        • 855fc7ba7f8693d14666566d5f4404d6_small.j

          04.09.17 в 00:33

          0

          Тогда возвращаясь к локаничности, но без перегрузки примитивов. Я, навреное, на это перепишу свой код
          val before = date - DAYS*3
          
  • 03.09.17 в 21:30

    0

    а чем отличаются
    val list1: List?
    и
    var list9: List?
    • 855fc7ba7f8693d14666566d5f4404d6_small.j

      03.09.17 в 23:38

      0

      Тем, что первый нельзя заменять после инициализации. В случае с локальной переменной var нужен не часто, а вот в случае поля — вполне.

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

© Habrahabr.ru