Привет Джаварашевцы! Данная статья посвящена обзору книге «Чистый код» Роберта Мартина. Мы вместе рассмотрим способы улучшения и оптимизации вашего кода , а также в конце вас ожидает небольшая, но интересная задачка.
«Чистый Код», Роберт Мартин. Обзор книги по «кунг-фу коду» для разработчика - 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;
    }
}