Small scopes and SRP rocks, isn’t it?

We discussing recent post by “OOP” lover Yegor Bugayenko.

My thoughts that it’s not about FP or OOP, objects or functions, it’s all about SRP. Like we have two initialization blocks in one method, and then we test results of these blocks. We can move this blocks in lambdas/function/classes, but in general it’s just two functions that produces a and b and then we compare a and b. After working with Kotlin I’ll write this test like:

@Test
void testIntStream() {
    final long seed = System.currentTimeMillis();

    assertEquals(
        run(() -> {
            final Random r1 = new Random(seed);
            final int[] a = new int[SIZE];
            for (int i = 0; i < SIZE; i++) {
                a[i] = r1.nextInt();
            }
            return a;
        }),
        run(() -> {
            final Random r2 = new Random(seed);
            return r2.ints().limit(SIZE).toArray();
        })
    );
}

Just like in Yegor’s solution my test have only one statement: assertEquals.
My approach much more clean, and for every new test I don’t write any boilerplate to the glory of “OOP” God.

Just like Yegor’s solution, my approach have same benefits over original test:

  • Reusability — I can easy extract lambda from test, and reuse between number of test.
  • Brevity — It’s much less code with in place lambdas.
  • Readability
  • Immutability

In post Yegor’s approach seems good, but it doesn’t scale to real applications.

run function for the reference:

public static <R> R run(Producer<R> producer) {
    return producer.produce();
}

Kotlin version

So also I’d like to add Kotlin example for this test, it’s much more readable even than Java version with lambdas (no surprise here)

@Test fun testIntStream() {
        val seed = System.currentTimeMillis()

        assertArrayEquals(
            expected = {
                val r1 = Random(seed)
                IntArray(SIZE).also { array ->
                    for (i in 0..SIZE - 1) {
                        array[i] = r1.nextInt()
                    }
                }
            },
            actual = {
                val r2 = Random(seed)
                r2.ints().limit(SIZE.toLong()).toArray()
            }
        )
    }

I am using JUnit 5 for this test, and was expecting that JUnit 5 has methods that accepts lambdas for assert, but unfortunately – there are no such signature. So I added it:

fun assertArrayEquals(expected: () -> IntArray, actual: () -> IntArray) {
    Assertions.assertArrayEquals(expected.invoke(), actual.invoke())
}

I think will be nice to have support library for JUnit 5 with such methods.

Mockito 2.1

Наконец-то дошли руки посмотреть на Mockito 2.

Из того что мне показалось интересным:

  • CGLIB заменили ByteBuddy
  • Частичная поддержка Java 8
  • MockitoExtension для Junit 5 (3rd party)
  • final class теперь можно мокать (опционально и вообще не делайте так)

Итого хотя я долго не подходил к новому мокито, оказалось что это практически “проходной релиз”, и теперь я буду пытаться апгредиться на проектах где использую мокито.

testCompile("org.mockito:mockito-core:2.7.22")

История про программиста

@shipilev: @qwwdfsad Там давно уже не LCG, а Marsaglia xor-shift, но сути комментария это не меняет
@qwwdfsad: о, он теперь по дефолту включен?
@shipilev: да
@shipilev: Trivia: я его случайно переключил, когда пушил @Contended в восьмёрку, но обнаружилось это только когда восьмёрка уже вышла во все поля
@shipilev: https://bugs.openjdk.java.net/browse/JDK-8006176
@shipilev: Не, ну я проверил, что распределения не удолбищные. Оно даже многие DieHard проходило. Из спектральных тестов невооружённым глазом видно, что лучше: http://cr.openjdk.java.net/~shade/8006176/randomicity/
@shipilev: Потому что это был экспериментальный однострочный фикс, на котором я перф тестировал. Он просто так утёк в коммит другой фичи, гыгы.
@gurinderu: @shipilev и никто не заметил?)
@shipilev: Судя по всему, нет. Потому что мне самому кто-то в твитторе года два спустя сказал, что “да вон парни из Оракла переключили hashcode=5, и всё стало шоколадно”. И тут я посмотрел в историю и понял…
@gurinderu: понял почему Шипилёва выгнали из Оракла
@shipilev: Но-но! Я косячнул один раз и это всё равно улучшило перформанс. Beat that, suckers.

The Brave One

JavaScript creator and Mozilla co-founder Brendan Eich just released version 0.11.6 of Brave browser.

It’s amazing how easy it’s today to make the browser: just take Node.js, Electron and a small team… Boom, you have a modern browser with the latest web technologies.

Brave has good privacy defaults: https everywhere, tracking protection and ad blocking. Also, you can block scripts in few clicks, it’s really funny since Brendan is JavaScript creator. For sure I’ll keep this browser and maybe will use it from time to time.

Hope Firefox will apply this defaults too.

Master Foo Discourses on the Graphical User Interface

Как-то раз Мастер Фу и Ньюби посетили встречу программистов, собравшихся для обмена знаниями. Один из программистов поинтересовался у Ньюби, к какой школе принадлежат он и его учитель. Услышав, что они последователи Великого Пути Unix, тот презрительно усмехнулся.

— Инструменты командной строки Unix грубые и отсталые, — бросил он, — современные правильно спроектированные операционные системы делают всё через графический интерфейс!

Мастер Фу промолчал, но ткнул пальцем на луну. Собака неподалёку залаяла на руку Мастера.

— Я не понимаю вас! — сказал программист.

Мастер Фу, по-прежнему храня молчание, ткнул на изображение Будды. Затем на окно.

— Что вы пытаетесь сказать? — вопрошал программист.

Мастер Фу ткнул на голову программиста. Затем на камень.

— Почему вы не можете сказать ясно? — потребовал ответа программист.

Мастер Фу задумчиво нахмурился, затем дважды щёлкнул программиста по носу и бросил его в ближайшую мусорную корзину.

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

В этот момент программист достиг просветления.

Полный перевод Unix-коанов на русский язык

Backendsecret

Backendsecret – это “Коллективный твиттер-аккаунт для бэкенд-разработчиков с новым автором каждую неделю”. И мне посчастливилось побыть одним из авторов. Интересный опыт, хоть я и не был очень активным, но зато как мне кажется удачно осветил тему Котлина и возможно об этом замечательном языке узнало еще пару человек 🙂

А вот и статистика 🙂