Rails 请教重复代码的组织问题

night_7th · 2017年05月31日 · 最后由 night_7th 回复于 2017年06月07日 · 2110 次阅读

我们组的情况是这样的,我们根据【面向的用户】区分,将项目划分为对内/对外两个项目,这两个项目共用一个数据库。对外项目主要负责外部用户提交需求,对内项目包括内部工程人员处理需求和一些管理员相关的功能。

随着代码的积累和增长,对内/对外项目中出现了许多重复的代码:包括 models/helpers/views 里的诸多文件。比较典型的是一个报告展示页面(对内工程师需要审核报告后发布给外部用户看,因此对内/对外都需要报告展示),报告展示功能涉及到两个工程中许多 model/helper,这些对象中的绝大多数方法都是重复的。

为了解决代码重复的这个困扰,我们引入了git subtree功能,将重复的 model/helper 移动到了对外项目的一个共享文件夹。可是渐渐又出现了一个困惑:可能某个同学只是需要修改对内项目的某个功能,却需要在对外项目中去修改代码,然后上线时同时更新对内/对外两个项目的代码。而且由于git subtree的使用经验不足,经常会出现各种奇怪的报错。也有同学担心改动出错影响到两个项目,不敢轻易去改共享文件夹中的代码。

我自己整理了下目前的几点困惑/思路:

  • git subtree 的使用姿势是不是有问题
  • 将对内/对外两个项目合并,可以减少重复代码,但是项目体积又会膨胀
  • 服务拆分,或者微服务的思路

这样类似的问题社区中的一些同学也许遇到过、实践过。想请教大家分享/探讨下类似问题的解决思路。

公共的抽离出来做成 gem

我使用 subtree 的时候,也遇到了 A 项目一修改,B 项目合并就冲突的情况。 后来,我就放弃了 subtree,使用了 submodule

公共核心的为主,其他的 fork 呢?

微服务也不一定适合,从两个版本的代码变成了两个版本的微服务

@dudu_zzzz 我记得以前看过一篇分享,是说拆出来做成 Rails Engine

@breeze subtree 据说就是改进 submodule 弄出来的概念啊

@tonyrisk 没听明白具体怎么做

@nouse 例如将报告展示这种功能拆分出来做成一套服务,供对内/对外调用。但其实也不是彻底的微服务,因为数据库又不独立。

night_7th 回复

可能我使用 subtree 的姿势也有问题。但是你也可以试试 submodule,我现在使用 submodule 用的还挺顺手的。

公共部分抽成 engine 比较好,如果是同构的两套系统的话,不过如果一直没有往这边考虑的话,那重构起来可能要花点时间

我觉得要不不要拆,要不拆彻底。拆两个项目共用数据库和代码只会导致混乱。

如果隔离不了,就不要拆两个项目,后面修改维护成本远远超过拆分带来的好处。

@jasl 之前相关同学已经尝试重构过一次了,就是 git subtree 的方案

@Rei @kgen 目前的现状来看,想彻底地拆,不共用数据库很难了。感觉单纯地根据面向的用户将项目分为【对内项目】和【对外项目】并不是很合理。根据读过的一些服务拆分的文章来看,一般都是先确定功能边界后再拆。

试过用 engine 解决代码复用,但是同样增加了维护成本。可以参考前后端分离的思路,把简单的那个项目变成调用另一个项目的 api

embbnux 回复

这种调用 API 的方式改造成本也不小哎,除非两个项目原本就都是前后端分离的。

而且前端直接请求 API 的话,需要处理跨域/登录等;后端请求的话,需要处理请求超时等问题。

是否可以从业务上考虑,直接做成一个项目,对内对外只是权限不同,这样就没有重复代码了😄

beyondyuqifeng 回复

是滴,不过打算短期内不折腾了,没人手干活了 😀

需要 登录 后方可回复, 如果你还没有账号请 注册新账号