с самого начала разработки понять - "делаю ли я говнокод?".
Меня немного напрягло нагромождение условных операторов и я решил спросить, нормально ли это? Логика тетриса будет решаться при помощи манипуляций с двумерным булевым массивом, все фигуры будут двигаться по своеобразной "тайловой сетке". На месте ячеек массива, которые будут true, я буду потом рисовать фигуры.
https://pastebin.com/yn3stfmC
Буду рад любой критике!
Оцените пожалуйста!) Код очень маленький!
Как вариант можно использовать Switch вместо ифов
Но он проверяет значение одного поля, а у меня много разных, поэтому я не думаю, что он подойдёт
Больщая вложенность циклов и ветвлений по мартину и его книге чистый код - говнокод, но видинее мартина не догма, но вообще такие большие конструкции из циклов и ветвлений большой вложенности требуют больших усилий что бы понять алгоритм, так что лучше не награмаждать такие конструкции, а выделять их части в отдельные методы с хорошими названиями
Да, думаю вы правы, большое спасибо, что посмотрели! Просто я ещё не набрался опыта нормально организовывать код, являюсь новичком в геймдеве. А в остальном как? Подходящая база для тетриса или не очень?
По 60 строкам кода невозможно оценить, подходящая база или нет) Но то, что у тебя такая большая вложенность и при всем этом нужен ты используешь goto, о чем-то, да говорит
Тут 60 строк, но они уже очень грязные, в одном классе смешано несколько уровней абстракций, высокая вложенность, много неотносящихся к игровому полю переменных, некоторые группы переменных, как x и y - можно выделить в отдельные класы, например coord, тут много что можно почистить и улучшить, в двух словах не написать, если хотите лучше понять, что такое чистый код, проичтайте хотя бы книгу мартина - чистый код, в двух словах старайся писать код так, что бы метод выполнял только одно дейсьтвие, что бы класс служил только одному предназначению и избегай таких награмождений из вложенностей, в них тупо сложно ориентироваться
https://pastebin.com/aTkkdgE4
В целом не стоит грустить, все всегда пишут говнокод разной степени паршивости, а уже потом дорабатывают его и чистят по меренеобходимости, никто не пишет чистый код сразу, всегда можно придраться
Да, вы правы. Просто тогда я решил, что по идее игра маленькая и ей не нужна прочная объектно-ориентированная база, написание которой вероятно, заняло бы очень много времени. В такой маленькой игре вероятно, будет очень легко ориентироваться. Но в следующем проекте (а может даже в этом), я обязательно научусь лучше организовывать код. Просто я совсем не понимаю, каким образом всю структуру сложного ООП кода с кучей взаимодействий и абстракций, можно уложить в голове, даже такой игры как Тетрис, не говоря уже о более сложных проектах. Возможно, где-то нужно какие-то зарисовки делать
Так тебе и не нужно все держать в голове, ООП служит тому, что бы проводить декомпозицию задачи, что бы в один конкретный момент времени ты был сконцентрирован на каком то небольшом аспекте всего проекта, а не разбирал сотни строк непонятных зависимостей и ненужных подробностей, конечно когда ты для того что бы написать hello world используешь 3 паттерна и несколько интерфейсов - это тоже говнокод, чистый код это про баланс под конкретную задачу, чувство этого баланса приходит с опытом
Спасибо большое за помощь, но как именно код стал лучше? Код ведь не укоротился и не стал понятнее. А на скриншоте он и вовсе не будет работать, ведь выходит из цикла не задав позицию тетрамино (фигуры). Я ценю вашу помочь, но объясните, как именно в положительном ключе повлияли эти изменения?
Это не идеальное решение и не идеальный код, просто пример, как можно обойтись меньшей вложенностью.
Обсуждают сегодня