• Stars
    star
    1,147
  • Rank 40,664 (Top 0.9 %)
  • Language
  • License
    Creative Commons ...
  • Created over 4 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

代码防腐实用技术

https://autonomy.design

症状

如果没有做好业务逻辑拆分,可能在项目晚期造成以下三种问题:

  • 拆了微服务之后做一个需求要拉很多人,代码写进来了就再也删不掉了
  • 要么放任自流,1个App里有4种日期选择方式。要么用力过猛,抽象出来的营销接口动辄几百个参数
  • 线上出了问题很难定位到谁引起的,本地做不了任何有意义的测试,反馈周期特别长

为何随机选择了这三种问题并归纳为业务逻辑拆分问题呢? 因为我认为以上三种问题都是由同一个不易变化的本质约束所造成。这个本质约束就是人类的感知与沟通速度是很慢的。 所谓业务架构,其实质就是想尽一切办法减少沟通。只有沟通少,效率才会高,质量才会好。就是这么简单的一件事情。

代码腐化

没有哪份代码一开始是不想好好写的。大家在开始落笔之前都知道会出现上述三种症状,并且都自认为做好了设计去避免这些问题。然而往往事情的发展不是如自己所想的那样。我们可能会把代码腐化归咎于自己不够努力,或者需求太多了做得太匆忙。如果当初更用心一点就不会这样。是吗?

如果你带了一个新人,他可能会问你“我这个需求的代码应该写在哪个Git仓库里?”。然后你会根据你的直觉做出一个判断。这种高度依赖于某个人“我觉得”的决策模式是长久不了的。只要摆放代码严重依赖于某个人的判断,腐化就是无法阻挡的趋势。那有没有什么办法可以像“防腐剂”那样,在一开始的时候放进去,然后就可以保持很长时间的“新鲜”呢?

实现方案也不复杂,代码分成两部分。可以随便乱写的,和不能随便乱写的,这两部分。不知道“组合代替继承”的小朋友,只能在可以随便乱写的那部分里发挥。如果大部分代码量都在“可以随便乱写”的那部分里,那么只要很少的人就可以看住“不可随便乱写”的那部分。

说简单也不简单,怎么做到呢?

你说的东西可以落地吗?

大部分人的日常工作都是维护一个已有的项目,没有几个人能够参与到 Greenfield 项目的初始设计阶段。这也是大部分读者所懊恼的地方,“我读你的东西有什么用,我这项目就已经烂成了这个样子了,我也改不了”。我希望能够出一些可度量的指标。这样对于现有的项目,我们可以拿这些指标去度量这些问题有多严重。 当下次别人问你微服务为什么这么拆,而不是那么拆的时候,你可以给出令人信服的理由,而不是“我觉得”。

我不是销售像 Angular 那样可以直接 git clone 一份的代码框架给你。我想分享的是一套可以适用于任何语言和框架的分解业务逻辑的套路。从《Clean Architecture》和《Domain Driven Design》你应该已经学到了很多了。如果仍然不会拆,那么可以再读读《业务逻辑拆分模式》试试。

RSS 订阅【今日阅读】

https://github.com/taowen/modularization-examples/commits.atom

More Repositories

1

awesome-lowcode

国内低代码平台从业者交流
13,236
star
2

es-monitor

query metric from elasticsearch using sql
Python
262
star
3

vite-howto

Modularization best practice to common web development scenarios, applies to vue/react/... any framework
TypeScript
171
star
4

12fallacy

打造杰出软件开发团队的12条指导建议
83
star
5

awesome-debugger

record & replay or time travel debugging
61
star
6

define-function

quick.js based eval
JavaScript
36
star
7

go-php7

bind php7 to go environment
Go
34
star
8

modern-cpp-howto

C++
28
star
9

toolchain

km of toolchain
Java
18
star
10

motrix

alternative reality
Go
17
star
11

learn-llama

my personal learning log
Python
14
star
12

vue-component-preview

preview individual vue component without running the full application
Vue
14
star
13

awesome-html

collection of "html over the wire" libraries
12
star
14

vite-ioc-demo

Inversion of Control (IoC) via vite in build time, a simple yet powerful way to modularize code
TypeScript
10
star
15

tsdb-book

9
star
16

repo-to-prompt

combine source code files into single prompt to chat with your repository
JavaScript
8
star
17

sslcode

start a https protected coding environment
JavaScript
7
star
18

vue-db

Get rid of as many mutable states as possible
TypeScript
5
star
19

daili

proxy based on java kilim coroutine
Java
4
star
20

vue-fusion

微信小程序的 SSR / OTA / HMR 解决方案,用熟悉的 Vue + TSX 写界面
TypeScript
3
star
21

readable

examples of readable code
Java
3
star
22

lambdafs

apply a lambda on your file system
Go
3
star
23

colorfour

real world business process modeling
Go
3
star
24

bayberry

Complement test frameworks with dependency injection, data injection and test helpers
Java
3
star
25

pythonic-modern-cpp

Collection of modern c++ code examples for python developers
C++
3
star
26

go-libc

intercept libc networking call to golang netpoller
C
2
star
27

plug-and-play

即插即玩的游戏掌机,可用 usb 接任意的设备当游戏主机
2
star
28

emscripten-howto

demo emscripten usage
JavaScript
2
star
29

refactor-by-example

TypeScript
2
star
30

wasm3.js

compile wasm3 using emscripten
C
1
star
31

react-sui-l0vyg3uq

Technology Sample you can rely on to build your own Design System, based on React and a System UI theme (Theme UI | styled-components).
TypeScript
1
star
32

game-of-life

Go
1
star
33

awesome-bayesian-approximation

algorithms to approximate the likelihood function in situations where its analytic form is intractable
1
star
34

incremental-html

update ui incrementally with html
TypeScript
1
star