我是一名学生,我正在写关于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行的都应该被分割成单独的方法,但是也有例外。我想知道,这是其中一个例外吗?如果没有,那么将开关/case方法拆分为更小的方法的最佳方法是什么。
发布于 2016-05-03 11:31:45
你在编条件..。不一定属于一起的人。
你可以创造一个伟大的OOP设计..。在每个方法中仍然有大量的代码。
您可以遵循清洁代码规则,例如,避免任何包含比one 单一抽象级更多的方法;最终设计可能很糟糕,而且“不是OOP”(但我认为:这很难--如果您遵循所有干净的代码规则,就会自动创建更好的OOP设计)。
但是,要回答原来的问题(这实际上是一个糟糕的问题;因为它邀请了基于意见的答案,比如我的问题):上面的代码至少“一点也不干净”。实际上,我觉得这很可怕,把“更多”的东西塞进那些“更多”的案子里听起来太糟糕了。除此之外,您不会以这种方式使用枚举--这种“开关”应该使客户端代码不可见;相反,您将依赖于多态;只需告诉调用某个对象上的某个方法.
我已经练习了多年的清洁代码,并发现产生的代码是更好的阅读和维护。在“干净代码”中;好的,正如所述:您不会将多个switch语句放入一个方法中。每一个循环;和每一个破案.都会用自己的方法。
许多人认为这是疯狂的,但我发现它是真正“更好”的方法,在实践了许多个月到现在。它确实阻止了我创建像你的例子那样不可测试的代码。
然后回答你的第二个问题:这真的很难。一个人将不得不理解整个设计,然后,一片片,撕开它,并重构它的元素。但是,这当然要求您有一套完整的单元/功能测试(因此您可以看到您的更改并没有破坏整个过程)。因此,“改进”这类代码的通用方法是:
发布于 2016-05-03 11:39:43
示例代码就是:示例代码。这不是一个实用的软件,它只是一个教育工具,就像一个切线图。它的唯一目的是展示某件东西是如何工作的,而且通常它将以一些您不会将其放入生产代码中的特性为特色。
示例代码的一个典型特性是放弃封装,减少间接方向的数量,这样事情就更本地化了,您可以自上而下地阅读代码,就像一页文本。
这就是您在这里看到的:他们试图一步一步地演示代码,因此他们格式化代码的方式是,每一步都遵循代码中的另一步。
发布于 2016-05-03 12:20:35
Java最未充分使用的特性之一是向枚举中添加行为(例如方法)的可能性。因此,问问自己,你的例子中所需要的行为是否足够普遍,可以由枚举本身执行(全部还是部分)。
https://stackoverflow.com/questions/37002751
复制相似问题