User Artem Murk
Artem Murk
35 уровень
Днепр

«Чистый Код», Роберт Мартин. Обзор книги по «кунг-фу коду» для разработчика

Статья из группы Random
Привет Джаварашевцы! Данная статья посвящена обзору книге «Чистый код» Роберта Мартина. Мы вместе рассмотрим способы улучшения и оптимизации вашего кода , а также в конце вас ожидает небольшая, но интересная задачка.
«Чистый Код», Роберт Мартин. Обзор книги по «кунг-фу коду» для разработчика - 1
Каждый день открывая редактор вашего кода мы сталкиваемся с множеством классов, функций и переменных. Самый хороший вариант, если это ваш код написанный с нуля, написан один раз, в нем немного строк, вы над ним работает одни, нет правок и дальнейшего сопровождения со стороны заказчика. НО! Как показывает практика, да я думаю вы и сами понимаете что такого не бывает. В основном нам придется как то взаимодействовать с членами своей команды, сопровождать «индусский» код, и разбирать продукты в миллионы строк. Я часто слышал от коллег по обучению ответы такого плана «Этот код написан мной, и я его не собираюсь никому показывать», но когда я вижу просьбы на Хелпе о Помощи с таким кодом, то приходится очень долго(иногда действительно доооолго) вникать и понимать чего человек хотел мне сказать, даже хочется сказать «сотри и перепиши заново»! Цените время, и силы людей которые хотят вам помочь, пишите правильно, а если не умеете, то научится никогда не поздно. Книга Роберта Мартина среди книг такого формата выгодно отличается тем, что в ней есть множество примеров на Java. Может немного фанатичное высказываение с моей стоороны, но она написана в ООП стиле, а именно в написании частей и разделов. Простая для понимания и чтения книга легко читается в дороге или вечером перед сном. «Чистый код» разделен на 3 части. В первой части нам предлагают пройтись по теории книги, узнать про паттерны проектирования и правилах хорошего тона. Вторая часть нам предлагает попрактиковаться в рефакторинге и написании, ну а третья часть является финальной выжимкой «запахов» кода в примерах. Что ж автор затронул множество тем для знания которых вам в основном потребуются знания Java Core, но есть и разделы посвященные Модульным тестам JUnit, Логированию log4j, знание простейших паттернов в проектировании(но как я сказал выше их немного, и все непонятное успешно гуглится, да и разбираетя на курсе JavaRush). Все главы книги не связаны друг с другом, вы успешно можете начать читать с той главы которая вам по душе. Краткая выжимка основных идей которые я подчерпнул из книги. Буду признателен за комментарии к ним, в которых вы сможете поделиться собственным виденьем данных высказываний.

1. Коментарии == зло.

В большинстве случаев комментарии — это костыли которыми мы пытаемся прикрыть наш плохой код. А в некоторых случаях они еще и врут о назначении методов, или переменных если происходит постоянный рефакторинг кода.

2. Заккоментированный код, мертвый код.

Оставлять данные куски кода в вашем приложении — равносильно мусору. Неиспользуемый код со временем накапливается и мешает чистоте вашего приложения, время от времени проверяйте код на такие вот модули.

3. Заголовки методов, классов и переменных.

Стоит отдельных статей для рассмотрения данной темы. Не поленитесь и пишите имена которые могут поведать о своем назначении. Изучите некоторые стандарты в написании названий. Данная тема «Мастхэв» для детального изучения.

4. Каждому методу и переменной свое место в иерархии класса.

Обычно в классе могут быть переменные и методы (статичные и не статичные), конструтор, вложенные и внутренние классы, энумы. Одним словом информации много, и необходимо определить каждому своё место в классе. Если вы загляните в java core классы, то увидите что структура четко структурирована, мы можем увидеть каждую часть на своем месте, конечно в ваших проектах она может меняться в рамках проекта, но не в каждом классе. Для себя я определил вот такую структуру построения: В начале класса у меня статик переменные, затем переменные объекта + Энумы если они есть. После переменных я определяю констукторы класса. Затем пишу методы работы с классом. После методов я пишу геттеры и сеттеры. И в самом конце у меня содержаться внутренние классы. Можете пользоваться моей структурой или написать в комментариях свою.

