Запахи кода
Что есть чистый код?
Откуда берется плохой код?
Главный вопрос жизни, вселенной и тд  тп Зачем?
Главный императив в программировании Борьба со сложностью
Поучительная история от гика Запись сессии программирования в текстовом редакторе Emacs Большую часть времени код  читается
Чистый код по  XP Все тесты проходят Нет дублирующегося кода Выражает намерения программиста Используется минимальное количество классов и методов
Пионеры в борьбе со злом
Собственно ,  о запахах Их много ,  очень много Низкоуровневые ,  высокоуровневые ,  на уровне методов ,  на уровне архитектуры Программирование больше состоит из эвристики ,  чем из детерминированных алгоритмов. Да поможет нам развивающееся с годами  “ чувство кода ” .
Test Problem Рефакторинг без тестов – путь камикадзе Hard to Test code. TDD –  думайте об этом как  Test Driven  Design Но и здесь есть запахи   и свои подводные камни
Названия Удачные названия выстраивают в голове целостную картину о проекте Неудачные запутывают, вводят в заблуждение Придумать с первого раза хорошее имя методу или классу удается не всегда, но усилия на раздумия окупаются.
Длинные методы И дело вовсе не в размере Первое правило функций :  они должны быть  компактными Второе правило функций :  они должны быть еще  компактнее Третье правило :   функция должна выполнять только одну операцию ,  она должна выполнять ее хорошо ,  и ничего другого она делать не должна.
Большой класс Большой объем ответственности ,  нарушение принципа  SRP   (Single Responsobility) Должна быть одна и только одна причина для изменения класса. Питательная среда для повторяющегося кода ,  хаоса и смерти
Симптомы Много атрибутов Не использует постоянно все переменные Большой коэффициент по выходу(много знает о других классах)
Длинный список параметров #Windows programmer NULL = None def CalculateAndPrintFactorialEx(dwNumber,                                   hOutputDevice,                                   lpLparam,                                   lpWparam,                                   lpsscSecurity,                                   *dwReserved):      if lpsscSecurity != NULL:          return NULL #Not implemented      dwResult = dwCounter = 1      while dwCounter <= dwNumber:          dwResult *= dwCounter          dwCounter += 1      hOutputDevice.write((dwResult))      hOutputDevice.write('\n')      return 1 import sys CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
Туда же аргументы флаги render(true); render(boolean isSuite) renderForSuite()
Завистливые функции Методы класса больше интересуются не своим классов ,  а каким то чужим. Здесь же обитает анемичная модель.
Одержимость элементарными типами Стринговая типизация Передача  id -шников по всему коду в методы
Операторы  switch Полиморфизм от СИ разработчиков. Не всегда плохо ,  но повод задуматься есть Конечный автомат с небольшим числом состояний – хорошо.
Ленивый класс Класс перестал оправдывать свое существование в связи с чисткой в коде Дайте ему достойно умереть
Overdesign  и теоретическая общность public class HelloWorld  { public static void main(String[] args)  { MessageBody mb = new MessageBody(); mb.configure(&quot;Hello World!&quot;); AbstractStrategyFactory asf = DefaultFactory.getInstance(); MessageStrategy strategy = asf.createStrategy(mb); mb.send(strategy); } }
Закон Деметры Или закон наименьшего знания. a.getB().method() –  нехорошо ,   a.method() –  лучше. Если хотите ,  чтобы собака побежала ,  глупо командовать ее ногами ,  лучше отдать команду собаке ,  она разберется со своими ногами сама.

запахи кода

  • 1.
  • 2.
  • 3.
  • 4.
    Главный вопрос жизни,вселенной и тд тп Зачем?
  • 5.
    Главный императив впрограммировании Борьба со сложностью
  • 6.
    Поучительная история отгика Запись сессии программирования в текстовом редакторе Emacs Большую часть времени код читается
  • 7.
    Чистый код по XP Все тесты проходят Нет дублирующегося кода Выражает намерения программиста Используется минимальное количество классов и методов
  • 8.
  • 9.
    Собственно , о запахах Их много , очень много Низкоуровневые , высокоуровневые , на уровне методов , на уровне архитектуры Программирование больше состоит из эвристики , чем из детерминированных алгоритмов. Да поможет нам развивающееся с годами “ чувство кода ” .
  • 10.
    Test Problem Рефакторингбез тестов – путь камикадзе Hard to Test code. TDD – думайте об этом как Test Driven Design Но и здесь есть запахи и свои подводные камни
  • 11.
    Названия Удачные названиявыстраивают в голове целостную картину о проекте Неудачные запутывают, вводят в заблуждение Придумать с первого раза хорошее имя методу или классу удается не всегда, но усилия на раздумия окупаются.
  • 12.
    Длинные методы Идело вовсе не в размере Первое правило функций : они должны быть компактными Второе правило функций : они должны быть еще компактнее Третье правило : функция должна выполнять только одну операцию , она должна выполнять ее хорошо , и ничего другого она делать не должна.
  • 13.
    Большой класс Большойобъем ответственности , нарушение принципа SRP (Single Responsobility) Должна быть одна и только одна причина для изменения класса. Питательная среда для повторяющегося кода , хаоса и смерти
  • 14.
    Симптомы Много атрибутовНе использует постоянно все переменные Большой коэффициент по выходу(много знает о других классах)
  • 15.
    Длинный список параметров#Windows programmer NULL = None def CalculateAndPrintFactorialEx(dwNumber,                                   hOutputDevice,                                   lpLparam,                                   lpWparam,                                   lpsscSecurity,                                   *dwReserved):      if lpsscSecurity != NULL:          return NULL #Not implemented      dwResult = dwCounter = 1      while dwCounter <= dwNumber:          dwResult *= dwCounter          dwCounter += 1      hOutputDevice.write((dwResult))      hOutputDevice.write('\n')      return 1 import sys CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
  • 16.
    Туда же аргументыфлаги render(true); render(boolean isSuite) renderForSuite()
  • 17.
    Завистливые функции Методыкласса больше интересуются не своим классов , а каким то чужим. Здесь же обитает анемичная модель.
  • 18.
    Одержимость элементарными типамиСтринговая типизация Передача id -шников по всему коду в методы
  • 19.
    Операторы switchПолиморфизм от СИ разработчиков. Не всегда плохо , но повод задуматься есть Конечный автомат с небольшим числом состояний – хорошо.
  • 20.
    Ленивый класс Классперестал оправдывать свое существование в связи с чисткой в коде Дайте ему достойно умереть
  • 21.
    Overdesign итеоретическая общность public class HelloWorld { public static void main(String[] args) { MessageBody mb = new MessageBody(); mb.configure(&quot;Hello World!&quot;); AbstractStrategyFactory asf = DefaultFactory.getInstance(); MessageStrategy strategy = asf.createStrategy(mb); mb.send(strategy); } }
  • 22.
    Закон Деметры Илизакон наименьшего знания. a.getB().method() – нехорошо , a.method() – лучше. Если хотите , чтобы собака побежала , глупо командовать ее ногами , лучше отдать команду собаке , она разберется со своими ногами сама.