欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

静态方法 - php 代码重构疑惑,求解答

程序员文章站 2022-03-11 13:32:58
...
刚写完一个后台的一部分功能,现在打算重构一下代码,但是有些疑问,不知道该怎么处理了。

功能描述:
1.用户下面有设备和分组,设备可以被分组,然后分组之间的设备可以相互透传数据。设备上线,查找redis有没有缓存过用户、分组、设备,如果缓存过只是简单更新一下缓存的个别数据,如果没有那么先从数据库里面查找,查找后redis缓存。
2.现在是分别用UserCache、GroupCache、DeviceCache 三个类,实现缓存的读写,UserDB、GroupDB、DeviceDB三个类实现数据库的读写。且它们的方法都是静态方法,在Server中直接调用它们的方法。

重构:现在想把Cache层和DB层再封装一下,例如DeviceDataHandler 封装DeviceCache和DeviceDB,在Server中直接调用DeviceDataHandler进行设备数据存取方面的处理。

例如: Server中收到一个设备上线数据,现在处理是 
(1)Server先调用DeviceDB的getDeviceInfo方法从数据库里取设备信息.
(2)Server再调用DevieCache的cacheDeviceInfo方法缓存数据。 
现在想Server直接用DeviceDataHandler 的 deviceOnLineMsg()方法完成上面两步的处理。

疑惑:1.Cache层和DB层中都会有一些静态方法,如果在Server中统一只调用DataHandler方法处理数据,那么会导致DataHandler中有些方法只是对Cache层和DB层方法的简单调用,这样反而增加了工作量,并没有其它的作用。 那么我是保持现状不重构了,还是重构到DataHandler中,让DataHandler作为数据存取的对外接口?
2:如果封装到DataHandler中还是用静态方法吗? 那么就是DataHandler中是静态方法,Cache、DB层也是静态方法, 我该如何封装?

回复内容:

刚写完一个后台的一部分功能,现在打算重构一下代码,但是有些疑问,不知道该怎么处理了。

功能描述:
1.用户下面有设备和分组,设备可以被分组,然后分组之间的设备可以相互透传数据。设备上线,查找redis有没有缓存过用户、分组、设备,如果缓存过只是简单更新一下缓存的个别数据,如果没有那么先从数据库里面查找,查找后redis缓存。
2.现在是分别用UserCache、GroupCache、DeviceCache 三个类,实现缓存的读写,UserDB、GroupDB、DeviceDB三个类实现数据库的读写。且它们的方法都是静态方法,在Server中直接调用它们的方法。

重构:现在想把Cache层和DB层再封装一下,例如DeviceDataHandler 封装DeviceCache和DeviceDB,在Server中直接调用DeviceDataHandler进行设备数据存取方面的处理。

例如: Server中收到一个设备上线数据,现在处理是 
(1)Server先调用DeviceDB的getDeviceInfo方法从数据库里取设备信息.
(2)Server再调用DevieCache的cacheDeviceInfo方法缓存数据。 
现在想Server直接用DeviceDataHandler 的 deviceOnLineMsg()方法完成上面两步的处理。

疑惑:1.Cache层和DB层中都会有一些静态方法,如果在Server中统一只调用DataHandler方法处理数据,那么会导致DataHandler中有些方法只是对Cache层和DB层方法的简单调用,这样反而增加了工作量,并没有其它的作用。 那么我是保持现状不重构了,还是重构到DataHandler中,让DataHandler作为数据存取的对外接口?
2:如果封装到DataHandler中还是用静态方法吗? 那么就是DataHandler中是静态方法,Cache、DB层也是静态方法, 我该如何封装?

个人认为
1.有必要封装,你前面说道

设备上线,查找redis有没有缓存过用户、分组、设备,如果缓存过只是简单更新一下缓存的个别数据,如果没有那么先从数据库里面查找,查找后redis缓存。

那么这个逻辑 应该在DataHandler 中处理,你向外部暴露的应该只是获取设备的信息就可以了,外部应用不应关心你是否用了缓存或者用什么缓存,是redis还是别的.这样将来即使你存取缓存的逻辑变了也可以不用修改外部代码,比如不用db了,直接在redis落地或者其他什么方案

2.是否使用静态方法和你这个问题好像关系不大,你先搞清楚你为什么使用静态方法.因为你只给了局部信息,我没法判断你是否有使用静态方法的必要.再者如果必须使用 可以在DataHandler 中使用静态方法.后面的Cache,DB就没必要使用了,因为他们的接口不对外提供访问仅供 DataHandler 访问而已