2014-10-08 93 views
0

在处理一些代码库时,我试着理解一段代码以便能够工作和定制它,我能够理解近90%的代码流。这里是整体流程了解一段Java代码

  1. 码被用来生成15位代码(字母数字),前3位是客户提供。
  2. 最初代码是生成16位数的字母数字数字并将其存储在缓存中。
  3. 客户可以通过指定数量生成任意数量的代码。
  4. 所有客户生成的代码都是从16位数字(点2)生成的。所有生成的代码都有来自该16位数字字母数字的数字/字母。
  5. 当有人试图使用这些代码时,系统试图验证提供的代码是否有效。

我触击了在用于确定是否所提供的代码是否有效,这里的逻辑是,一段代码,我被生成并存储在生成6个码作为样品,在这种情况下的字母数字代码高速缓存是

initial-alphabet : M9W6K3TENDGSFAL4 

代码来生成基于initial-alphabet是 myList中= [123-MK93-ES6D-36F3, 123-MK93-EFTW-D3LG, 123-MK93-EALK-TGLD, 123-MK93-ELKK-DN6S, 123-MK93-E4D9-3A6T, 123-MK93-EMTW-LNME]

protected int getVoucherNumber(String voucherCode){ 
    int voucherNumberPos = voucherCode.length() - 12; 
    String voucherNumberHex = voucherCode.substring(voucherNumberPos, voucherNumberPos + 6); 
    int firstByte = getIntFromHexByte(voucherNumberHex.substring(0, 2), 0); 
    int secondByte = getIntFromHexByte(voucherNumberHex.substring(2, 4), 1); 
    int thirdByte = getIntFromHexByte(voucherNumberHex.substring(4, 6), 7); 
    return firstByte << 16 | secondByte << 8 | thirdByte; 
} 

private int getIntFromHexByte(String value, int offset){ 
    return (getIntFromHexNibble(value.charAt(0), offset) << 4) + getIntFromHexNibble(value.charAt(1), offset + 4); 
} 

private int getIntFromHexNibble(char value, int offset){ 
    int pos = getAlphabet().indexOf(value); 
    if (pos == -1) {// nothing found} 
    pos -= offset; 
    while (pos < 0) { 
    pos += 16; 
    } 
    return pos % 16; 
} 

这里是其试图验证共同的代码德

int voucherNumber = getVoucherNumber(kyList.get(4)); 

voucherNumber这种情况下的值是4即,从列表中的第四元素,在情况下,我通过这是不列表getVoucherNumber方法的一部分返回一个较高的值(比表计数值的任何值)。

之一,其困惑我最主要的事情是这两条线

int voucherNumberPos = voucherCode.length() - 12; 
String voucherNumberHex = voucherCode.substring(voucherNumberPos, voucherNumberPos + 6); 

按我的理解,他们首先移动了从这些客户提供的,但他们又没有使用检查前3位字符串的其余部分,但只是字符串的特定部分。

任何一个可以帮助我了解这个

+2

为什么被标记为java8?此代码示例中是否有关于Java 8的特定内容?我没有看到它,但也许我错过了它... – FrustratedWithFormsDesigner 2014-10-08 18:38:04

+0

@FrustratedWithFormsDesigner:没有任何与java-8相关的,我错误地标记它,谢谢纠正 – 2014-10-09 01:58:25

回答

5

看来你继承了一些写得不好的代码的责任。我们都在那里,所以我会尽力回答。我不太乐观,这个问题是针对本网站的主题,但它似乎并未被帮助中心禁止。为了保持主题不变,我将结束一些一般性建议,不仅限于问题的高度局部化的细节。

myList.get(4) 

数组在Java中是从零开始,所以这是123-MK93-E4D9-3A6T。你可能知道这一点,但从你的问题来看你并不清楚。

initial-alphabet : M9W6K3TENDGSFAL4 

我想这是什么在getIntFromHexNibble调用getAlphabet返回。所以代码中的字母数字字符应该是十六进制的,但对于数字使用非标准的16个字符。

protected int getVoucherNumber(String voucherCode){ 

忽略连字符和客户提供的前三位数字,代码是'MK93E4D93A6T'。十二个十六进制数字编码48位,但在Java中的int只有32位长,所以代码已被破坏。无论它做什么,它都不会返回代金券代码所代表的代金券号码。

int voucherNumberPos = voucherCode.length() - 12; 
String voucherNumberHex = voucherCode.substring(voucherNumberPos, voucherNumberPos + 6); 

这被设置voucherNumberHex到六个字符的长字符串,从voucherCode末端开始12,在这种情况下93-E4D。在编写代码时,似乎作者不希望调用者包含连字符。即使如此,意图似乎是忽略了一半的代金券代码。

int firstByte = getIntFromHexByte(voucherNumberHex.substring(0, 2), 0); 
int secondByte = getIntFromHexByte(voucherNumberHex.substring(2, 4), 1); 
int thirdByte = getIntFromHexByte(voucherNumberHex.substring(4, 6), 7); 

这看起来简单的在第一,但,参数01,并且7不偏移,在所有尽管参数的名称。它试图将每一对十六进制数字转换成一个字节,如果不是连字符,这将是明智的。现在有趣的部分:

private int getIntFromHexNibble(char value, int offset) { 
    int pos = getAlphabet().indexOf(value); 
    if (pos == -1) {// nothing found} 
     pos -= offset; 

     while (pos < 0) { 
      pos += 16; 
     } 
     return pos % 16; 
    } 

“找到”后的右大括号已被注释掉,所以您发布的代码实际上是不完整的。我要去假设有这​​么读

return pos; 
} 

所以基本思想是M变为0另一条线或两个,9变为1,依此类推通过调用indexOf。但是如果这个方法看到一个字符不在提供的字母表中,就像连字符一样,它使用所谓的offset来计算一个默认值(在这个例子中是14,如果我在脑子里做了数学计算),并且返回作为十六进制的半字节值。

最终的结果是,您将取回范围为0(含)至2^24(不含)的数字。但是这样的数字应该有2^24个可能的值,只有2^20个不同的值会被返回。因此,看起来像基数为32的十二位数字的代金券代码,其数值将会是天文数字,因此每个客户前缀内的代码数量限制在一百万以上。

一般建议:

  • 使用同行审查,以防止这样的代码进入 生产。
  • 使用单元测试来证明代码做的功能 名称说明。
  • 如果输入不是 ,那么使用异常提前失败。
+0

同行评审只有在他们不进入肚脐考试,这是他们随着时间的推移,几乎没有例外。配对是更好的海事组织 - 这是一个更好的平衡“锐化斧头”和“完成东西”比大多数同行评审。 一个大脑可以解决一个问题,两个可以很好地解决问题,三个只能稍微好一点,到了四个大脑的时候,你大多只是在浪费金钱和时间。 – Calphool 2014-10-08 20:45:47

+0

@JoeRounceville我同意让一个或两个以上的人审阅给定的代码往往是徒劳的。我的组织只为了知识转移或展示原型方法而做到这一点。同行评审与我们一样,是每个人的代码由其中一个或两个同行评审。 – gatkin 2014-10-08 21:03:38

+0

@gatkin:谢谢你的回复,不幸的是我不能改变这段代码:(。如果(pos == -1){}',这里有一个异常正在返回。我感到困惑的是关于凭证的部分代码被用于验证,因为代码没有获得完整的凭证代码,而只是其中的特定部分。你认为这背后有什么逻辑吗? – 2014-10-09 02:29:37