Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.61 KB | None | 0 0
  1. == Принципы написания кода ==
  2. # '''"Правило бойскаута" - Оставь место стоянки чище, чем оно было до твоего прихода.'''
  3. #: Если мы все будем оставлять свой код чище, чем он был до нашего прихода, то код попросту не будет загнивать. Чистка не обязана быть глобальной. Присвойте более понятное имя переменной, разбейте слишком большую функцию, устраните одно незначительное повторение, упростите сложную цепочку условий.
  4. # '''Названия классов, методов, функций, переменных должны быть говорящими и не вводящими в заблуждение'''
  5. # '''JAVA-doc должен быть актуальным. Поменял функцию - обнови описание'''
  6. # '''JAVA-doc должен описывать каждый класс и метод'''
  7. # '''Разбиение сложного на простое'''
  8. ## ''Сложные условия лучше выносить в методы или переменные с говорящими названиями''
  9. ## ''Длинные методы лучше разбивать на более мелкие. Метод в 50 строк - слишком большой''
  10. ## ''Методы, содержащие более 7 параметров лучше разбивать на несколько более мелких''
  11. # '''Максимальное использование имеющегося функционала. Избегать дублирования.'''
  12. #: Перед тем как приступить к созданию класса-утилиты с функцией, которая вам пригодится при реализации задачи, подумайте, может такая функция уже где то есть?
  13. # '''Параметризовывать потенциально изменяемые данные или использовать шаблонизацию'''
  14. # '''Общие части классов выносить в класс-родитель (если его нет то создать и унаследоваться от него, сохраняя при этом согласованную абстракцию - классы должны использоваться в рамках одной области например - "платежные поручения" или "документы клиентов")'''
  15. # '''Реализовывать логику там, где это уместно.'''
  16. ## ''Логика отрисовки html должна быть в gsp, всё остальное в контроллер(наилучший вариант - в сервис)''
  17. ## ''Логика работы с моделями - в моделях''
  18. ## ''Вспомогательные функции - в утилиты(только если нет похожего функционала)''
  19. # '''Обязательно вести логирование на всех уровнях'''
  20. ## ''DEBUG - информация, полезная разработчику для отладки''
  21. ##: Если это будет сделано на этапе разработки, нам не придётся делать это в рамках задач-ошибок с приоритетом критикал посредством патчей.
  22. ## ''INFO - информация, полезная сотруднику банка''
  23. ##: Система будет более прозрачна для понимания. Сотрудник банка сможет отследить операции, действия совершаемые клиентом, при необходимости.
  24. ## ''WARN - информация об ошибках, не критичных для работы системы''
  25. ##: При установке версии забыли прописать параметр? - не нужно при этом молча отключать функционал. Предупреждайте, например так: "В системе не прописан путь к настройкам кредитного калькулятора. Кредитный калькулятор будет работать в режиме без привязки к кредитным продуктам банка."
  26. ## ''ERROR - информация о критичных ошибках''
  27.  
  28. == Анализ примеров и правило бойскаута в действии ==
  29.  
  30. === Понятное название ===
  31. И без комментария ясно что мы получим тарифный план
  32. <code>
  33. def getTariffPlan () {
  34. ....
  35. }
  36. </code>
  37.  
  38. === Название, которое вводит в заблуждение ===
  39.  
  40. <code>
  41. function checkPayeeAccountForBudget() {
  42. var budgetAccounts = ["401", "402", "403", "404"];
  43. if ($("#payee-account").val()){
  44. if ($.inArray($("#payee-account").val().substring(0, 3), budgetAccounts) > -1) {
  45. $('#calc-nds-kind').attr("value", '3'); //автоподстановка значения без запрета на изменение
  46. $('#calc-nds-kind').change();
  47. }
  48. }
  49. }
  50. </code>
  51. Как мы видим из тела функции, помимо проверки приндлежит ли счёт бюджету, функция еще выполняет подстановку НДС.
  52.  
  53. Теперь приведём код в красивый и понятный вид <br/>
  54. <pre>
  55. function checkPayeeAccountForBudget(account) {
  56.  
  57. var budgetAccounts = ["401", "402", "403", "404"],
  58. conto = account.substring(0, 3);
  59.  
  60. return $.inArray(conto, budgetAccounts) > -1;
  61. }
  62.  
  63. function processChangeAccount() {
  64.  
  65. var account = $.trim($("#payee-account").val());
  66.  
  67. if (account != '') {
  68. if (checkPayeeAccountForBudget(account)) {
  69. $('#calc-nds-kind').val('3').change();
  70. }
  71. }
  72. }
  73. </pre>
  74. Мы разбили функцию на две, и каждая функция делает только одну функцию и это хорошо. Код стал понятным. Заодно мы и изменили некорректную проверку на заполненность поля "#payee-account", расставили отступы, убрали комментарий капитана очевидность:
  75. <pre>
  76. $('#calc-nds-kind').attr("value", '3'); //автоподстановка значения без запрета на изменение
  77. </pre>
  78. и убрали дублирование взятия объекта, воспользовавшись мощью jquery:
  79. <pre>
  80. $('#calc-nds-kind').val('3').change();
  81. </pre>
  82.  
  83. === Использование JAVA-doc ===
  84. '''Результатом работы метода должно быть ВСЕГДА значение одного типа'''
  85. <p>
  86. Метод не должен возвращать или объект, или ассоциативный массив или null.
  87. </p>
  88.  
  89. <pre>
  90. /**
  91. * Общая часть запроса для запросов Системы "Город"
  92. * @param params запрашиваемые параметры
  93. * @return строка
  94. */
  95. private _getGeneralPart(params) { ... }
  96. </pre>
  97. Замечательно правда? Нам не нужно анализировать тело функции, чтобы понять, что она делает.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement