предисловие
Я всегда считал, что цель обмена не в том, чтобы хвастаться.
- Во-первых, резюме самообучения.
- Во-вторых, снизить стоимость обучения для других.
- В-третьих, обзор другими людьми своих собственных результатов обучения.
В то же время это совместное использование имеет следующие четыре элемента:
Вид | Точка зрения, которую разделили на этот раз, — это образ мышления в программной инженерии, не ограничивающийся языками программирования. |
---|---|
проводить исследования | Возможно, я неправильно понял это, или вы, возможно, не поняли. Вы можете оставлять положительные комментарии, взаимодействовать как можно больше и стремиться к лучшему пониманию. |
понимать | Я очень надеюсь, что все понимают |
использовать | Самое главное, если вы найдете это полезным, обязательно сделайте это в реальном бизнесе. |
задний план
На работе почти все часто жалуются на чужой код:
- не могу изменить
- высокое сцепление
- Невозможно масштабировать
Сегодня мы обсудим, какпревосходитьВопрос выше~
Сцены
Сначала задайте вопрос:
В нашей повседневной работе есть бизнес-требования, как нам начать писать код?
Я думаю, что большинство людей, вероятно:
- 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
业务逻辑:
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...
просто начните писать код怎么怎么样...如果怎么怎么样...怎么怎么样...
Это можно сделать за ночь, с ясным мышлением и логикой, и код можно закончить быстро. Это отлично? Это стоит поощрения.
Однако результатом всего вышесказанного, вероятно, являются тысячи строк кода подряд, которые все видели, и так далее. В описанном выше процессе нет ничего плохого, как правильно? вот что происходитмоделирование кода.
Мы начинаем моделирование на основе приведенного выше сценария.
Бизнес-анализ незаменим
Опять же, сначала, давайте посмотрим提交订单
Что делать в этом бизнес-сценарии:
Взглянуть на бизнес под другим углом на самом деле очень просто: сгенерируйте заказ на основе информации, связанной с пользователем.
- Разберитесь с бизнес-логикой
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...
- Сортировка информации о зависимостях бизнес-логики
用户信息
商品信息
地址信息
优惠券信息
等等...
вернуться к концепции
Что такое моделирование кода? Процесс абстрагирования бизнеса на вещи (класс, абстрактный класс) и поведение (интерфейс).
получить вещи
Например, мы можем представить себе процесс генерации заказа как机器人
, формирование заказа订单生成机器人
, или машина генерации заказов или что-то в этом роде, так что мы получаем代码建模
вещь в процессе.
Таким образом, мы можем превратить эту вещь в класс (или структуру) или абстрактный класс.
поведение приобретения
Эти операции выполняет описанный выше робот.
Вещи имеют:订单生成机器人
А как насчет поведения? Нет сомнения, что это выше бизнес-логика. Абстрагируйте конкретное поведение в интерфейс поведения создания заказа:
получить UML
код дизайна
- определить класс
- Интерфейс, определяющий поведение при создании заказа
- Определить конкретные классы поведения при создании заказов
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...
- Создать заказ
Как должен быть написан код здесь, вот так?
Можем ли мы продолжить оптимизацию?
Используйте замыкания.
Полный код версии PHP
Полный код версии Go
В чем преимущество приведенного выше кода?
Если «мой коллега» хочет разработать новое приложение, новое приложение имеет новую логику при создании заказа, например, логику отсутствия скидок, новую логику для увеличения пользовательских баллов и т. д., повторно используйте приведенный выше код. Это очень просто .
Итак, что же такое объектная ориентация?
концепция
Принципы объектно-ориентированного проектирования
- Программируйте интерфейс вместо реализации
- Предпочитайте композицию объектов наследованию
- Абстракции используются для разных вещей, а интерфейсы используются для поведения вещей.
Для приведенной выше концепции давайте вернемся к нашему коду выше.
Программируйте интерфейс вместо реализации
结果:RobotOrderCreate依赖了BehaviorOrderCreateInterface抽象接口
Предпочитайте композицию объектов наследованию
结果:完全没有使用继承,多个行为不同场景组合使用
Абстракции используются для разных вещей, а интерфейсы используются для поведения вещей.
结果:
1. 抽象了一个创建订单的机器人 RobotOrderCreate
2. 机器人又有不同的创建行为
3. 机器人的创建行为最终依赖于BehaviorOrderCreateInterface接口
Идеально ли это подходит, так это «объектно-ориентированный процесс проектирования».
В заключение
代码建模过程就是“面向对象的设计过程”的具体实现方式.
предварительный просмотр
Шаблоны проектирования
Наконец, что такое шаблоны проектирования?
Точно так же мы объединяем приведенные выше сценарии и концепции для предварительного просмотра шаблона проектирования.
Принципы проектирования шаблонов проектирования
Принцип «открыто-закрыто»: открыт для расширения, закрыт для модификации
Посмотрите, подходит ли окончательный код выше.
Принцип инверсии зависимостей: программируйте интерфейс, опираясь на абстрактное, а не на конкретное.
结果:创建订单的逻辑从依赖具体的业务转变为依赖于抽象接口BehaviorOrderCreateInterface
Принцип разделения интерфейсов: используйте несколько интерфейсов вместо программирования одного интерфейса, чтобы уменьшить связанность, полагаясь на
结果:上面的场景,我们只简单定义了订单创建的接BehaviorOrderCreateInterface。由于订单创建过程可能出现异常回滚,我们就需要再定义一个订单创建回滚的接口
BehaviorOrderCreateRollBackInterface.
Закон Деметры, также известный как принцип наименьшего знания: уменьшайте внутренние зависимости и будьте как можно более независимыми.
结果:还是上面那段代码,我们把RobotOrderCreate机器人依赖的行为通过外部注入的方式使用。
Принцип повторного использования композиции: несколько независимых сущностей составляют агрегаты вместо использования наследования.
结果:RobotOrderCreate依赖了多个实际的订单创建行为类。
Замена Лискова: там, где появляется суперкласс (родительский класс), может появиться производный класс (подкласс).
结果:不好意思,我们完全没用继承。(备注:继承容易造成父类膨胀。)
следующее уведомление
Концепция паттернов проектирования была рассмотрена выше, в следующий раз мы проведем «Бизнес-практику паттернов проектирования».