5. Уровни абстракции методов.

Для меня это было открытием №1. Каждый метод содержит операторы только одного уровня абстракции. Не стоит мешать в куче разноуровневые операции.

6. Обработка ошибок.

Checked или Uncheked Exceptions, что лучше же лучше ипользовать в проекте(а вы как думаете?, пишите коментарии)? Я сторонник checked, но книга помогает взглянуть со стороны и на Непроверяемые исключения. Действительно unchecked Exception не уродует сигнатуру метода, особенно если учитывать что иключения «пробивают» сразу несколько слоев. Неудобство в мельчайшем изменении приводит к переопределнию всей цепочки методов до её отлова, что крайне неудобно для разработки во многих случаях.

7. Форматирование кода.

Правильно отформатированный код является не только краивым, но ещё и хорошо читаемым. Сразу складывается представление о скобочках и действиях внутри. На примере условий в конструкциях if, else - не стоит писать все в одну строчку, лучше перенесите длинные цепочки.

8. Отрицания в условии.

Старайтесь избегать отрицания в условиях, это больше психологический фактор, наш мозг плохо воспринимает отрицания, да и ! перед выражением можно и не заметить. Например отрицание if (!condition.isTrue) лучше переписать метод, это существенно облегчит вот так(condition.isFalse)

9. Функции должны выполнять одну операцию.

Если у вас метод выполняет множество операций, то делите их на однооперационные методы. Данные методы очень легко поддерживаемы, их легко тестировать, и при случае заменять или удалять.

10. Не повторяйтесь.

