看文送分之Java实现模拟路由功能

KeepSayingNo 2015-08-28 11:12:12
加精
大家可以看看下面这个实现,是否能找出bug,找出者多送分
http://blog.csdn.net/dotnetstudio/article/details/47206129
...全文
2434 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2015-09-16
  • 打赏
  • 举报
回复
引用 4 楼 dcxy0 的回复:
1.这样判断非空是特别不保险的,除非你能保证num和net不为空. if(num.isEmpty()||net.isEmpty()) { return false; } 2.如上,单从字面意思完全看不出来num是个啥?也可能是个数字... 3.如果你可以预估你大概会存多少项,可以给map传递一个值,map会先初始化好这么多空间: 比如 HashMap<String, String> routerInfoMap = new HashMap<String, String>(50);
你说的这三条很好,平时我写程序也都注意了,只是做例子没太注意。不过不你说的第一点,我已经对这两个变量初始化了,因此不需要判断空
KeepSayingNo 2015-09-16
  • 打赏
  • 举报
回复
引用 3 楼 mg2flyingff 的回复:
关于4: 其实你每次都new了一个新的对象,我的本意是讲一个对象被load两次规则的时候没有错误提示哦。 关于6: 比如新写个类com.discover.router.Test,在这个类中使用RouterService类的对象的时候可以直接访问它的成员routerInfoMap,当这个类有恶意的时候(比如它是其他人后编写的)就可以直接对这个成员做出任何修改(比如直接读取/修改信息,改变引用指向等等本来不应出现的操作)。这样是不安全的,故推荐使用private声明属性。 附送junit使用方法: 不用extends TestCase类,只需使用@Test、@Before、@After注解。它们分别代表具体的用例、每个用例执行前的准备工作,每个用例执行后的清除工作。你的测试用例中有重复的初始化代码(new对象),可以使用Before注解。
你提的这两点都非常好,我后期修改下,最近工作比较忙,没时间来搭理,基本上明白你说的意思了,非常感谢。
bazhipu97 2015-09-09
  • 打赏
  • 举报
回复
来看看的啊。。
skgary 2015-09-01
  • 打赏
  • 举报
回复
1. loadRule的时候没有加锁,你selRouter的时候用迭代器,多线程一改一迭代肯定异常。 2. 选择号码适配长度最长的网元为路由目的地:这个功能完全是依靠全部的规则遍历来实现的。是否应该把规则本身按长度排序,比如说10位一组,9位一组,而且是排好序的,然后按次序来呢? 3. selRouter的返回值,当没有命中的时候,返回一个""串,感觉不太好,为null的话应该更好一点。 4.unit test缺了 : 选择号码适配长度最长的网元为路由目的地的测试用例 5. 号段num和网元都不能重复 :loadRule代码中,似乎net是可以重复的吧。
gotopause 2015-09-01
  • 打赏
  • 举报
回复
不错不错,学习了
多木多多木 2015-08-31
  • 打赏
  • 举报
回复
楼主,bug楼上的都挑了,我就是想说这个做得挺棒的,思路很好。我学习了。
weikqan 2015-08-31
  • 打赏
  • 举报
回复
1、18888878887可以匹配888,也可以匹配887,而且你用的遍历hashmap不能保证哪个在前,这种不确定性是允许的还是不允许呢; 2、匹配好像不需要从头开始,这个是不是允许的呢; 3、loadrule被调用之前也可以调用selRouter而不报错; 4、loadrule两次是不是会有第一次的信息残留,也没有阻止第二次loadrule的机制; 5、对输入没有验证机制,无论是第一个或是第二个方法。它们报告异常(比如selRouter传入null)是不是允许的呢?不合理的输入(比如xml配置中num中出现字母)是不是允许的呢? 6、以上这些点JUnit测试都没有考虑到。。 7、我看到你的hashmap是包访问性的,可能被恶意修改/读取。
JPF1024 2015-08-31
  • 打赏
  • 举报
回复
1.这样判断非空是特别不保险的,除非你能保证num和net不为空. if(num.isEmpty()||net.isEmpty()) { return false; } 2.如上,单从字面意思完全看不出来num是个啥?也可能是个数字... 3.如果你可以预估你大概会存多少项,可以给map传递一个值,map会先初始化好这么多空间: 比如 HashMap<String, String> routerInfoMap = new HashMap<String, String>(50);
0萌萌哒0 2015-08-31
  • 打赏
  • 举报
回复
关于4: 其实你每次都new了一个新的对象,我的本意是讲一个对象被load两次规则的时候没有错误提示哦。 关于6: 比如新写个类com.discover.router.Test,在这个类中使用RouterService类的对象的时候可以直接访问它的成员routerInfoMap,当这个类有恶意的时候(比如它是其他人后编写的)就可以直接对这个成员做出任何修改(比如直接读取/修改信息,改变引用指向等等本来不应出现的操作)。这样是不安全的,故推荐使用private声明属性。 附送junit使用方法: 不用extends TestCase类,只需使用@Test、@Before、@After注解。它们分别代表具体的用例、每个用例执行前的准备工作,每个用例执行后的清除工作。你的测试用例中有重复的初始化代码(new对象),可以使用Before注解。
马七甲 2015-08-31
  • 打赏
  • 举报
回复
思路很好。学习了。。、,,,,,
KeepSayingNo 2015-08-30
  • 打赏
  • 举报
回复
引用 楼主 dotnetstudio 的回复:
大家可以看看下面这个实现,是否能找出bug,找出者多送分 http://blog.csdn.net/dotnetstudio/article/details/47206129
1、这个都可以匹配 2、第2个你说的没错,应该从头开始匹配,这样就解决了1的问题 3、如果先调用selRouter,没有得到规则应该就匹配不到了吧,不过最好还是先加载规则 4、这个应该没问题吧,你看我的测试用例每次都加载了规则 5、确实应该加入验证的功能 6、请问“hashmap是包访问性的,可能被恶意修改/读取”,请问这个是什么意思,能否详细解释下
0萌萌哒0 2015-08-29
  • 打赏
  • 举报
回复
你的需求写的不太明确,这样的话很多bug就变成了特性。。下面列出一些这样的“特性”: 1、18888878887可以匹配888,也可以匹配887,而且你用的遍历hashmap不能保证哪个在前,这种不确定性是允许的还是不允许呢; 2、匹配好像不需要从头开始,这个是不是允许的呢; 3、loadrule被调用之前也可以调用selRouter而不报错; 4、loadrule两次是不是会有第一次的信息残留,也没有阻止第二次loadrule的机制; 5、对输入没有验证机制,无论是第一个或是第二个方法。它们报告异常(比如selRouter传入null)是不是允许的呢?不合理的输入(比如xml配置中num中出现字母)是不是允许的呢? 6、以上这些点JUnit测试都没有考虑到。。 7、我看到你的hashmap是包访问性的,可能被恶意修改/读取。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