понедельник, 4 января 2016 г.

Глава 7. Высококачественные методы

Метод - это отдельная функция или процедура, выполняющая одну задачу.
Причины создания методов:

  • Снижение сложности - за счёт абстрагирования деталей реализации различных операций
  • Формирование понятной промежуточной абстракции - за счёт хорошего именования метода
  • Предотвращение дублирования кода
  • Поддержка наследования - переопределять отдельные маленькие методы проще, чем один большой
  • Сокрытие очерёдности действий - если два действия должны идти в определённом порядке, то нужно их обернуть в метод, чтобы не допустить где-нибудь неправильного порядка
  • Улучшение портирования - непортируемый(платформозавизимый) код нужно вынести в метод, чтобы его легко можно было заменить при переезде на другую платформу
  • Упрощение сложных булевых проверок - упрощает восприятие при чтении
  • Повышение быстродействия - легче оптимизировать код в одном месте
Не стоит бояться создавать методы для очень коротких действий, если они повторяются хотя бы пару раз.
Очень важной характеристикой метода является связность - метод должен выполнять одну строго определённую и понятную задачу. Связность бывает нескольких видов:

  • Функциональная - метод выполняет одну и только одну операцию
  • Последовательная - метод содержит операции, выполняющиеся в определённом порядке, одна операция полагается на результат другой. Такой метод лучше разбить на два, если это возможно.
  • Коммуникационная - если метод содержит несколько операций объединённых только общими данными, к которым они обращаются
  • Временная - в методе несколько операций, объединённых по временному промежутку, в который они выполняются, например Startup(), AfterCreation()...
Остальные виды связности обычно неприемлемы.
Следует уделять много внимания именованию методов:

  • Нужно описать в названии всё, что метод возвращает и его побочные эффекты
  • Избегаем невыразительных и неоднозначных глаголов, например HandleCalculation(), ProcessInput(), DealWithOutput()...
  • Не стоит использовать номера для идентификации методов (Task1(), Task2())
  • Не стоит ограничивать длину имени метода
  • Для именования функции нужно использовать описание возвращаемого значения
  • Для именования процедуры используем выразительный глагол + объект с которым он работает
  • Используем общепринятые антонимы для описания противоположных действий:
    • add/remove
    • begin/end
    • create/destroy
    • first/last
    • get/put
    • get/set
    • increment/decrement
    • insert/delete
    • lock/unlock
    • min/max
    • next/previous
    • old/new
    • open/close
    • show/hide
    • source/target
    • start/stop
    • up/down
  • Определяем конвенции именования часто используемых операций - например операции получения id объекта
Относительно оптимального объёма метода ясности нету, понятно только, что методы длиной более 200 строк уже не очень хорошо поддерживаются и скорее всего у них проблемы со связностью.
Параметры в методы нужно передавать в одном и том же порядке. Наиболее распространённый порядок - входящие значения, изменяемые значения, исходящие значения. Не нужно передавать в метод неиспользуемые параметры. Лучше не использовать входящие переменные в качестве рабочих переменных, а создавать их локально внутри метода. Пишем документацию по параметрам метода - виды(входной, изменяемый, выходной) параметров, единицы измерения, возвращаемые значения, ограничения на входящие значения. 
Количество аргументов метода не должно превышать 7. Для этого иногда стоит передавать не отдельные поля какого-либо класса, а весь экземпляр целиком. Иногда можно использовать именованные параметры( в C# поддерживаются), когда в метод передаются несколько аргументов одного типа.

Комментариев нет:

Отправить комментарий