Отлично же :) Тогда давайте я попробую применить ваши критерии.
Первый вариант я написал за 5 минут. Чтобы написать пятый вариант, понадобилось 10 минут.
Цифры условные, никаких замеров я не делал, но по ощущениям на пятый вариант потрачено в два раза больше времени.
Технически, я сначала написал вариант 1, а потом потратил еще столько же времени, чтобы его улучшить и, в итоге, получился вариант 5.
Сколько времени уйдет на внесение изменений в будущем не понятно. Ведь мы не знаем какого рода это будут изменения и кто их будет вносить.
В силу простоты задачи какой-то явно заметной отладки не получилось.
На решение написано 5 тестов:
3 теста на случай когда не передали какой-то из параметров
1 тест когда пользователь не имеет доступа и получает отлуп
1 тест когда все хорошо и доступ есть
Оба варианта успешно проходят все тесты.
Как понять какой вариант лучше? Первый, потому что потребовал меньше времени?
Кстати, если я не знаю сколько времени потрачено на написание кода, например, смотрю на код опенсорсной библиотеки, то получается в рамках этой схемы качество оценить нельзя?
До вашего пояснения я думал что между "понятно" и "академически" существует дихотомия.
Теперь я уже не уверен. В вашей "системе ценностей" код может быть одновременно и "понятным" и "академическим" (варианты 1 и 5), или я что-то понял не так?
Если вам не трудно, могли бы в классифицировать примеры из статьи по системе "понятно"/"академически" с комментариями почему именно так?
Характеристики "понятно" и "академически", сами по себе, довольно абстрактны и каждый человек вкладывает в них какой-то свой смысл.
Когда я обсуждал статью с коллегами внутри компании, то получалась такая ситуация * "простым" считали либо первый, либо пятый * "академическим" считали либо второй, либо третий
Вот лично для вас, на пальцах, что значит "просто", а что "академически"?
Да, но в таком варианте растет количество "не естественного" синтаксиса, имею в виду конструкции библиотеки every, returnsвместо "родных" языковых override
Плюс, сходу не понятно, как сделать собственное поведение для мокируемого метода?
Например, как будет выглядет вот такой мок, но сделанный на mockk
fun repository(repositoryId: Int, origin: Repository? = null, project: Project? = null) = object : Repository by proxy() {
override fun getId() = repositoryId
override fun getState() = AVAILABLE
override fun getOrigin() = origin
override fun isFork() = getOrigin() != null
override fun getProject() = project!!
override fun equals(other: Any?) = (other as? Repository)?.id == id
override fun hashCode() = id.hashCode()
override fun getName() = "Repository #$id"
override fun getSlug() = "repository-$id"
override fun toString() = name
}
p.s. Вариант moсkkвыглядит лучше, чем mockito, но концептуальные претензии такие же
Эта инспекция будет работать только для java-кода? Для того же Kotlin или Scala нужно писать отдельно? Есть ли в принципе какие-то кросс-языковые инспекции?
Отлично же :) Тогда давайте я попробую применить ваши критерии.
Первый вариант я написал за 5 минут.
Чтобы написать пятый вариант, понадобилось 10 минут.
Цифры условные, никаких замеров я не делал, но по ощущениям на пятый вариант потрачено в два раза больше времени.
Технически, я сначала написал вариант 1, а потом потратил еще столько же времени, чтобы его улучшить и, в итоге, получился вариант 5.
Сколько времени уйдет на внесение изменений в будущем не понятно. Ведь мы не знаем какого рода это будут изменения и кто их будет вносить.
В силу простоты задачи какой-то явно заметной отладки не получилось.
На решение написано 5 тестов:
3 теста на случай когда не передали какой-то из параметров
1 тест когда пользователь не имеет доступа и получает отлуп
1 тест когда все хорошо и доступ есть
Оба варианта успешно проходят все тесты.
Как понять какой вариант лучше? Первый, потому что потребовал меньше времени?
Кстати, если я не знаю сколько времени потрачено на написание кода, например, смотрю на код опенсорсной библиотеки, то получается в рамках этой схемы качество оценить нельзя?
До вашего пояснения я думал что между "понятно" и "академически" существует дихотомия.
Теперь я уже не уверен. В вашей "системе ценностей" код может быть одновременно и "понятным" и "академическим" (варианты 1 и 5), или я что-то понял не так?
Если вам не трудно, могли бы в классифицировать примеры из статьи по системе "понятно"/"академически" с комментариями почему именно так?
На мой взгляд, ваши критерии
позволяет как можно быстрее вносить изменения сохраняя при этом минимально необходимый уровень качества
соответствие реального поведения программы ожидаемому поведению описанному в ТЗ
все равно довольно абстрактны.
Сейчас я не понимаю как их можно свести к числам.
Если вам не трудно, можете провести оценку пары вариантов, например, первого и пятого по своей схеме?
Понятное дело, что это примеры и в жизни все сложнее. Но думаю для общего понимания методики их хватит.
Если нужны какие-то уточнения по ТЗ, или другого плана, то я готов отвечать на вопросы.
А как вы определяете читаемость?
Гипотетически, если бы мне действительно надо было проходить ревью у вас, как бы я мог понять, достаточно ли читаемо написал?
Тут есть ловушка
Дело в том, что "критерии лучшести" часто выражаются абстрактными словами.
Допустим, мы считаем, что хороший код должен быть выразительным и поддерживаемым (и работать правильно, само собой)
А что такое выразительность и поддерживаемость?
Тут есть забавный нюанс.
Характеристики "понятно" и "академически", сами по себе, довольно абстрактны и каждый человек вкладывает в них какой-то свой смысл.
Когда я обсуждал статью с коллегами внутри компании, то получалась такая ситуация
* "простым" считали либо первый, либо пятый
* "академическим" считали либо второй, либо третий
Вот лично для вас, на пальцах, что значит "просто", а что "академически"?
Нет, никакой "технической оценки" вариантов не делали.
Никак :)
На всякий случай, я не предлагаю выкинуть Mockito и ему подобные инструменты и заменить на подход из статьи.
Я за то, чтобы не тащить к себе хоть и крутой, но избыточный инструмент.
Да, но в таком варианте растет количество "не естественного" синтаксиса, имею в виду конструкции библиотеки
every,returnsвместо "родных" языковыхoverrideПлюс, сходу не понятно, как сделать собственное поведение для мокируемого метода?
Например, как будет выглядет вот такой мок, но сделанный на
mockkp.s. Вариант
moсkkвыглядит лучше, чемmockito, но концептуальные претензии такие же(с) Louna, «Шум»
Конечно, ведь он прямо так и называется Bitbucket Server https://www.atlassian.com/software/bitbucket/server