Привет Джаварашевцы! Данная статья посвящена обзору книге «Чистый код» Роберта Мартина. Мы вместе рассмотрим способы улучшения и оптимизации вашего кода , а также в конце вас ожидает небольшая, но интересная задачка.
Каждый день открывая редактор вашего кода мы сталкиваемся с множеством классов, функций и переменных. Самый хороший вариант, если это ваш код написанный с нуля, написан один раз, в нем немного строк, вы над ним работает одни, нет правок и дальнейшего сопровождения со стороны заказчика. НО! Как показывает практика, да я думаю вы и сами понимаете что такого не бывает. В основном нам придется как то взаимодействовать с членами своей команды, сопровождать «индусский» код, и разбирать продукты в миллионы строк. Я часто слышал от коллег по обучению ответы такого плана «Этот код написан мной, и я его не собираюсь никому показывать», но когда я вижу просьбы на Хелпе о Помощи с таким кодом, то приходится очень долго(иногда действительно доооолго) вникать и понимать чего человек хотел мне сказать, даже хочется сказать «сотри и перепиши заново»! Цените время, и силы людей которые хотят вам помочь, пишите правильно, а если не умеете, то научится никогда не поздно.
Книга Роберта Мартина среди книг такого формата выгодно отличается тем, что в ней есть множество примеров на 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. Данные термины необходимы для понимания и проектирования. Они стоят отдельной статьи, возможно я еще напишу о них, т. к. данная статья посвящена обзору книге «Чистый код».Как и обещал, небольшая и легкая задачка для вас. Программа должна вычислять Индекс Ожирения по заданным данным. Пишите в комментариях количество ошибок и исправлений в коде. П.с. код рабочий и выполняет свою функцию если его правильно использовать.
//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;
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