Господа, что-то мы уехали в какие-то литературные примеры. Дайте вариант реального кода, где реально 4 страницы кода нельзя сделать более читаемыми (а возможно даже меньше по размеру), разбив на функции. Вот мой пример, который я приводил ниже. Я утверждаю, что сейчас там почти ничего не понятно, сделав функцию меньше, например выделив результаты промисов ( код который идет внутри then ) в отдельные функции, читаемость повысится в разы. Приведите реальный пример реальной простыни, которую нельзя разбить.
Я с вами согласен: любой радикализм — зло. Как я уже писал в статье, сам грешил тем, про что писал. Тут именно вопрос не применения, а оценки, что есть хорошо, а что есть плохо, что есть необходимое (или почти необходимое) зло. Да иногда приходится так делать в каком-то данном конкретном случае, но это в любом случае говорит об ошибке на более высоком уровне, уровне выбора архитектуры, методики разработки, фреймворка или даже языка.
Для методов «делаем раз, делаем два» — уже то же написали несколько «если» другие комментаторы. Я могу добавить ещё. Дробление сложного метода на много коротких повышает понимание, ЧТО делает метод. Но к сожалению, часто уменьшается понимание КАК он это делает. В особенности, если итоговая вложенность методов сильно больше двух.
Вы каждый раз когда добавляете, например, стороннюю зависимость в проект лезете в ее код чтобы понять как она работает? Ну как я уже отвечал ниже — тестирование.
Есть ли смысл в погоне за снижением цикломатической сложности нарезать оставшиеся 2 тыс. на мелкие кусочки, если заведомо известно, что они в качестве самостоятельных единиц точно больше нигде и ни для чего не понадобятся? От слова «никогда»?
Тестирование, подумайте, насколько легче тестировать эти самые разрозненные кусочки, в отличие от монолита.
function (){
делаемРаз();
делаемДва();
делаемТри();
}
по 3-му, я же сказал — не однострочник, а последовательность действий больше 2х операторов (хотя и два тоже иногда надо убрать). Не обязательно добавлять зависимость на другой модуль, если функция используется только тут можно выделить этот код в приватную функцию. Если данный функционал используется в других модулях, то да — добавлять зависимость на другой объект, но это улучшит тестируемость вашего кода.
По-разному, у некоторых вырабатывается привычка от ритуала. Например многие курильщики говорят, что не получают удовольствие от получения никотина другим путем ( пластыри там всякие, спреи и тд), им нужно именно зажечь сигарету, поддержать ее в руках. Возможно с кофеином тоже самое, сходить в любимую кофейню рядом с работой, вдохнуть аромат кофе, поболтать с кем-нибудь около кофемашины на работе и тд.
Помимо дозы, я бы еще добавил про привычку. Если человек не может вставать каждый день без кофе (причем спал он вроде бы нормально), то это проблема, человек должен вставать нормально без стимуляторов, если не получается, то надо подумать о своем образе жизни. Если человек выпивает раз в неделю-две, например когда задерживается его самолет ночью в аэропорту, то почему бы и нет.
У вас DbContext должен инжектиться, а не репозиторий. При таком подходе и репозиторий можно протестить. Неправильная архитектура. Если используете EF для мока Db подойдет InMemoryDb.
Почему все последние примеры по ASP.NET core идут с IRepository? У нас же уже есть DbContext и DbSet?
Например:
public class ToDoContext:DbContext
{
public ToDoContext(DbContextOptions options):base(options){}
public DbSet<ToDoItem> Todos { get; set; }
}
И все.
Там где вы не хотите работать с физической базой данных (например в тестах) вы создаете контекст с dbContextOptions.UseInMemoryDatabase, а если в проде Postgres, то вот так:
Помниться для моего рисовательного приложения, тоже думал о получении замкнутого контура по цвета для заливки, сначал попробывал классический алгоритм, но уперся в 64кб размер стека в Андроиде, пришлось делать линейный алгоритм.
У вас там в switch часто повторяется последовательность действий
и еще несколько
их можно в функции,
а коды в массив
double someCodes1[] = {MATROSKA_SEGMENT_TRACK_FLAG_LACING, MATROSKA_SEGMENT_TRACK_FLAG_FORCED, ...};
+ функция isCodeInArray
получится что-то типа
if (isCodeInArray(code, someCodes1))
yourFunc
if (isCodeInArray(code, someCodes2))
yourFunc2
я думаю размер функций уменьшится в несколько раз
P.S. в С не силен
Вы каждый раз когда добавляете, например, стороннюю зависимость в проект лезете в ее код чтобы понять как она работает? Ну как я уже отвечал ниже — тестирование.
Тестирование, подумайте, насколько легче тестировать эти самые разрозненные кусочки, в отличие от монолита.
или
по 3-му, я же сказал — не однострочник, а последовательность действий больше 2х операторов (хотя и два тоже иногда надо убрать). Не обязательно добавлять зависимость на другой модуль, если функция используется только тут можно выделить этот код в приватную функцию. Если данный функционал используется в других модулях, то да — добавлять зависимость на другой объект, но это улучшит тестируемость вашего кода.
Сколько досталось сотруднику в виде премии от неприличной суммы? или только гордость и почитание?
Например:
И все.
Там где вы не хотите работать с физической базой данных (например в тестах) вы создаете контекст с dbContextOptions.UseInMemoryDatabase, а если в проде Postgres, то вот так: