我是一名学生,正在写一篇关于SSL/TLS和JSSE的论文。在oracle提供的实施示例中(可在此处找到:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#AppA)我找到了实施的例子:
public void doHandshake(SocketChannel socketChannel,
SSLEngine engine,
ByteBuffer myNetData,
ByteBuffer peerNetData) throws Exception {
// 2)
int appBufferSize = engine.getSession().getApplicationBufferSize();
// 3)
ByteBuffer myAppData = ByteBuffer.allocate(appBufferSize);
ByteBuffer peerAppData = ByteBuffer.allocate(appBufferSize);
// 4)
engine.beginHandshake();
SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();
// 5)
while (hs != SSLEngineResult.HandshakeStatus.FINISHED
&& hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) {
switch (hs) {
case NEED_UNWRAP:
// Receive handshaking data from peer
if (socketChannel.read(peerNetData) < 0) {
// The channel has reached end-of-stream
}
// Process incoming handshaking data
peerNetData.flip();
SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
peerNetData.compact();
hs = res.getHandshakeStatus();
// Check status
switch (res.getStatus()) {
case OK:
// Handle OK status
break;
// Handle other status: BUFFER_UNDERFLOW, BUFFER_OVERFLOW, CLOSED
//...
}
break;
case NEED_WRAP:
// Empty the local network packet buffer.
myNetData.clear();
// Generate handshaking data
res = engine.wrap(myAppData, myNetData);
hs = res.getHandshakeStatus();
// Check status
switch (res.getStatus()) {
case OK:
myNetData.flip();
// Send the handshaking data to peer
while (myNetData.hasRemaining()) {
socketChannel.write(myNetData);
}
break;
// Handle other status: BUFFER_OVERFLOW, BUFFER_UNDERFLOW, CLOSED
//...
}
break;
case NEED_TASK:
// Handle blocking tasks
break;
// Handle other status: // FINISHED or NOT_HANDSHAKING
//...
}
}
// Processes after handshaking
// ...
}
现在,根据我对正确的OOP体系结构的了解,这个方法不应该超过20行,但我发现Oracle会犯这样的基本体系结构错误是很奇怪的。任何超过20行的都应该被分割成不同的方法,但也有例外。我想知道,这是例外吗?如果没有,将switch/case方法拆分为更小的方法的最佳方法是什么。
你在拼凑术语。。。那不一定属于一起。
您可以创建一个伟大的OOP设计...并且在每个方法中仍然有很多代码。
您可以遵循干净的代码规则,例如,避免任何包含多个抽象级别的方法;最终的设计可能很糟糕,“不是OOP”(但我认为:这很难——如果你遵循所有干净的代码规则,你会自动创建更好的OOP设计)。
但是,要回答最初的问题(这实际上是一个糟糕的问题;因为它需要基于意见的答案,比如我的答案):上述代码至少“一点也不干净”。事实上,我觉得这很可怕,而将“更多”塞进enum案例的想法对我来说听起来非常糟糕。除此之外,您将不会以这种方式使用枚举-这种“开关”应该对html" target="_blank">客户端代码不可见;相反,你会依赖多态性;然后简单地告诉你在某个对象上调用某个方法。。。
到现在为止,我已经练习了多年干净的代码,发现生成的代码更易于阅读和维护。在“干净代码”中;如前所述:您不会在一个方法中放入多个switch语句。每个循环;而每一个破绽案例。。。将被放在自己的方法中。
许多人认为这很疯狂,但我发现这确实是“更好”的方法,在实践了几个月之后。它确实阻止了我创建像您的示例那样不可测试的代码。
回答你的第二个问题:这真的很难。人们必须理解整个设计,然后一点一点地把它拆开,重构它的元素。但是这当然需要你有一套完整的单元/功能测试(所以你要证明你的改变不会破坏整个事情)。因此,“改进”此类代码的通用方法是:
我有以下问题: 我已经为安全性创建了注释: 在我具有类之间的继承性的情况下,是否也有可能所有类都具有@Security注释来获得最具体的定义? 约西
在我的应用程序(这是一个Android游戏)中,我有一个方法可以检查玩家是否还活着,如果没有,运行一个动画,游戏就结束了。 根据玩家的输球方式,目前有3种不同的动画可用。 例如,它们可能从屏幕上掉下来,撞到一只鸟,或者被从天上掉下来的东西压扁。每一个都有不同的动画。 基本上,我正在做的是: 当玩家输球时,我设置了它发生的方法,例如,如果他们被鸟击中: 然后我通过在我的check Gameover(
我最近使用py魅力和sonarqube来审查我的代码。这两个工具都建议更新很多方法,例如,它们的主体中没有使用,而是使用装饰器。 我完全理解为什么,但我觉得它几乎毫无意义。关于性能,我不确定它会有那么大的帮助。此外,这些通常是被覆盖的django方法。我可以安全地使用那个装饰器吗?或者它毫无意义,不值得花时间更新?
问题内容: 我收到“ 查找错误” 错误- 调用静态java.text.DateFormat方法, 并且我不知道为什么在下面做这些事情不好/不建议这样做的原因。 问题答案: DateFormat不是线程安全的,这意味着它们维护状态的内部表示。如果多个线程同时访问同一实例,则在静态上下文中使用它们会产生一些非常奇怪的错误。 我的建议是使变量在使用变量的位置本地化,而不是使它们成为类的静态属性。初始化类
我写了一个关于梅琳达·格林的Buddhabrot方法的变体,用于可视化曼德尔布罗特集。这是: http://pastebin.com/RH6dD77F 为了制作一个动画,我渲染了数百张略有变化的单独图像。这种变化是生成函数的系数的变换,就好像它们是系数空间中的抽象向量一样。所有这些都在视频中产生了不可思议的结构... http://www.youtube.com/watch?v=S2uMAvL_5
一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。