淄博网站关键词优化,福建建设执业资格注册管理中心网站,怎么把做网站发给别人,深圳餐饮公司网站制作广大程序猿同胞#xff0c;经常会看到“解耦合”#xff0c;也有很多人#xff0c;会用这个词来装X#xff0c;但是#xff0c;实际真正能理解的人#xff0c;并不多。接下来#xff0c;带大家深入浅出的走一遍#xff0c;如何解耦合。
首先#xff0c;我们要知道经常会看到“解耦合”也有很多人会用这个词来装X但是实际真正能理解的人并不多。接下来带大家深入浅出的走一遍如何解耦合。
首先我们要知道为什么要解耦合通常我们做一个项目会用到很多基础功能块比如xxx通信协议xxxView等等我们会把这种功能块封装成一个库如果这个库只能在这个指定的项目运行这就叫高耦合这就导致了如果下次再次遇到一个类似的项目需要用到同样功能的功能块时你会要做很多重复工作。假设每次使用json时你都要对json库进行改造那将会是一个晴天霹雳。
但是事与愿违有些情况还真的不太好解耦。
这里我们先举个栗子比如排序。
一个排序功能对于大部分比较初级的程序猿来说可能会写成这样 sort(ListInteger list)这样就导致了一个问题所在这个方法只能排序int型数据如果下一个项目需要用到对String进行排序那就很尴尬感觉明明要成功了但是又差一点。对就是差这一点就是代码解耦的关键。
我们先要明确我们需要做的是排序功能在这个过程中我们不可避免的需要使用2个数据的大小对比而这个数据可能是任何数据也就是说排序算法我们是可以确定下来做成不动的库但是有一个数据大小匹配是我们无法做到的或者说是库的耦合点那怎么办呢
我们就让使用我们这个功能块的人告诉我们就行啦。
下面我们参考Android库里面有个排序的api Collections.sort(ListT list, Comparator? super T c);这里Comparator这个接口就是使用者需要实现并且传递进去的接口。这样做这个排序功能块就可以应用在任何场合达到一次开发受用终身的目的。是不是很神奇
我们再举个栗子socket
我们在开发时经常会用到socket库而socket最常用最常用的一个功能就是“连接-发送数据-接收数据-断开连接-回调结果”
所以如果需要把这个流程封装成一个功能块是很有意义的。
但是这里有一个问题是阻碍封装的就是 “接收数据-断开连接”socket读取数据时是一个inputStream是个流也就是说其实你并不知道数据怎么样才算接收 完整/完毕
可能有的协议是通过头2个字节来判断整个数据长度可能有的协议是有帧头帧尾转义符来判断整个数据长度……这让我们很头疼那怎么 解决了既然无法知道的东西就让应用程序来告诉你呗。和上面一样传入一个协议实现呗 public interface UnZipDataAction{// 返回null表示未接收完全继续接收返回完整的byte[]就认为是已经接收完毕把结果返回给应用并且断开连接byte[] getRealData(byte[] recvData); ErrorCode getErrorCode(); }这样我们就把“连接-发送数据-接收数据-断开连接-回调结果”整个流程封装成了通用的功能块了。
解耦总结来说就是你能知道的东西就写死不知道但是又必须知道的东西就让应用程序来告诉你在java里面叫接口在有些语言OC, swift, C/C里面叫做代码段。