Не повторяйте код DRY (Don`t repeat yourself ). Это одно из основополагающих правил которое сократит в разы ваш код, постоянно держите в голове. Старайтесь все ваши повторяющиеся куски кода вынести в отдельную функцию. Конечно можно еще много говорить о DRY, KISS(Keep it simple Stupid), SOLID, YAGNI. Данные термины необходимы для понимания и проектирования. Они стоят отдельной статьи, возможно я еще напишу о них, т. к. данная статья посвящена обзору книге «Чистый код».
«Чистый Код», Роберт Мартин. Обзор книги по «кунг-фу коду» для разработчика - 2
Как и обещал, небольшая и легкая задачка для вас. Программа должна вычислять Индекс Ожирения по заданным данным. Пишите в комментариях количество ошибок и исправлений в коде. П.с. код рабочий и выполняет свою функцию если его правильно использовать.

//Weight in kg.
//Height in metres.
public class sample {
    public static void main (String[] args) {
        humanIMB humanIMB = new humanIMB(80,1.52);
        System.out.println(humanIMB.Result());
    }
}
class humanIMB {
    public double W; //Weight Human
    public double H; // Height Human
    private static double imb;
    public humanIMB(double w, double h) {
        W = w;
        H = h;
        imb = W / (H * H);
    }
    public double takeW() {
        return W;
    }
    public void putW(double w) {
        W = w;
        imb = W / (H * H);
    }
    public double takeH() {
        return H;
    }
    public void putH(double h) {
        H = h;
        imb = W / (H * H);
    }
    public static double takeImt() {
        return imb;
    }
    public static String Result() {
        String  string = null;
        if (imb >=18.5 & imb <25) {
            string ="Норма, ты в форме!";
        }
        if (imb >=25 & imb <30) {
            string ="Предожирение. Эй, поосторожнее с пирожными ";
        }
        if (imb >=30) {
            string ="Ожирение. SCHWEINE! Хватит жрать, иди на треню!";
        }
        if (imb <18.5) {
            string ="Дефицит массы тела. В модели решил переквалифицироваться?";
        }
        return string;
    }
}
Комментарии (37)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Игорь Уровень 33, Москва , Россия
21 июля 2021
Вот мой вариант вашего кода. Пришлось добавить условие, ведь если вдруг кто то введёт 0 то будет ошибка.

class Sample {
    public static void main(String[] args) {
        HumanIndexFat human = new HumanIndexFat(78, 1.77);
        System.out.println(human);

    }
}

public class HumanIndexFat {
    private double weightHuman;
    private double heightHuman;
    private double indexManBody;
    private String result = "";

    public HumanIndexFat(double weightHuman, double heightHuman) {
        setWeightHuman(weightHuman);
        setHeightHuman(heightHuman);
        increaseIndexManBody();
        increaseResult();
    }

    public double getWeightHuman() {
        return weightHuman;
    }

    private void setWeightHuman(double weightHuman) {
        if (weightHuman > 0) {
            this.weightHuman = weightHuman;
        } else {
            System.out.println("Вы ввели недопустимое число, введите реальный вес");
            Scanner sc = new Scanner(System.in);
            double trueWeightHuman = sc.nextDouble();
            setWeightHuman(trueWeightHuman);
        }
    }

    public double getHeightHuman() {
        return heightHuman;
    }

    private void setHeightHuman(double heightHuman) {
        if (heightHuman > 0) {
            this.heightHuman = heightHuman;
        } else {
            System.out.println("Вы ввели недопустимое число, введите реальный рост");
            Scanner sc = new Scanner(System.in);
            double trueHeightHuman = sc.nextDouble();
            setHeightHuman(trueHeightHuman);
        }
    }
Дмитрий Уровень 12, Краснодар, Россия
26 июня 2021
Думаю для читаемости кода надо было сгруппировать правильно методы takeH рядом с takeW и после putH и putW. Ну и условие в методе Result сделать упорядоченным, начать с дефицита веса и закончить ожирением. Могу ошибаться, я новичок🙏
Grom Уровень 41, Екатеринбург
17 марта 2021
1) Не нужно указывать комментарии в двух первых строках. 2) Не надо писать эти комментарии, если переменную можно сразу назвать weight и height.

public double W; //Weight Human
public double H; // Height Human
3) Так же в функциях с параметрами нужно указывать названия этих параметров понятно, а не одной буквой. 4) Так же можно по порядку чередовать геттеры и сеттеры. 5) А еще можно все конструкции if - else указать в совместной логической связке.
Gaziz Уровень 31, Уфа, Россия
6 января 2021
Так и хотелось добавить this в конструкторе. Короткие переменные не описывают содержание.
Мирослав Уровень 25, Тбилиси, Грузия
15 ноября 2020
вы над ним работает одни, нет ...... вы над ним работаетE ? одни, нет
🦔 Виктор Уровень 20, Москва, Россия Expert
18 сентября 2020
Продано! : ) Если кому-нибудь нужна сама книга в последнем издании 2019 года на русском языке, то смотрите мою подпись ниже... -- Канал в телеге про Java и Android, в котором есть книги для скачивания, статьи, видеоуроки, чат для обмена знаниями и моральной поддержки : ) Давайте учиться вместе: @LetsCodeIt p. s. Мой личный телеграм канал вкатывальщика в прогерство: @SefoNotasi
Серега Уровень 20, Кривой Рог, Украина
11 августа 2020
https://www.youtube.com/playlist?list=PLyApprAtr5yjywFgRkxhfGfesgYoIhU8U
Max Уровень 37
18 июня 2020
по поводу п.4 - всё так же, кроме геттеров и сеттеров - пишу их сразу после полей.
Crew Dragon Уровень 11
28 мая 2020
с какого уровня лучше читать эту книгу?
Светлана Уровень 34
7 мая 2020
По поводу комментариев очень правильно! Одному моему знакомому программисту пришлось много лет назад работать в немецкой команде, Все комментарии к программам были написаны на немецком, а он по немецки ни слова, так сказать! Ничего, справился! - читал код!