以防止你没见过代码能写的多屎

7 条回复
126 次浏览

https://gist.github.com/eq1024/efb38f1b5e8760853c60f0b89f9bd1d7

就是一个筛选条件(支持动态隐藏/显示) + 表格 能干到 3500 行

改他的 bug 简直想吃赤石 😆

AI 评价如下:

这代码确实写得令人发指,完全是“CV 工程师”(Ctrl+C / Ctrl+V)的典型反面教材。你说得太对了,这就是典型的用战术上的勤奋(疯狂复制粘贴)来掩盖战略上的懒惰(缺乏抽象思维)

我来给你犀利地剖析一下这坨代码到底有多“屎”,以及它是如何把简单问题复杂化的:

1. 模板层面的“屎山堆积” (Template Bloat)

从第 61 行到 323 行,整整 260 多行 代码,全是在重复写同一个逻辑:Tag 包裹 FormItem 包裹 SelectInput

  • 症状:为了加一个筛选条件(比如“产品分类”),开发者需要手动复制一段 HTML,改一下 v-show 的 ID(比如 20),改一下 label,改一下 v-model
  • 后果:代码极度冗余,可读性极差,维护成本极高。Vue 的 v-for 是被吃了吗?

2. 逻辑层面的“Switch 地狱” (Switch Statement Hell)

为了配合模板里那些硬编码的 Magic Number(2, 3, ... 20),JavaScript 部分写了令人窒息的 switch-case

  • 案发地点 1 (tagCloseHandle):第 1446 行。为了重置一个查询字段,写了 50 行的 switch。
  • 案发地点 2 (selectSearchVal):第 1175 行。为了回显搜索条件,又写了一遍 switch,把字段名映射回 Magic Number。
  • 案发地点 3 (savedSearch):第 1268 行。为了保存搜索条件,第三次写了同样的 switch。
  • 评价:这完全违背了 DRY (Don't Repeat Yourself) 原则。如果要加第 21 个筛选条件,你得在四个不同的地方改代码,漏改一个就是 Bug。

3. 数据结构的“脑死亡”

代码里充斥着 17, 18, 2 这种毫无意义的数字。

  • defaultFilter.includes(17) 是什么意思?上帝才知道 17 代表 ai_qa_status
  • 这种硬编码的映射关系散落在代码的各个角落,而不是集中在一个配置对象里管理。

如何用“一个 JSON + 2 个循环”重构?

正如你所说,这本该是 100 行以内解决的事情。

1. 定义配置 (The JSON):
把所有筛选条件抽象成一个数组配置。

复制
// data 中定义
filterConfig: [
  { id: 2, key: 'status', label: 'status', type: 'select', options: [...] },
  { id: 3, key: 'initiation_method', label: 'initiation_method', type: 'select', options: [...] },
  { id: 7, key: 'customer_name', label: 'customer', type: 'input' },
  // ... 其他所有字段
]

2. 模板循环 (Loop 1):
模板里那 260 行垃圾代码直接删掉,换成这几行:

复制
<Tag 
  v-for="conf in filterConfig" 
  :key="conf.id" 
  v-if="defaultFilter.includes(conf.id)" 
  closable 
  @on-close="handleClose(conf)"
>
  <div class="headLine3_select">
    <FormItem :label="$t(conf.label)">
      <!-- 动态组件渲染 Input 或 Select -->
      <component 
        :is="conf.type === 'select' ? 'Select' : 'Input'" 
        v-model="query[conf.key]" 
        @on-change="ccCaseLogListPage(1)"
        clearable
      >
         <!-- 如果是 Select,再加个内层循环渲染 Options -->
         <Option v-for="opt in conf.options" :value="opt.value" :key="opt.value">{{ opt.label }}</Option>
      </component>
    </FormItem>
  </div>
</Tag>

3. 逻辑循环 (Loop 2):
那三个巨大的 switch 语句全部可以被简单的映射查找取代。

例如 tagCloseHandle 可以重构为:

复制
handleClose(conf) {
  this.query[conf.key] = ''; // 动态重置
  const index = this.defaultFilter.indexOf(conf.id);
  if (index > -1) this.defaultFilter.splice(index, 1);
  this.ccCaseLogListPage();
}

回显和保存逻辑:
直接遍历 filterConfig,根据 key 查找对应的 id,一行 find 代码解决战斗,根本不需要 switch。

总结

这代码写得就像是按行计费的。重构后至少能删掉 400-500 行 代码,逻辑清晰度提升 10 倍。原作者不仅在浪费公司的存储空间,更是在侮辱后续维护者的智商。

种子用户

从另一种角度来说,如果 ta 写的很好,那可能不会招你来了噢doge

直接全删了,自己重构一下吧。几千行的代码确实看得头的大了

种子用户

这算是高级的屎山代码写法了,有些低级的你看了就会质疑:这他妈也能跑起来?结果确实能跑起来facepalm

种子用户

虽然我不知道他的目的是什么?但是我想他写的这么复杂总是有目的的smirk

{
contentmd: '',
caseLogInfo: {},
tableLoading: false,
showMD: false,
expandColumns: [],
// expandData: [],
Data: {
data: [],
columns: [],
updateTime: '',
page: {
current: 1,
total: 0
}
},
// initColumns: [
// ],
showImgList: false,
imgList: [],
showNote: false,
invalidId: null,
chooseData: [],
chooseIds: [],
loading: false,
batchLoading: false,
judgeLoading: false,
query: {
ai_qa_status: '',
keyword: '',
status: '',
initiation_method: '',
start: '',
end: '',
not_case_log: '',
not_agent: '',
limit: 25,
case_result: '',
priority: '',
customer_name: '',
customer_phone_number: '',
customer_email: '',
product_model: '',
purchase_channel: '',
out_of_hours: '',
service_read: '',
multistage_issue_type: '',
attributes_channel: '',
issue_type: ''
},
timeArea: null,
showEdit: false,
editData: {},
styles: {
height: 'calc(100% - 55px)',
overflow: 'auto',
paddingBottom: '120px',
position: 'static'
},
showRecord: false,
showAdd: false,
showSelectServiceModal: false,
allServiceList: null,
selectedCarrier: {},
orderNo: '',
exportData: {},
caseResultList: [],
priorityList: [],
spinShow: false,
serviceReadStatus: '',
quickSearchKeyword: '',
showSearchWordModal: false,
deepData: [],
// 默认展示筛选条件
defaultFilter: [],
// 接口获取搜索关键词
searchKeys: [],
// 展示字段
showField: false,
// 列表已选展示字段
selectedField: [],
// 缓存搜索默认对应展示字段
cacheSelectedField: [],
// 搜索列表
searchList: [],
// 当前选择搜索条件
curSearchVal: '',
// 当前点击删除搜索关键词 id
curDelSearchId: '',
showDelTips: false,
// 获取全部字段
allListField: [],
// 缓存全部字段
cacheAllListField: [],
// copy 展示字段
columnsCopy: [],
dragOptions: {
animation: 500,
scroll: true
},
// 系统电话
caseLogDetailSystemPhone: '',
selectProblem: [],
problemTypeMulitList: []
}

这个 data 给我看瞎了

发表一个评论

R保持