JavaRush/Java блог/Random/Роберт Мартин, «Чистый Код». Обзор книги по «кунг-фу коду...
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;
    }
}
Комментарии (43)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sandrovichus
Уровень 13
19 февраля, 17:22
Как говорят немцы про автомобили FIAT: Feller In Alle Teile. В переводе - ошибка в каждой детали.
Kampfer
Уровень 30
18 марта 2023, 18:05
В 7. пункте ошибка в слове краСивым
Perl Developer Perl Developer
12 января 2023, 16:42
Чистый код это фикция?
Dmitry Sokolov
Уровень 6
17 марта, 11:43
Соглашусь с комментарием под этим видео: Фундаментальная идея обеих книг - в том что нужно разумно и осознанно походить к коду. Описанные рекомендации (именно так, рекомендации, а не правила) в общем случае помогут сделать код более читабельным. Тем не менее, как и все рекомендации, их нужно переварить и подумать перед применением, стоит ли их вообще использовать в данном случае
Planca
Уровень 36
Expert
5 декабря 2022, 13:35
Отличная статья, если подправить грамматические и пунктуационные ошибки - будет пушка! ;*
linx
Уровень 4
10 ноября 2022, 09:01
Ребята пдскажите в условии одно "&" так можно? обучали что "&&" два должно быть
Игорь
Уровень 33
21 июля 2021, 11:17
Вот мой вариант вашего кода. Пришлось добавить условие, ведь если вдруг кто то введёт 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);
        }
    }
Игорь
Уровень 33
21 июля 2021, 11:17
Ну а это продолжение:
private void increaseIndexManBody() {
        indexManBody = weightHuman / (heightHuman * heightHuman);
    }

    private double getIndexManBody() {
        return indexManBody;
    }

    private void increaseResult() {
        if (indexManBody >= 18.5 && indexManBody < 25) {
            result = "Норма, ты в форме!";
        } else if (indexManBody >= 25 && indexManBody < 30) {
            result = "Предожирение. Эй, поосторожнее с пирожными!";
        } else if (indexManBody >= 30) {
            result = "Ожирение. SCHWEINE! Хватит жрать, иди на треню!";
        } else if (indexManBody < 18.5) {
            result = "Дефицит массы тела. В модели решил переквалифицироваться?";
        }
    }

    @Override
    public String toString() {
        return result = "Вес человека= " + weightHuman +
                ", Рост человека= " + heightHuman +
                ", Индекс жирности=" + indexManBody +
                "\n" + result;
    }
}
Дмитрий
Уровень 26
26 июня 2021, 10:52
Думаю для читаемости кода надо было сгруппировать правильно методы takeH рядом с takeW и после putH и putW. Ну и условие в методе Result сделать упорядоченным, начать с дефицита веса и закончить ожирением. Могу ошибаться, я новичок🙏
Grom
Уровень 41
17 марта 2021, 13:08
1) Не нужно указывать комментарии в двух первых строках. 2) Не надо писать эти комментарии, если переменную можно сразу назвать weight и height.
public double W; //Weight Human
public double H; // Height Human
3) Так же в функциях с параметрами нужно указывать названия этих параметров понятно, а не одной буквой. 4) Так же можно по порядку чередовать геттеры и сеттеры. 5) А еще можно все конструкции if - else указать в совместной логической связке.
Gaziz
Уровень 31
6 января 2021, 11:47
Так и хотелось добавить this в конструкторе. Короткие переменные не описывают содержание.
Мирослав
Уровень 29
Expert
15 ноября 2020, 08:50
вы над ним работает одни, нет ...... вы над ним работаетE ? одни, нет