
- •1. Предпосылки возникновения методологии структурного программирования. Основные принципы структурного программирования. Теорема Бёма-Якопини.
- •2. Структурное программирование. Проектирование сверху вниз. Модульное программирование. Структурное кодирование
- •4. Функции. Компактность. Правило одной операции. Опасность смешения уровней абстракции
- •5. Функции. Правило понижения. Паттерн «Абстрактная фабрика» и использование оператора switch
- •6. Аргументы функций. Приемлемое количество и качество аргументов. Побочные эффекты в функциях. Примеры
- •7. Комментарии. Основные правила написания хороших комментариев. Комментарии todo.
- •8. Комментарии. Основные признаки плохих комментариев. Примеры.
- •9. Форматирование исходного кода. Цель форматирования. Вертикальное разделение концепций, вертикальное сжатие. Вертикальное расстояние
- •10. Форматирование исходного кода. Цель форматирования. Горизонтальное форматирование. Горизонтальное разделение и сжатие. Отступы
- •11. Объекты и структуры данных. Отличия процедурного и объектно-ориентированного кода. Случаи применения
- •12. Закон Деметры. Опасность построения гибридов объектов и структур данных. Объекты передачи данных и активные записи
- •13. Обработка ошибок. Исключения и коды ошибок. Использование паттерна «Особый случай».
- •14. Использование стороннего программного кода. Учебные тесты как инструмент исследования и анализа граничного кода.
- •15. Проблемы использования стороннего программного кода. Применение паттерна «Адаптер» для организации взаимодействия с недоступным кодом.
- •16. Класс. Размеры класса. Принцип единой ответственности (srp).
- •17. Понятие связности класса. Влияние связности на размер классов.
- •18. Структурирование класса с учетом его изменений. Принципы проектирования классов в ооп.
- •19. Понятие эффективности программы. Выбор между эффективностью и удобочитаемостью. Оптимизирующие компиляторы.
- •20. Методология разработки через тестирование (tdd). Последовательность этапов разработки при использовании методологии tdd. Три закона tdd.
- •21. Тестирование как важный этап процесса разработки по. Чистота тестов. Тесты как средство обеспечения изменений. Правило «одна концепция на тест».
- •22. Экономические аспекты процесса тестирования. Тестирование методами «черного» и «белого» ящика. Невозможность исчерпывающего тестирования.
- •23. Основные принципы тестирования программного обеспечения.
- •24. Понятие отладки. Отличие между отладкой и тестированием. Средства отладки. Защитное программирование
- •25. Понятие отладки. Основные принципы отладки. Принципы локализации ошибок. Принципы устранения ошибок.
- •26. Понятие отладки. Основные подходы к отладке программ. Методы «грубой силы», индуктивная отладка, дедуктивная отладка, обратная трассировка, отладка тестированием.
- •27. Проблема ограниченности вычислительных систем. Возможности преодоления некоторых типов ограничений.
- •28. Понятие правильности программ. Доказательство правильности программ. Правильность программ
- •29. Типы разложения вычислений (сочленение, выбор, повторение).
- •If условие then оператор 1 else оператор 2
- •30. Неоднозначность определения программы. Проблема сравнения программ.
- •32. Понятие рефакторинга. Рефакторинги «Согласование различий», «Миграция данных», «Выделение метода».
- •33. Понятие рефакторинга. Рефакторинги «Встраивание метода», «Выделение интерфейса», «Перемещение метода».
- •Inline method (встраивание метода)
- •34. Понятие рефакторинга. Рефакторинги «Метод в объект», «Добавление параметра», «Параметр метода в параметр конструктора».
33. Понятие рефакторинга. Рефакторинги «Встраивание метода», «Выделение интерфейса», «Перемещение метода».
В рамках TDD рефакторинг1 используется интересным образом. Обычно рефакторинг не может изменить семантику программы ни при каких условиях. В рамках TDD условия семантики формулируются при помощи тестов, которые уже срабатывают. Таким образом, и рамках TDD мы можем, например, заменить константы переменными и с чистой совестью назвать эту процедуру рсфакторин- гом, потому что набор срабатывающих тестов при этом не изменился. Однако набор срабатывающих тестов может состоять всего из одного теста. Возможно, семантика программы должна описываться большим количеством тестов. Возможно также, что некоторые из этих потенциальных тестов в результате выполнения ^факторинга перестали бы срабатывать, если бы они существовали. Однако их пег. поэтому мы о них не беспокоимся.
Отсюда следует, что на программиста, работающею о стиле TDD, возлагается важная обязанность: он должен иметь лопаточное количество тестов» описывающих семантику программы. Достаточное по крайней мере настолько, настолько он может судить на момент завершения работы над кодом. Необходимо понимать, что рефакторинг выполняется не с учетом всех существующих тестов, а с учетом всех шзможнмх гсстов. Фраза наподобие: «Я знаю, что там была проблема, но все тесты сработали, поэтому я посчитал код завершенным и интегрировал сто и систему», — не может считаться оправданием. Пишите больше тестов.
Inline method (встраивание метода)
Каким образом можно упростить кол в случае» если становится сложно уследить за последовательностью передачи управления от метода к методу? Замените обращение к методу ходом этого метода.
Как
Скопируйте код метода в буфер обмена.
Вставьте код метода вместо обращения к методу.
Замените все формальные параметры фактическими параметрами. Если, например, вы перелаете reaoer.getNextO, то есть выражение, обладающее побочным эффектом, будьте осторожны и присвойте полученное значение временной переменной.
Зачем
Важно понимать. что при помоши Inline Method (Встраивание метода) вы можете экспериментировать с последовательностью выполнения действий. Когда я выполняю рефакторинг. я формирую у себя в голове мысленную картину системы с кусками логики и потоком выполнения программы, перетекающим ог одною обтлкта к другому объекту. Когда мне кажется, что я вижу нечто многообещающее, я использую рефакторинг для того, чтобы попробовать это и увидеть результат.
В разгаре битвы я могу вдруг обнаружить, что попался в ловушку собственной гениальности. (Я не буду говорить, насколько часто это происходит.) Когда этч> происходит, я использую Inline Method (Встраивание метода) для того, чтобы разобраться в ТОЙ путанице, которую я создал. «Так. этот объект обращается к этому, этот к этому... не могу понять, что же здесь происходит?» Я встраиваю несколько уровней абстракции и смотрю, что же на самом деле происходит. После этого я могу заново выделить абстракцию, используя более удобный способ.
EXTRACT INTERFACE (ВЫДЕЛЕНИЕ ИНТЕРФЕЙСА)
Каким образом создать альтернат иные реализации операций в языке Java? Создайте интерфейс, в котором будут содержаться общие операции.
Как
Напишите обьявленне интерфейса. Иногда в качестве имени интерфейса используется имя существующего класса. В этом случае вы должны предварительно переименовать класс.
Сделайте так, чтобы существующий класс рсалиэоиьшал объявленный вами интерфейс.
Добавьте в интерфейс все необходимые методы. В случае необходимости измените режим видимости методов класса.
Там, где это возможно, измените объявления с класса на интерфейс.
Зачем
Иногда необходимость выделения интерфейса возникает в случае, когда вы переходите от одной реализации к другой. Например, у вас есть класс Rectangle (прямоугольник). и вы хотите создать класс Oval (овал) — в этом случае вы создаете интерфейс Shape (форма). В подобных ситуациях подобрать имя дли интерфейса, как лраоило, несложно. Однако иногда вы вынуждены изрядно помучиться, прежде чем сможете обнаружить подходящую метафору.
Иногда в ситуации, когда вам нужно выделить интерфейс, вы используете Crasrt Test Dummy (Тестирование обработки ошибок) или другой поддельный обь- екг (Mock Object). В этом случае подбор подходящего имени выполняется сложнее, гак как и нашем распоряжении лишь один пример использования интерфейса. В подобных случаях у меня возникает соблазн наплевать на информативность и назвать ин герфейс Wte, а реализующий его класс - File. Однако я приучил себя останавливаться на мгновение и размышлять о том. достаточно ли хорошо я понимаю то. над чем работаю? Возможно, интерфейс лучше назвать File, а реализующий его класс - OiskFikr, так как соответствующая реализация основана на том. что данные, содержащиеся в файле, хранятся на жестком диске.
MOVE METHOD (ПЕРЕМЕЩЕНИЕ МЕТОДА)
Каким образом метод можно переместить в hodoc место, где он должен находиться? Добавьте его в класс, к которому он должен принадлежать, затем обратитесь к нему.
Как
Скопируйте метод в буфер обмена.
Вставьте метод в целевой класс. Присвойте ему подобающее имя. Отхом лидируйте его.
Если внутри метода происходит обращение к изначальному объекту, добавьте в метод параметр, при помощи которого внутрь метода будет передаваться изначальный объект. Если внутри метода происходит обращение к переменным*членам изначального объекта, передавайте их в виде пара метров. Если внутри метода перемен и ы м • членам изначального объекта присваиваются значения, вы должны отказаться от идеи переноса метода в новый объект.
Замените тело изначального метода обращением к новому методу.
Зачем
Эго один из моих самых любимых рефакторингов, выполняемых в процессе консультирования. Дело в том. что он наиболее эффективно демонстрирует исправил ьные предположения относительно дизайна кода.
Рефакторинг Move Method (Перемещение метода) обладает тремя важными преимуществами:
Очень легко увидеть необходимость применения этого рефакторинга. при этом не требуется глубокое понимание смысла кода. Как только вы увидите два иди больше сообщения, адресованных другому объекту, значит, можно смело приступать.
Механика выполнения рефакторинга быстра н безопасна.
Результаты зачастую приводят к просветлению. «Но масс Rectangle не выполняет никаких вычислений... О! Теперь я вижу. Так действительно лучше.»