Проектирование сложных систем

После изучения объектов, одна из крайностей, в которую бросаются программисты — везде внедрять объектный подход. Это следствие получения новых знаний без умения их применить на практике. Итак, давайте рассмотрим основные этапы проектирования программных продуктов.

Основан работы — программный проект

Для начала ответьте на вопрос: Что программный продукт(ПП) должен делать?. Затем попытайтесь определить пользователей ПП. Что они ожидают от проекта, как будут с ним взаимодействовать. После определения способов взаимодействия можно понять входные и выходные данные программного проекта и установить связь между участниками. Под участниками будем понимать как реальных пользователей проекта, так и части проекта, которые взаимодействуют между собой.

Части проекта в контексте ООП являются классами и объектами. Одной из важных задач является определение взаимодействия между классами, объектами, методами объектов в контексте проекта.

Два подхода к программированию: объектно-ориентированное и процедурное

Наличие объектов в коде не является показателем ООП. Также, наличие функций не делает из объектного подхода процедурное программирование. В чем основное отличие объектно-ориентированного кода от процедурного? В принципе работы и разделения действий.

Принцип процедурного программирования:

  1. Формулируем задачу
  2. Разбиваем задачу на мелкие подзадачи
  3. Создаем процедуры для решения подзадач
  4. Объединяем процедуры в более сложные (пишем управляющий код)
Подобный подход оправдан для простых задач. Сложности выступают при работе в команде, либо разработке сложного проекта. Учитывая, что процедуры не регламентированы, то задача разбора кода становится не тривиальной. Здесь на выручку приходит объектный подход. В самом примитивном случае, объекты дают возможность кластеризации методов, что значительно облегчает понимание структуры и поиск ошибок. Посмотрите на структуру ниже, даже такой примитивный подход позволяет упростить структуру проекта.

Это реализация модульного подхода. Основное отличие процедурного подхода от ОО в том, что процедурный подход занимается деталями, ОО работает с интерфейсом не обращая внимание на реализацию деталей.

Рассмотрим, какие особенности написанного кода необходимо учитывать при разработке проекта:

Связность

Связность — это степень взаимодействия процедур между собой. В идеальном варианте процедуры должны взаимодействовать явным образом. Чем больше связанность, тем сложнее сопровождать и изменять код. Процедурный подход имеет предрасположенность к связности кода.

Тесная связь

Ситуации когда части кода связаны между собой настолько, что изменение в одной части кода ведет к необходимости изменения в другой части кода. Добавление или изменение функций, приводит к необходимости пересмотра всего кода. На определенном этапе требуется полный рефакторинг кода.

В ООП классы отделены друг от друга. Если необходимо внести изменения — создаем новый класс. Преимуществами ООП является: рефакторинг, повторное использование, расширяемость, поддержка, эффективность

Ортогональность

Ортогональность кода определяется четко разделенными обязанностями, наличием определенных входных и выходных данных, не зависящих от контекста. Ортогональный код легко поддерживать, модифицировать, развивать. Ортогональный код безопаснее, ошибки локализуются в контексте классов.

Итак, возникает вопрос — как построить правильный код? Начнем с рассмотрения классов которые должны быть в системе.

Определение классов

Основная проблема при создании классов — не перегрузить их и обеспечить правильное определение границ классов. Так, в примере с интернет-магазином, все классы можно условно разделить на две части:

  • классы управления магазином (админ-панель)
  • классы реализующие витрину и процесс покупки (интерфейс пользователя)

Следует помнить, что нет универсальных советов по разработке классов. Только опытным путем возможно решение данной проблемы. Есть несколько уловок, которые помогают понять, что реализация кода не идеальна и требует пересмотра подходов к созданию классов и объектов:

  • Дублирование кода — если код постоянно дублируется — вынесите его в один класс и перестройте структуру.
  • Не создавайте в классе много действий и данных. Если ваш класс содержит огромное количество методов и свойств, то скорее всего это не класс, а обвертка над кодом.
  • Огромное количество методов в классе — повод задуматься и реализовать подклассы
  • Огромное количество проверок с помощью if. Возможно данный функционал лучше выразить в классах?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *