процесс объектно-ориентированного проектирования

задняя часть Шаблоны проектирования

предисловие

Я всегда считал, что цель обмена не в том, чтобы хвастаться.

  • Во-первых, резюме самообучения.
  • Во-вторых, снизить стоимость обучения для других.
  • В-третьих, обзор другими людьми своих собственных результатов обучения.

В то же время это совместное использование имеет следующие четыре элемента:

Вид Точка зрения, которую разделили на этот раз, — это образ мышления в программной инженерии, не ограничивающийся языками программирования.
проводить исследования Возможно, я неправильно понял это, или вы, возможно, не поняли. Вы можете оставлять положительные комментарии, взаимодействовать как можно больше и стремиться к лучшему пониманию.
понимать Я очень надеюсь, что все понимают
использовать Самое главное, если вы найдете это полезным, обязательно сделайте это в реальном бизнесе.

задний план

На работе почти все часто жалуются на чужой код:

  • не могу изменить
  • высокое сцепление
  • Невозможно масштабировать

Сегодня мы обсудим, какпревосходитьВопрос выше~

Сцены

Сначала задайте вопрос:

В нашей повседневной работе есть бизнес-требования, как нам начать писать код?

Я думаю, что большинство людей, вероятно:

  • 1. Разберитесь с бизнесом
  • 2. Дизайн базы данных, интерфейса, кэша
  • 3. Обзор
  • 4. Так началось怎么怎么样...如果怎么怎么样...怎么怎么样...Удачного процесса кодирования

Кто-нибудь здесь видит проблему?

备注:说出来问题的,本次分享就可以略过了~

Простой бизнес-сценарий

比如产品提了个需求:
描述“我一个同事”一天的生活,简单来看看他一天干些啥:

1.0 饿了吃饭
1.1 到点吃饭

2.0 渴了喝水
2.1 到点喝水

3.0 困了睡觉
3.1 到点睡觉
3.2 有可能一个人睡觉,也有可能... 是吧?复杂

В начале прописывается бизнес-логика от начала до конца

Бизнес-логика (разделенная на несколько функций) написана от начала до конца:

Бизнес-логика (вводный урок) написана от начала до конца:

Бизнес-логика (разбитая на несколько методов класса) пишется от начала до конца, может быть, может быть, кажется, большинство людей остаются на этом этапе. Вопрос: Что мне делать, если однажды у меня будет больше социальных навыков?

Бизнес-логика (разделенная на несколько классов) написана от начала до конца:

Бизнес-логика (разбитая на классы, абстрактные классы, интерфейсы) пишется от начала до конца:

Думая 🤔: Есть ли проблема с приведенным выше кодом?

Вышеприведенный код является результатом объектно-ориентированного проектирования.

Итак, как проектировать полностью объектно-ориентированный код?

моделирование кода

Что такое моделирование кода?

Процесс абстрагирования бизнеса на вещи (классы, абстрактные классы) и поведения (интерфейсы).

Настоящий каштан 🌰 анализ

Давайте снова посмотрим на реальный бизнес-сценарий:

最近“我一个同事”开始创业了,刚创立了一家电商公司,B2C,自营书籍《3分钟学会交际》。最近开始写提交订单的代码。

⚠️注意场景 1.刚创业 2.简单的单体应用 3.此处不探讨架构

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

接口参数:
uid
address_id
coupon_id
.etc

业务逻辑:
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...

просто начните писать код怎么怎么样...如果怎么怎么样...怎么怎么样...Это можно сделать за ночь, с ясным мышлением и логикой, и код можно закончить быстро. Это отлично? Это стоит поощрения.

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

Мы начинаем моделирование на основе приведенного выше сценария.

Бизнес-анализ незаменим

Опять же, сначала, давайте посмотрим提交订单Что делать в этом бизнес-сценарии:

Взглянуть на бизнес под другим углом на самом деле очень просто: сгенерируйте заказ на основе информации, связанной с пользователем.

  1. Разберитесь с бизнес-логикой
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...
  1. Сортировка информации о зависимостях бизнес-логики
用户信息
商品信息
地址信息
优惠券信息
等等...

вернуться к концепции

Что такое моделирование кода? Процесс абстрагирования бизнеса на вещи (класс, абстрактный класс) и поведение (интерфейс).

получить вещи

Например, мы можем представить себе процесс генерации заказа как机器人, формирование заказа订单生成机器人, или машина генерации заказов или что-то в этом роде, так что мы получаем代码建模вещь в процессе.

Таким образом, мы можем превратить эту вещь в класс (или структуру) или абстрактный класс.

поведение приобретения

Эти операции выполняет описанный выше робот.

Вещи имеют:订单生成机器人А как насчет поведения? Нет сомнения, что это выше бизнес-логика. Абстрагируйте конкретное поведение в интерфейс поведения создания заказа:

получить UML

код дизайна

  1. определить класс

  1. Интерфейс, определяющий поведение при создании заказа

  1. Определить конкретные классы поведения при создании заказов
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...

  1. Создать заказ

Как должен быть написан код здесь, вот так?

Можем ли мы продолжить оптимизацию?

Используйте замыкания.

Полный код версии PHP

Полный код версии Go

В чем преимущество приведенного выше кода?

Если «мой коллега» хочет разработать новое приложение, новое приложение имеет новую логику при создании заказа, например, логику отсутствия скидок, новую логику для увеличения пользовательских баллов и т. д., повторно используйте приведенный выше код. Это очень просто .

Итак, что же такое объектная ориентация?

концепция

Принципы объектно-ориентированного проектирования

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

Для приведенной выше концепции давайте вернемся к нашему коду выше.

Программируйте интерфейс вместо реализации

结果:RobotOrderCreate依赖了BehaviorOrderCreateInterface抽象接口

Предпочитайте композицию объектов наследованию

结果:完全没有使用继承,多个行为不同场景组合使用

Абстракции используются для разных вещей, а интерфейсы используются для поведения вещей.

结果:
1. 抽象了一个创建订单的机器人 RobotOrderCreate
2. 机器人又有不同的创建行为
3. 机器人的创建行为最终依赖于BehaviorOrderCreateInterface接口

Идеально ли это подходит, так это «объектно-ориентированный процесс проектирования».

В заключение

代码建模过程就是“面向对象的设计过程”的具体实现方式.

предварительный просмотр

Шаблоны проектирования

Наконец, что такое шаблоны проектирования?

Точно так же мы объединяем приведенные выше сценарии и концепции для предварительного просмотра шаблона проектирования.

Принципы проектирования шаблонов проектирования

Принцип «открыто-закрыто»: открыт для расширения, закрыт для модификации

Посмотрите, подходит ли окончательный код выше.

Принцип инверсии зависимостей: программируйте интерфейс, опираясь на абстрактное, а не на конкретное.

结果:创建订单的逻辑从依赖具体的业务转变为依赖于抽象接口BehaviorOrderCreateInterface

Принцип разделения интерфейсов: используйте несколько интерфейсов вместо программирования одного интерфейса, чтобы уменьшить связанность, полагаясь на

结果:上面的场景,我们只简单定义了订单创建的接BehaviorOrderCreateInterface。由于订单创建过程可能出现异常回滚,我们就需要再定义一个订单创建回滚的接口
BehaviorOrderCreateRollBackInterface.

Закон Деметры, также известный как принцип наименьшего знания: уменьшайте внутренние зависимости и будьте как можно более независимыми.

结果:还是上面那段代码,我们把RobotOrderCreate机器人依赖的行为通过外部注入的方式使用。

Принцип повторного использования композиции: несколько независимых сущностей составляют агрегаты вместо использования наследования.

结果:RobotOrderCreate依赖了多个实际的订单创建行为类。

Замена Лискова: там, где появляется суперкласс (родительский класс), может появиться производный класс (подкласс).

结果:不好意思,我们完全没用继承。(备注:继承容易造成父类膨胀。)

следующее уведомление

Концепция паттернов проектирования была рассмотрена выше, в следующий раз мы проведем «Бизнес-практику паттернов проектирования».